Ngày nay, các nhà phát triển có nhiều khả năng đang làm việc trên một ứng dụng di động hoặc web. Python không có khả năng phát triển di động tích hợp, nhưng có những gói bạn có thể sử dụng để tạo ứng dụng di động, như Kivy, PyQt hoặc thậm chí là thư viện Toga của Beeware
Các thư viện này đều là những người chơi chính trong không gian di động Python. Tuy nhiên, có một số lợi ích bạn sẽ thấy nếu chọn tạo ứng dụng di động với Kivy. Ứng dụng của bạn không chỉ trông giống nhau trên tất cả các nền tảng mà còn không cần phải biên dịch mã của mình sau mỗi thay đổi. Hơn nữa, bạn sẽ có thể sử dụng cú pháp rõ ràng của Python để xây dựng các ứng dụng của mình
Trong hướng dẫn này, bạn sẽ học cách
- Làm việc với các vật dụng Kivy
- Bố trí giao diện người dùng
- Thêm sự kiện
- Sử dụng ngôn ngữ KV
- Tạo một ứng dụng máy tính
- Đóng gói ứng dụng của bạn cho iOS, Android, Windows và macOS
Hướng dẫn này giả định rằng bạn đã quen thuộc với lập trình hướng đối tượng. Nếu chưa, hãy xem Lập trình hướng đối tượng [OOP] trong Python 3
Bắt đầu nào
Tải xuống miễn phí. Nhận một chương mẫu từ Thủ thuật Python. Cuốn sách chỉ cho bạn các phương pháp hay nhất về Python với các ví dụ đơn giản mà bạn có thể áp dụng ngay lập tức để viết mã Pythonic + đẹp hơn
Hiểu về Kivy Framework
Kivy được phát hành lần đầu tiên vào đầu năm 2011. Khung Python đa nền tảng này có thể được triển khai cho Windows, Mac, Linux và Raspberry Pi. Nó hỗ trợ các sự kiện cảm ứng đa điểm ngoài các đầu vào bàn phím và chuột thông thường. Kivy thậm chí còn hỗ trợ tăng tốc GPU cho đồ họa của nó, vì chúng được xây dựng bằng OpenGL ES2. Dự án sử dụng giấy phép MIT, vì vậy bạn có thể sử dụng thư viện này cho phần mềm thương mại và miễn phí
Khi bạn tạo ứng dụng với Kivy, bạn đang tạo Giao diện người dùng tự nhiên hoặc NUI. Ý tưởng đằng sau Giao diện người dùng tự nhiên là người dùng có thể dễ dàng học cách sử dụng phần mềm của bạn mà không cần hướng dẫn
Kivy không cố gắng sử dụng các công cụ hoặc điều khiển gốc. Tất cả các vật dụng của nó được vẽ tùy chỉnh. Điều này có nghĩa là các ứng dụng Kivy sẽ giống nhau trên tất cả các nền tảng. Tuy nhiên, điều đó cũng có nghĩa là giao diện ứng dụng của bạn sẽ khác với ứng dụng gốc của người dùng. Đây có thể là một lợi ích hoặc một nhược điểm, tùy thuộc vào đối tượng của bạn
Loại bỏ các quảng cáoCài đặt Kivy
Kivy có nhiều phụ thuộc, vì vậy bạn nên cài đặt nó vào môi trường ảo Python. Bạn có thể sử dụng thư viện
$ python -m pip install kivy
5 tích hợp sẵn của Python hoặc gói $ python -m pip install kivy
6. Nếu bạn chưa từng sử dụng môi trường ảo Python trước đây, thì hãy xem Môi trường ảo Python. sơn lótĐây là cách bạn có thể tạo môi trường ảo Python
$ python3 -m venv my_kivy_project
Điều này sẽ sao chép tệp thực thi Python 3 của bạn vào một thư mục có tên là
$ python -m pip install kivy
7 và thêm một vài thư mục con khác vào thư mục đóĐể sử dụng môi trường ảo của bạn, bạn cần kích hoạt nó. Trên Mac và Linux, bạn có thể làm điều đó bằng cách thực hiện thao tác sau trong thư mục
$ python -m pip install kivy
7$ source bin/activate
Lệnh cho Windows cũng tương tự, nhưng vị trí của tập lệnh kích hoạt nằm trong thư mục
$ python -m pip install kivy
9 thay vì from kivy.app import App
from kivy.uix.label import Label
class MainApp[App]:
def build[self]:
label = Label[text='Hello from Kivy',
size_hint=[.5, .5],
pos_hint={'center_x': .5, 'center_y': .5}]
return label
if __name__ == '__main__':
app = MainApp[]
app.run[]
0Bây giờ bạn đã kích hoạt môi trường ảo Python, bạn có thể chạy
from kivy.app import App
from kivy.uix.label import Label
class MainApp[App]:
def build[self]:
label = Label[text='Hello from Kivy',
size_hint=[.5, .5],
pos_hint={'center_x': .5, 'center_y': .5}]
return label
if __name__ == '__main__':
app = MainApp[]
app.run[]
1 để cài đặt Kivy. Trên Linux và Mac, bạn sẽ chạy lệnh sau$ python -m pip install kivy
Trên Windows, cài đặt phức tạp hơn một chút. Kiểm tra tài liệu chính thức để biết cách cài đặt. [Người dùng Mac cũng có thể tải xuống tệp
from kivy.app import App
from kivy.uix.label import Label
class MainApp[App]:
def build[self]:
label = Label[text='Hello from Kivy',
size_hint=[.5, .5],
pos_hint={'center_x': .5, 'center_y': .5}]
return label
if __name__ == '__main__':
app = MainApp[]
app.run[]
2 và cài đặt Kivy theo cách đó. ]Nếu bạn gặp bất kỳ sự cố nào khi cài đặt Kivy trên nền tảng của mình, hãy xem trang tải xuống Kivy để biết thêm
Làm việc với Widget Kivy
Tiện ích là một điều khiển trên màn hình mà người dùng sẽ tương tác với. Tất cả các bộ công cụ giao diện người dùng đồ họa đều đi kèm với một bộ tiện ích. Một số tiện ích phổ biến mà bạn có thể đã sử dụng bao gồm các nút, hộp tổ hợp và tab. Kivy có nhiều tiện ích được tích hợp trong khuôn khổ của nó
Chạy chương trình “Xin chào, Kivy. " Chương trình
Để xem Kivy hoạt động như thế nào, hãy xem phần sau “Xin chào, Thế giới. " đăng kí
from kivy.app import App
from kivy.uix.label import Label
class MainApp[App]:
def build[self]:
label = Label[text='Hello from Kivy',
size_hint=[.5, .5],
pos_hint={'center_x': .5, 'center_y': .5}]
return label
if __name__ == '__main__':
app = MainApp[]
app.run[]
Mỗi ứng dụng Kivy cần phải phân lớp
from kivy.app import App
from kivy.uix.label import Label
class MainApp[App]:
def build[self]:
label = Label[text='Hello from Kivy',
size_hint=[.5, .5],
pos_hint={'center_x': .5, 'center_y': .5}]
return label
if __name__ == '__main__':
app = MainApp[]
app.run[]
3 và ghi đè lên from kivy.app import App
from kivy.uix.label import Label
class MainApp[App]:
def build[self]:
label = Label[text='Hello from Kivy',
size_hint=[.5, .5],
pos_hint={'center_x': .5, 'center_y': .5}]
return label
if __name__ == '__main__':
app = MainApp[]
app.run[]
4. Đây là nơi bạn sẽ đặt mã giao diện người dùng của mình hoặc thực hiện lệnh gọi đến các chức năng khác xác định mã giao diện người dùng của bạn. Trong trường hợp này, bạn tạo một tiện ích con from kivy.app import App
from kivy.uix.label import Label
class MainApp[App]:
def build[self]:
label = Label[text='Hello from Kivy',
size_hint=[.5, .5],
pos_hint={'center_x': .5, 'center_y': .5}]
return label
if __name__ == '__main__':
app = MainApp[]
app.run[]
5 và chuyển vào nó from kivy.app import App
from kivy.uix.label import Label
class MainApp[App]:
def build[self]:
label = Label[text='Hello from Kivy',
size_hint=[.5, .5],
pos_hint={'center_x': .5, 'center_y': .5}]
return label
if __name__ == '__main__':
app = MainApp[]
app.run[]
6, from kivy.app import App
from kivy.uix.label import Label
class MainApp[App]:
def build[self]:
label = Label[text='Hello from Kivy',
size_hint=[.5, .5],
pos_hint={'center_x': .5, 'center_y': .5}]
return label
if __name__ == '__main__':
app = MainApp[]
app.run[]
7 và from kivy.app import App
from kivy.uix.label import Label
class MainApp[App]:
def build[self]:
label = Label[text='Hello from Kivy',
size_hint=[.5, .5],
pos_hint={'center_x': .5, 'center_y': .5}]
return label
if __name__ == '__main__':
app = MainApp[]
app.run[]
8. Hai đối số cuối cùng này không bắt buộcfrom kivy.app import App
from kivy.uix.label import Label
class MainApp[App]:
def build[self]:
label = Label[text='Hello from Kivy',
size_hint=[.5, .5],
pos_hint={'center_x': .5, 'center_y': .5}]
return label
if __name__ == '__main__':
app = MainApp[]
app.run[]
7 cho Kivy biết tỷ lệ sử dụng khi tạo tiện ích. Phải mất hai số- Số đầu tiên là gợi ý kích thước
0 và đề cập đến chiều rộng của điều khiển[INFO ] [Logger ] Record log in /home/mdriscoll/.kivy/logs/kivy_19-06-07_2.txt [INFO ] [Kivy ] v1.11.0 [INFO ] [Kivy ] Installed at "/home/mdriscoll/code/test/lib/python3.6/site-packages/kivy/__init__.py" [INFO ] [Python ] v3.6.7 [default, Oct 22 2018, 11:32:17] [GCC 8.2.0] [INFO ] [Python ] Interpreter at "/home/mdriscoll/code/test/bin/python" [INFO ] [Factory ] 184 symbols loaded [INFO ] [Image ] Providers: img_tex, img_dds, img_sdl2, img_gif [img_pil, img_ffpyplayer ignored] [INFO ] [Text ] Provider: sdl2[['text_pango'] ignored] [INFO ] [Window ] Provider: sdl2[['window_egl_rpi'] ignored] [INFO ] [GL ] Using the "OpenGL" graphics system [INFO ] [GL ] Backend used [INFO ] [GL ] OpenGL version [INFO ] [GL ] OpenGL vendor [INFO ] [GL ] OpenGL renderer [INFO ] [GL ] OpenGL parsed version: 4, 6 [INFO ] [GL ] Shading version [INFO ] [GL ] Texture max size [INFO ] [GL ] Texture max units [INFO ] [Window ] auto add sdl2 input provider [INFO ] [Window ] virtual keyboard not allowed, single mode, not docked [INFO ] [Base ] Start application main loop [INFO ] [GL ] NPOT texture support is available
- Số thứ hai là gợi ý kích thước
1 và đề cập đến chiều cao của điều khiển[INFO ] [Logger ] Record log in /home/mdriscoll/.kivy/logs/kivy_19-06-07_2.txt [INFO ] [Kivy ] v1.11.0 [INFO ] [Kivy ] Installed at "/home/mdriscoll/code/test/lib/python3.6/site-packages/kivy/__init__.py" [INFO ] [Python ] v3.6.7 [default, Oct 22 2018, 11:32:17] [GCC 8.2.0] [INFO ] [Python ] Interpreter at "/home/mdriscoll/code/test/bin/python" [INFO ] [Factory ] 184 symbols loaded [INFO ] [Image ] Providers: img_tex, img_dds, img_sdl2, img_gif [img_pil, img_ffpyplayer ignored] [INFO ] [Text ] Provider: sdl2[['text_pango'] ignored] [INFO ] [Window ] Provider: sdl2[['window_egl_rpi'] ignored] [INFO ] [GL ] Using the "OpenGL" graphics system [INFO ] [GL ] Backend used [INFO ] [GL ] OpenGL version [INFO ] [GL ] OpenGL vendor [INFO ] [GL ] OpenGL renderer [INFO ] [GL ] OpenGL parsed version: 4, 6 [INFO ] [GL ] Shading version [INFO ] [GL ] Texture max size [INFO ] [GL ] Texture max units [INFO ] [Window ] auto add sdl2 input provider [INFO ] [Window ] virtual keyboard not allowed, single mode, not docked [INFO ] [Base ] Start application main loop [INFO ] [GL ] NPOT texture support is available
Cả hai số này có thể nằm trong khoảng từ 0 đến 1. Giá trị mặc định cho cả hai gợi ý là 1. Bạn cũng có thể sử dụng
from kivy.app import App
from kivy.uix.label import Label
class MainApp[App]:
def build[self]:
label = Label[text='Hello from Kivy',
size_hint=[.5, .5],
pos_hint={'center_x': .5, 'center_y': .5}]
return label
if __name__ == '__main__':
app = MainApp[]
app.run[]
8 để định vị tiện ích con. Trong khối mã ở trên, bạn yêu cầu Kivy căn giữa tiện ích trên trục x và yĐể làm cho ứng dụng chạy, bạn khởi tạo lớp
[INFO ] [Logger ] Record log in /home/mdriscoll/.kivy/logs/kivy_19-06-07_2.txt
[INFO ] [Kivy ] v1.11.0
[INFO ] [Kivy ] Installed at "/home/mdriscoll/code/test/lib/python3.6/site-packages/kivy/__init__.py"
[INFO ] [Python ] v3.6.7 [default, Oct 22 2018, 11:32:17]
[GCC 8.2.0]
[INFO ] [Python ] Interpreter at "/home/mdriscoll/code/test/bin/python"
[INFO ] [Factory ] 184 symbols loaded
[INFO ] [Image ] Providers: img_tex, img_dds, img_sdl2, img_gif [img_pil, img_ffpyplayer ignored]
[INFO ] [Text ] Provider: sdl2[['text_pango'] ignored]
[INFO ] [Window ] Provider: sdl2[['window_egl_rpi'] ignored]
[INFO ] [GL ] Using the "OpenGL" graphics system
[INFO ] [GL ] Backend used
[INFO ] [GL ] OpenGL version
[INFO ] [GL ] OpenGL vendor
[INFO ] [GL ] OpenGL renderer
[INFO ] [GL ] OpenGL parsed version: 4, 6
[INFO ] [GL ] Shading version
[INFO ] [GL ] Texture max size
[INFO ] [GL ] Texture max units
[INFO ] [Window ] auto add sdl2 input provider
[INFO ] [Window ] virtual keyboard not allowed, single mode, not docked
[INFO ] [Base ] Start application main loop
[INFO ] [GL ] NPOT texture support is available
3 của mình và sau đó gọi [INFO ] [Logger ] Record log in /home/mdriscoll/.kivy/logs/kivy_19-06-07_2.txt
[INFO ] [Kivy ] v1.11.0
[INFO ] [Kivy ] Installed at "/home/mdriscoll/code/test/lib/python3.6/site-packages/kivy/__init__.py"
[INFO ] [Python ] v3.6.7 [default, Oct 22 2018, 11:32:17]
[GCC 8.2.0]
[INFO ] [Python ] Interpreter at "/home/mdriscoll/code/test/bin/python"
[INFO ] [Factory ] 184 symbols loaded
[INFO ] [Image ] Providers: img_tex, img_dds, img_sdl2, img_gif [img_pil, img_ffpyplayer ignored]
[INFO ] [Text ] Provider: sdl2[['text_pango'] ignored]
[INFO ] [Window ] Provider: sdl2[['window_egl_rpi'] ignored]
[INFO ] [GL ] Using the "OpenGL" graphics system
[INFO ] [GL ] Backend used
[INFO ] [GL ] OpenGL version
[INFO ] [GL ] OpenGL vendor
[INFO ] [GL ] OpenGL renderer
[INFO ] [GL ] OpenGL parsed version: 4, 6
[INFO ] [GL ] Shading version
[INFO ] [GL ] Texture max size
[INFO ] [GL ] Texture max units
[INFO ] [Window ] auto add sdl2 input provider
[INFO ] [Window ] virtual keyboard not allowed, single mode, not docked
[INFO ] [Base ] Start application main loop
[INFO ] [GL ] NPOT texture support is available
4. Khi bạn làm như vậy, bạn sẽ thấy như sau trên màn hình của bạnKivy cũng xuất ra rất nhiều văn bản tới
[INFO ] [Logger ] Record log in /home/mdriscoll/.kivy/logs/kivy_19-06-07_2.txt
[INFO ] [Kivy ] v1.11.0
[INFO ] [Kivy ] Installed at "/home/mdriscoll/code/test/lib/python3.6/site-packages/kivy/__init__.py"
[INFO ] [Python ] v3.6.7 [default, Oct 22 2018, 11:32:17]
[GCC 8.2.0]
[INFO ] [Python ] Interpreter at "/home/mdriscoll/code/test/bin/python"
[INFO ] [Factory ] 184 symbols loaded
[INFO ] [Image ] Providers: img_tex, img_dds, img_sdl2, img_gif [img_pil, img_ffpyplayer ignored]
[INFO ] [Text ] Provider: sdl2[['text_pango'] ignored]
[INFO ] [Window ] Provider: sdl2[['window_egl_rpi'] ignored]
[INFO ] [GL ] Using the "OpenGL" graphics system
[INFO ] [GL ] Backend used
[INFO ] [GL ] OpenGL version
[INFO ] [GL ] OpenGL vendor
[INFO ] [GL ] OpenGL renderer
[INFO ] [GL ] OpenGL parsed version: 4, 6
[INFO ] [GL ] Shading version
[INFO ] [GL ] Texture max size
[INFO ] [GL ] Texture max units
[INFO ] [Window ] auto add sdl2 input provider
[INFO ] [Window ] virtual keyboard not allowed, single mode, not docked
[INFO ] [Base ] Start application main loop
[INFO ] [GL ] NPOT texture support is available
5[INFO ] [Logger ] Record log in /home/mdriscoll/.kivy/logs/kivy_19-06-07_2.txt
[INFO ] [Kivy ] v1.11.0
[INFO ] [Kivy ] Installed at "/home/mdriscoll/code/test/lib/python3.6/site-packages/kivy/__init__.py"
[INFO ] [Python ] v3.6.7 [default, Oct 22 2018, 11:32:17]
[GCC 8.2.0]
[INFO ] [Python ] Interpreter at "/home/mdriscoll/code/test/bin/python"
[INFO ] [Factory ] 184 symbols loaded
[INFO ] [Image ] Providers: img_tex, img_dds, img_sdl2, img_gif [img_pil, img_ffpyplayer ignored]
[INFO ] [Text ] Provider: sdl2[['text_pango'] ignored]
[INFO ] [Window ] Provider: sdl2[['window_egl_rpi'] ignored]
[INFO ] [GL ] Using the "OpenGL" graphics system
[INFO ] [GL ] Backend used
[INFO ] [GL ] OpenGL version
[INFO ] [GL ] OpenGL vendor
[INFO ] [GL ] OpenGL renderer
[INFO ] [GL ] OpenGL parsed version: 4, 6
[INFO ] [GL ] Shading version
[INFO ] [GL ] Texture max size
[INFO ] [GL ] Texture max units
[INFO ] [Window ] auto add sdl2 input provider
[INFO ] [Window ] virtual keyboard not allowed, single mode, not docked
[INFO ] [Base ] Start application main loop
[INFO ] [GL ] NPOT texture support is available
Điều này rất hữu ích để gỡ lỗi ứng dụng của bạn
Tiếp theo, bạn sẽ thử thêm tiện ích
[INFO ] [Logger ] Record log in /home/mdriscoll/.kivy/logs/kivy_19-06-07_2.txt
[INFO ] [Kivy ] v1.11.0
[INFO ] [Kivy ] Installed at "/home/mdriscoll/code/test/lib/python3.6/site-packages/kivy/__init__.py"
[INFO ] [Python ] v3.6.7 [default, Oct 22 2018, 11:32:17]
[GCC 8.2.0]
[INFO ] [Python ] Interpreter at "/home/mdriscoll/code/test/bin/python"
[INFO ] [Factory ] 184 symbols loaded
[INFO ] [Image ] Providers: img_tex, img_dds, img_sdl2, img_gif [img_pil, img_ffpyplayer ignored]
[INFO ] [Text ] Provider: sdl2[['text_pango'] ignored]
[INFO ] [Window ] Provider: sdl2[['window_egl_rpi'] ignored]
[INFO ] [GL ] Using the "OpenGL" graphics system
[INFO ] [GL ] Backend used
[INFO ] [GL ] OpenGL version
[INFO ] [GL ] OpenGL vendor
[INFO ] [GL ] OpenGL renderer
[INFO ] [GL ] OpenGL parsed version: 4, 6
[INFO ] [GL ] Shading version
[INFO ] [GL ] Texture max size
[INFO ] [GL ] Texture max units
[INFO ] [Window ] auto add sdl2 input provider
[INFO ] [Window ] virtual keyboard not allowed, single mode, not docked
[INFO ] [Base ] Start application main loop
[INFO ] [GL ] NPOT texture support is available
6 và xem tiện ích đó khác với tiện ích from kivy.app import App
from kivy.uix.label import Label
class MainApp[App]:
def build[self]:
label = Label[text='Hello from Kivy',
size_hint=[.5, .5],
pos_hint={'center_x': .5, 'center_y': .5}]
return label
if __name__ == '__main__':
app = MainApp[]
app.run[]
5 như thế nàoLoại bỏ các quảng cáoHiển thị một hình ảnh
Kivy có một vài tiện ích liên quan đến hình ảnh khác nhau để lựa chọn. Bạn có thể sử dụng
[INFO ] [Logger ] Record log in /home/mdriscoll/.kivy/logs/kivy_19-06-07_2.txt
[INFO ] [Kivy ] v1.11.0
[INFO ] [Kivy ] Installed at "/home/mdriscoll/code/test/lib/python3.6/site-packages/kivy/__init__.py"
[INFO ] [Python ] v3.6.7 [default, Oct 22 2018, 11:32:17]
[GCC 8.2.0]
[INFO ] [Python ] Interpreter at "/home/mdriscoll/code/test/bin/python"
[INFO ] [Factory ] 184 symbols loaded
[INFO ] [Image ] Providers: img_tex, img_dds, img_sdl2, img_gif [img_pil, img_ffpyplayer ignored]
[INFO ] [Text ] Provider: sdl2[['text_pango'] ignored]
[INFO ] [Window ] Provider: sdl2[['window_egl_rpi'] ignored]
[INFO ] [GL ] Using the "OpenGL" graphics system
[INFO ] [GL ] Backend used
[INFO ] [GL ] OpenGL version
[INFO ] [GL ] OpenGL vendor
[INFO ] [GL ] OpenGL renderer
[INFO ] [GL ] OpenGL parsed version: 4, 6
[INFO ] [GL ] Shading version
[INFO ] [GL ] Texture max size
[INFO ] [GL ] Texture max units
[INFO ] [Window ] auto add sdl2 input provider
[INFO ] [Window ] virtual keyboard not allowed, single mode, not docked
[INFO ] [Base ] Start application main loop
[INFO ] [GL ] NPOT texture support is available
6 để tải hình ảnh cục bộ từ ổ cứng của mình hoặc [INFO ] [Logger ] Record log in /home/mdriscoll/.kivy/logs/kivy_19-06-07_2.txt
[INFO ] [Kivy ] v1.11.0
[INFO ] [Kivy ] Installed at "/home/mdriscoll/code/test/lib/python3.6/site-packages/kivy/__init__.py"
[INFO ] [Python ] v3.6.7 [default, Oct 22 2018, 11:32:17]
[GCC 8.2.0]
[INFO ] [Python ] Interpreter at "/home/mdriscoll/code/test/bin/python"
[INFO ] [Factory ] 184 symbols loaded
[INFO ] [Image ] Providers: img_tex, img_dds, img_sdl2, img_gif [img_pil, img_ffpyplayer ignored]
[INFO ] [Text ] Provider: sdl2[['text_pango'] ignored]
[INFO ] [Window ] Provider: sdl2[['window_egl_rpi'] ignored]
[INFO ] [GL ] Using the "OpenGL" graphics system
[INFO ] [GL ] Backend used
[INFO ] [GL ] OpenGL version
[INFO ] [GL ] OpenGL vendor
[INFO ] [GL ] OpenGL renderer
[INFO ] [GL ] OpenGL parsed version: 4, 6
[INFO ] [GL ] Shading version
[INFO ] [GL ] Texture max size
[INFO ] [GL ] Texture max units
[INFO ] [Window ] auto add sdl2 input provider
[INFO ] [Window ] virtual keyboard not allowed, single mode, not docked
[INFO ] [Base ] Start application main loop
[INFO ] [GL ] NPOT texture support is available
9 để tải hình ảnh từ URL. Đối với ví dụ này, bạn sẽ gắn bó với lớp [INFO ] [Logger ] Record log in /home/mdriscoll/.kivy/logs/kivy_19-06-07_2.txt
[INFO ] [Kivy ] v1.11.0
[INFO ] [Kivy ] Installed at "/home/mdriscoll/code/test/lib/python3.6/site-packages/kivy/__init__.py"
[INFO ] [Python ] v3.6.7 [default, Oct 22 2018, 11:32:17]
[GCC 8.2.0]
[INFO ] [Python ] Interpreter at "/home/mdriscoll/code/test/bin/python"
[INFO ] [Factory ] 184 symbols loaded
[INFO ] [Image ] Providers: img_tex, img_dds, img_sdl2, img_gif [img_pil, img_ffpyplayer ignored]
[INFO ] [Text ] Provider: sdl2[['text_pango'] ignored]
[INFO ] [Window ] Provider: sdl2[['window_egl_rpi'] ignored]
[INFO ] [GL ] Using the "OpenGL" graphics system
[INFO ] [GL ] Backend used
[INFO ] [GL ] OpenGL version
[INFO ] [GL ] OpenGL vendor
[INFO ] [GL ] OpenGL renderer
[INFO ] [GL ] OpenGL parsed version: 4, 6
[INFO ] [GL ] Shading version
[INFO ] [GL ] Texture max size
[INFO ] [GL ] Texture max units
[INFO ] [Window ] auto add sdl2 input provider
[INFO ] [Window ] virtual keyboard not allowed, single mode, not docked
[INFO ] [Base ] Start application main loop
[INFO ] [GL ] NPOT texture support is available
6 tiêu chuẩnfrom kivy.app import App
from kivy.uix.image import Image
class MainApp[App]:
def build[self]:
img = Image[source='/path/to/real_python.png',
size_hint=[1, .5],
pos_hint={'center_x':.5, 'center_y':.5}]
return img
if __name__ == '__main__':
app = MainApp[]
app.run[]
Trong mã này, bạn nhập
[INFO ] [Logger ] Record log in /home/mdriscoll/.kivy/logs/kivy_19-06-07_2.txt
[INFO ] [Kivy ] v1.11.0
[INFO ] [Kivy ] Installed at "/home/mdriscoll/code/test/lib/python3.6/site-packages/kivy/__init__.py"
[INFO ] [Python ] v3.6.7 [default, Oct 22 2018, 11:32:17]
[GCC 8.2.0]
[INFO ] [Python ] Interpreter at "/home/mdriscoll/code/test/bin/python"
[INFO ] [Factory ] 184 symbols loaded
[INFO ] [Image ] Providers: img_tex, img_dds, img_sdl2, img_gif [img_pil, img_ffpyplayer ignored]
[INFO ] [Text ] Provider: sdl2[['text_pango'] ignored]
[INFO ] [Window ] Provider: sdl2[['window_egl_rpi'] ignored]
[INFO ] [GL ] Using the "OpenGL" graphics system
[INFO ] [GL ] Backend used
[INFO ] [GL ] OpenGL version
[INFO ] [GL ] OpenGL vendor
[INFO ] [GL ] OpenGL renderer
[INFO ] [GL ] OpenGL parsed version: 4, 6
[INFO ] [GL ] Shading version
[INFO ] [GL ] Texture max size
[INFO ] [GL ] Texture max units
[INFO ] [Window ] auto add sdl2 input provider
[INFO ] [Window ] virtual keyboard not allowed, single mode, not docked
[INFO ] [Base ] Start application main loop
[INFO ] [GL ] NPOT texture support is available
6 từ gói phụ from kivy.app import App
from kivy.uix.image import Image
class MainApp[App]:
def build[self]:
img = Image[source='/path/to/real_python.png',
size_hint=[1, .5],
pos_hint={'center_x':.5, 'center_y':.5}]
return img
if __name__ == '__main__':
app = MainApp[]
app.run[]
2. Lớp [INFO ] [Logger ] Record log in /home/mdriscoll/.kivy/logs/kivy_19-06-07_2.txt
[INFO ] [Kivy ] v1.11.0
[INFO ] [Kivy ] Installed at "/home/mdriscoll/code/test/lib/python3.6/site-packages/kivy/__init__.py"
[INFO ] [Python ] v3.6.7 [default, Oct 22 2018, 11:32:17]
[GCC 8.2.0]
[INFO ] [Python ] Interpreter at "/home/mdriscoll/code/test/bin/python"
[INFO ] [Factory ] 184 symbols loaded
[INFO ] [Image ] Providers: img_tex, img_dds, img_sdl2, img_gif [img_pil, img_ffpyplayer ignored]
[INFO ] [Text ] Provider: sdl2[['text_pango'] ignored]
[INFO ] [Window ] Provider: sdl2[['window_egl_rpi'] ignored]
[INFO ] [GL ] Using the "OpenGL" graphics system
[INFO ] [GL ] Backend used
[INFO ] [GL ] OpenGL version
[INFO ] [GL ] OpenGL vendor
[INFO ] [GL ] OpenGL renderer
[INFO ] [GL ] OpenGL parsed version: 4, 6
[INFO ] [GL ] Shading version
[INFO ] [GL ] Texture max size
[INFO ] [GL ] Texture max units
[INFO ] [Window ] auto add sdl2 input provider
[INFO ] [Window ] virtual keyboard not allowed, single mode, not docked
[INFO ] [Base ] Start application main loop
[INFO ] [GL ] NPOT texture support is available
6 có rất nhiều tham số khác nhau, nhưng tham số mà bạn muốn sử dụng là from kivy.app import App
from kivy.uix.image import Image
class MainApp[App]:
def build[self]:
img = Image[source='/path/to/real_python.png',
size_hint=[1, .5],
pos_hint={'center_x':.5, 'center_y':.5}]
return img
if __name__ == '__main__':
app = MainApp[]
app.run[]
4. Điều này cho Kivy biết hình ảnh nào sẽ tải. Tại đây, bạn chuyển một đường dẫn đủ điều kiện tới hình ảnh. Phần còn lại của mã giống như những gì bạn đã thấy trong ví dụ trướcKhi bạn chạy mã này, bạn sẽ thấy một cái gì đó như sau
Văn bản từ ví dụ trước đã được thay thế bằng một hình ảnh
Bây giờ bạn sẽ học cách thêm và sắp xếp nhiều widget trong ứng dụng của mình
Bố trí giao diện người dùng
Mỗi khung GUI mà bạn sử dụng có phương pháp sắp xếp các widget riêng. Ví dụ: trong wxPython, bạn sẽ sử dụng bộ định cỡ, trong khi ở Tkinter, bạn sử dụng trình quản lý bố cục hoặc hình học. Với Kivy, bạn sẽ sử dụng Bố cục. Có một số loại Bố cục khác nhau mà bạn có thể sử dụng. Dưới đây là một số trong những cái phổ biến nhất
5from kivy.app import App from kivy.uix.image import Image class MainApp[App]: def build[self]: img = Image[source='/path/to/real_python.png', size_hint=[1, .5], pos_hint={'center_x':.5, 'center_y':.5}] return img if __name__ == '__main__': app = MainApp[] app.run[]
6from kivy.app import App from kivy.uix.image import Image class MainApp[App]: def build[self]: img = Image[source='/path/to/real_python.png', size_hint=[1, .5], pos_hint={'center_x':.5, 'center_y':.5}] return img if __name__ == '__main__': app = MainApp[] app.run[]
7from kivy.app import App from kivy.uix.image import Image class MainApp[App]: def build[self]: img = Image[source='/path/to/real_python.png', size_hint=[1, .5], pos_hint={'center_x':.5, 'center_y':.5}] return img if __name__ == '__main__': app = MainApp[] app.run[]
Bạn có thể tìm kiếm tài liệu của Kivy để biết danh sách đầy đủ các Bố cục có sẵn. Bạn cũng có thể xem trong
from kivy.app import App
from kivy.uix.image import Image
class MainApp[App]:
def build[self]:
img = Image[source='/path/to/real_python.png',
size_hint=[1, .5],
pos_hint={'center_x':.5, 'center_y':.5}]
return img
if __name__ == '__main__':
app = MainApp[]
app.run[]
8 để biết mã nguồn thực tếHãy dùng thử
from kivy.app import App
from kivy.uix.image import Image
class MainApp[App]:
def build[self]:
img = Image[source='/path/to/real_python.png',
size_hint=[1, .5],
pos_hint={'center_x':.5, 'center_y':.5}]
return img
if __name__ == '__main__':
app = MainApp[]
app.run[]
5 với mã nàyimport kivy
import random
from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
red = [1,0,0,1]
green = [0,1,0,1]
blue = [0,0,1,1]
purple = [1,0,1,1]
class HBoxLayoutExample[App]:
def build[self]:
layout = BoxLayout[padding=10]
colors = [red, green, blue, purple]
for i in range[5]:
btn = Button[text="Button #%s" % [i+1],
background_color=random.choice[colors]
]
layout.add_widget[btn]
return layout
if __name__ == "__main__":
app = HBoxLayoutExample[]
app.run[]
Tại đây, bạn nhập
from kivy.app import App
from kivy.uix.image import Image
class MainApp[App]:
def build[self]:
img = Image[source='/path/to/real_python.png',
size_hint=[1, .5],
pos_hint={'center_x':.5, 'center_y':.5}]
return img
if __name__ == '__main__':
app = MainApp[]
app.run[]
5 từ import kivy
import random
from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
red = [1,0,0,1]
green = [0,1,0,1]
blue = [0,0,1,1]
purple = [1,0,1,1]
class HBoxLayoutExample[App]:
def build[self]:
layout = BoxLayout[padding=10]
colors = [red, green, blue, purple]
for i in range[5]:
btn = Button[text="Button #%s" % [i+1],
background_color=random.choice[colors]
]
layout.add_widget[btn]
return layout
if __name__ == "__main__":
app = HBoxLayoutExample[]
app.run[]
1 và khởi tạo nó. Sau đó, bạn tạo một danh sách các màu, chính chúng là danh sách các màu Đỏ-Xanh lam-Xanh lá cây [RGB]. Cuối cùng, bạn lặp lại một import kivy
import random
from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
red = [1,0,0,1]
green = [0,1,0,1]
blue = [0,0,1,1]
purple = [1,0,1,1]
class HBoxLayoutExample[App]:
def build[self]:
layout = BoxLayout[padding=10]
colors = [red, green, blue, purple]
for i in range[5]:
btn = Button[text="Button #%s" % [i+1],
background_color=random.choice[colors]
]
layout.add_widget[btn]
return layout
if __name__ == "__main__":
app = HBoxLayoutExample[]
app.run[]
2 của 5, tạo một nút import kivy
import random
from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
red = [1,0,0,1]
green = [0,1,0,1]
blue = [0,0,1,1]
purple = [1,0,1,1]
class HBoxLayoutExample[App]:
def build[self]:
layout = BoxLayout[padding=10]
colors = [red, green, blue, purple]
for i in range[5]:
btn = Button[text="Button #%s" % [i+1],
background_color=random.choice[colors]
]
layout.add_widget[btn]
return layout
if __name__ == "__main__":
app = HBoxLayoutExample[]
app.run[]
3 cho mỗi lần lặp lại. Để khiến mọi thứ thú vị hơn một chút, bạn đặt import kivy
import random
from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
red = [1,0,0,1]
green = [0,1,0,1]
blue = [0,0,1,1]
purple = [1,0,1,1]
class HBoxLayoutExample[App]:
def build[self]:
layout = BoxLayout[padding=10]
colors = [red, green, blue, purple]
for i in range[5]:
btn = Button[text="Button #%s" % [i+1],
background_color=random.choice[colors]
]
layout.add_widget[btn]
return layout
if __name__ == "__main__":
app = HBoxLayoutExample[]
app.run[]
4 của nút thành màu ngẫu nhiên. Sau đó, bạn thêm nút vào bố cục của mình bằng import kivy
import random
from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
red = [1,0,0,1]
green = [0,1,0,1]
blue = [0,0,1,1]
purple = [1,0,1,1]
class HBoxLayoutExample[App]:
def build[self]:
layout = BoxLayout[padding=10]
colors = [red, green, blue, purple]
for i in range[5]:
btn = Button[text="Button #%s" % [i+1],
background_color=random.choice[colors]
]
layout.add_widget[btn]
return layout
if __name__ == "__main__":
app = HBoxLayoutExample[]
app.run[]
5Khi bạn chạy mã này, bạn sẽ thấy một cái gì đó như thế này
Có 5 nút được tô màu ngẫu nhiên, một nút cho mỗi lần lặp của vòng lặp
import kivy
import random
from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
red = [1,0,0,1]
green = [0,1,0,1]
blue = [0,0,1,1]
purple = [1,0,1,1]
class HBoxLayoutExample[App]:
def build[self]:
layout = BoxLayout[padding=10]
colors = [red, green, blue, purple]
for i in range[5]:
btn = Button[text="Button #%s" % [i+1],
background_color=random.choice[colors]
]
layout.add_widget[btn]
return layout
if __name__ == "__main__":
app = HBoxLayoutExample[]
app.run[]
6 của bạnKhi bạn tạo bố cục, có một vài đối số bạn nên biết
7. Bạn có thể chỉ địnhimport kivy import random from kivy.app import App from kivy.uix.button import Button from kivy.uix.boxlayout import BoxLayout red = [1,0,0,1] green = [0,1,0,1] blue = [0,0,1,1] purple = [1,0,1,1] class HBoxLayoutExample[App]: def build[self]: layout = BoxLayout[padding=10] colors = [red, green, blue, purple] for i in range[5]: btn = Button[text="Button #%s" % [i+1], background_color=random.choice[colors] ] layout.add_widget[btn] return layout if __name__ == "__main__": app = HBoxLayoutExample[] app.run[]
7 bằng pixel giữa bố cục và phần tử con của nó theo một trong ba cáchimport kivy import random from kivy.app import App from kivy.uix.button import Button from kivy.uix.boxlayout import BoxLayout red = [1,0,0,1] green = [0,1,0,1] blue = [0,0,1,1] purple = [1,0,1,1] class HBoxLayoutExample[App]: def build[self]: layout = BoxLayout[padding=10] colors = [red, green, blue, purple] for i in range[5]: btn = Button[text="Button #%s" % [i+1], background_color=random.choice[colors] ] layout.add_widget[btn] return layout if __name__ == "__main__": app = HBoxLayoutExample[] app.run[]
- Một danh sách bốn đối số. [
9,import kivy import random from kivy.app import App from kivy.uix.button import Button from kivy.uix.boxlayout import BoxLayout red = [1,0,0,1] green = [0,1,0,1] blue = [0,0,1,1] purple = [1,0,1,1] class HBoxLayoutExample[App]: def build[self]: layout = BoxLayout[padding=10] colors = [red, green, blue, purple] for i in range[5]: btn = Button[text="Button #%s" % [i+1], background_color=random.choice[colors] ] layout.add_widget[btn] return layout if __name__ == "__main__": app = HBoxLayoutExample[] app.run[]
0,from kivy.app import App from kivy.uix.button import Button class MainApp[App]: def build[self]: button = Button[text='Hello from Kivy', size_hint=[.5, .5], pos_hint={'center_x': .5, 'center_y': .5}] button.bind[on_press=self.on_press_button] return button def on_press_button[self, instance]: print['You pressed the button!'] if __name__ == '__main__': app = MainApp[] app.run[]
1,from kivy.app import App from kivy.uix.button import Button class MainApp[App]: def build[self]: button = Button[text='Hello from Kivy', size_hint=[.5, .5], pos_hint={'center_x': .5, 'center_y': .5}] button.bind[on_press=self.on_press_button] return button def on_press_button[self, instance]: print['You pressed the button!'] if __name__ == '__main__': app = MainApp[] app.run[]
2]from kivy.app import App from kivy.uix.button import Button class MainApp[App]: def build[self]: button = Button[text='Hello from Kivy', size_hint=[.5, .5], pos_hint={'center_x': .5, 'center_y': .5}] button.bind[on_press=self.on_press_button] return button def on_press_button[self, instance]: print['You pressed the button!'] if __name__ == '__main__': app = MainApp[] app.run[]
- Một danh sách hai đối số. [
3,from kivy.app import App from kivy.uix.button import Button class MainApp[App]: def build[self]: button = Button[text='Hello from Kivy', size_hint=[.5, .5], pos_hint={'center_x': .5, 'center_y': .5}] button.bind[on_press=self.on_press_button] return button def on_press_button[self, instance]: print['You pressed the button!'] if __name__ == '__main__': app = MainApp[] app.run[]
4]from kivy.app import App from kivy.uix.button import Button class MainApp[App]: def build[self]: button = Button[text='Hello from Kivy', size_hint=[.5, .5], pos_hint={'center_x': .5, 'center_y': .5}] button.bind[on_press=self.on_press_button] return button def on_press_button[self, instance]: print['You pressed the button!'] if __name__ == '__main__': app = MainApp[] app.run[]
- Một đối số duy nhất.
5from kivy.app import App from kivy.uix.button import Button class MainApp[App]: def build[self]: button = Button[text='Hello from Kivy', size_hint=[.5, .5], pos_hint={'center_x': .5, 'center_y': .5}] button.bind[on_press=self.on_press_button] return button def on_press_button[self, instance]: print['You pressed the button!'] if __name__ == '__main__': app = MainApp[] app.run[]
- Một danh sách bốn đối số. [
6. Bạn có thể thêm khoảng cách giữa các tiện ích con với đối số nàyfrom kivy.app import App from kivy.uix.button import Button class MainApp[App]: def build[self]: button = Button[text='Hello from Kivy', size_hint=[.5, .5], pos_hint={'center_x': .5, 'center_y': .5}] button.bind[on_press=self.on_press_button] return button def on_press_button[self, instance]: print['You pressed the button!'] if __name__ == '__main__': app = MainApp[] app.run[]
7. Bạn có thể thay đổifrom kivy.app import App from kivy.uix.button import Button class MainApp[App]: def build[self]: button = Button[text='Hello from Kivy', size_hint=[.5, .5], pos_hint={'center_x': .5, 'center_y': .5}] button.bind[on_press=self.on_press_button] return button def on_press_button[self, instance]: print['You pressed the button!'] if __name__ == '__main__': app = MainApp[] app.run[]
7 mặc định củafrom kivy.app import App from kivy.uix.button import Button class MainApp[App]: def build[self]: button = Button[text='Hello from Kivy', size_hint=[.5, .5], pos_hint={'center_x': .5, 'center_y': .5}] button.bind[on_press=self.on_press_button] return button def on_press_button[self, instance]: print['You pressed the button!'] if __name__ == '__main__': app = MainApp[] app.run[]
5 từ ngang sang dọcfrom kivy.app import App from kivy.uix.image import Image class MainApp[App]: def build[self]: img = Image[source='/path/to/real_python.png', size_hint=[1, .5], pos_hint={'center_x':.5, 'center_y':.5}] return img if __name__ == '__main__': app = MainApp[] app.run[]
Thêm sự kiện
Giống như hầu hết các bộ công cụ GUI, Kivy chủ yếu dựa trên sự kiện. Khung phản hồi với các lần nhấn phím, sự kiện chuột và sự kiện chạm của người dùng. Kivy có khái niệm về Đồng hồ mà bạn có thể sử dụng để lên lịch các cuộc gọi chức năng trong một thời gian trong tương lai
Kivy cũng có khái niệm về
from kivy.app import App
from kivy.uix.button import Button
class ButtonApp[App]:
def build[self]:
return Button[]
def on_press_button[self]:
print['You pressed the button!']
if __name__ == '__main__':
app = ButtonApp[]
app.run[]
0, hoạt động với. Thuộc tính giúp bạn kiểm tra xác thực. Chúng cũng cho phép bạn kích hoạt các sự kiện bất cứ khi nào một tiện ích thay đổi kích thước hoặc vị trí của nóHãy thêm một sự kiện nút vào mã nút của bạn từ trước đó
from kivy.app import App
from kivy.uix.button import Button
class MainApp[App]:
def build[self]:
button = Button[text='Hello from Kivy',
size_hint=[.5, .5],
pos_hint={'center_x': .5, 'center_y': .5}]
button.bind[on_press=self.on_press_button]
return button
def on_press_button[self, instance]:
print['You pressed the button!']
if __name__ == '__main__':
app = MainApp[]
app.run[]
Trong mã này, bạn gọi
from kivy.app import App
from kivy.uix.button import Button
class ButtonApp[App]:
def build[self]:
return Button[]
def on_press_button[self]:
print['You pressed the button!']
if __name__ == '__main__':
app = ButtonApp[]
app.run[]
2 và liên kết sự kiện from kivy.app import App
from kivy.uix.button import Button
class ButtonApp[App]:
def build[self]:
return Button[]
def on_press_button[self]:
print['You pressed the button!']
if __name__ == '__main__':
app = ButtonApp[]
app.run[]
3 với from kivy.app import App
from kivy.uix.button import Button
class ButtonApp[App]:
def build[self]:
return Button[]
def on_press_button[self]:
print['You pressed the button!']
if __name__ == '__main__':
app = ButtonApp[]
app.run[]
4. Phương thức này ngầm nhận widget from kivy.app import App
from kivy.uix.button import Button
class ButtonApp[App]:
def build[self]:
return Button[]
def on_press_button[self]:
print['You pressed the button!']
if __name__ == '__main__':
app = ButtonApp[]
app.run[]
5, chính là đối tượng from kivy.app import App
from kivy.uix.button import Button
class ButtonApp[App]:
def build[self]:
return Button[]
def on_press_button[self]:
print['You pressed the button!']
if __name__ == '__main__':
app = ButtonApp[]
app.run[]
6. Cuối cùng, một tin nhắn sẽ được in tới [INFO ] [Logger ] Record log in /home/mdriscoll/.kivy/logs/kivy_19-06-07_2.txt
[INFO ] [Kivy ] v1.11.0
[INFO ] [Kivy ] Installed at "/home/mdriscoll/code/test/lib/python3.6/site-packages/kivy/__init__.py"
[INFO ] [Python ] v3.6.7 [default, Oct 22 2018, 11:32:17]
[GCC 8.2.0]
[INFO ] [Python ] Interpreter at "/home/mdriscoll/code/test/bin/python"
[INFO ] [Factory ] 184 symbols loaded
[INFO ] [Image ] Providers: img_tex, img_dds, img_sdl2, img_gif [img_pil, img_ffpyplayer ignored]
[INFO ] [Text ] Provider: sdl2[['text_pango'] ignored]
[INFO ] [Window ] Provider: sdl2[['window_egl_rpi'] ignored]
[INFO ] [GL ] Using the "OpenGL" graphics system
[INFO ] [GL ] Backend used
[INFO ] [GL ] OpenGL version
[INFO ] [GL ] OpenGL vendor
[INFO ] [GL ] OpenGL renderer
[INFO ] [GL ] OpenGL parsed version: 4, 6
[INFO ] [GL ] Shading version
[INFO ] [GL ] Texture max size
[INFO ] [GL ] Texture max units
[INFO ] [Window ] auto add sdl2 input provider
[INFO ] [Window ] virtual keyboard not allowed, single mode, not docked
[INFO ] [Base ] Start application main loop
[INFO ] [GL ] NPOT texture support is available
5 bất cứ khi nào người dùng nhấn nút của bạnSử dụng ngôn ngữ KV
Kivy cũng cung cấp một ngôn ngữ thiết kế gọi là KV mà bạn có thể sử dụng với các ứng dụng Kivy của mình. Ngôn ngữ KV cho phép bạn tách thiết kế giao diện của mình khỏi logic của ứng dụng. Điều này tuân theo nguyên tắc phân tách mối quan tâm và là một phần của mẫu kiến trúc Model-View-Controller. Bạn có thể cập nhật ví dụ trước để sử dụng ngôn ngữ KV
from kivy.app import App
from kivy.uix.button import Button
class ButtonApp[App]:
def build[self]:
return Button[]
def on_press_button[self]:
print['You pressed the button!']
if __name__ == '__main__':
app = ButtonApp[]
app.run[]
Thoạt nhìn, mã này có thể trông hơi kỳ quặc vì nó tạo một
from kivy.app import App
from kivy.uix.button import Button
class ButtonApp[App]:
def build[self]:
return Button[]
def on_press_button[self]:
print['You pressed the button!']
if __name__ == '__main__':
app = ButtonApp[]
app.run[]
8 mà không thiết lập bất kỳ thuộc tính nào của nó hoặc ràng buộc nó với bất kỳ sự kiện nào. Điều đang xảy ra ở đây là Kivy sẽ tự động tìm kiếm một tệp có cùng tên với lớp ở dạng chữ thường, không có phần from kivy.app import App
from kivy.uix.label import Label
class MainApp[App]:
def build[self]:
label = Label[text='Hello from Kivy',
size_hint=[.5, .5],
pos_hint={'center_x': .5, 'center_y': .5}]
return label
if __name__ == '__main__':
app = MainApp[]
app.run[]
3 của tên lớpTrong trường hợp này, tên lớp là
1:
2 text: 'Press me'
3 size_hint: [.5, .5]
4 pos_hint: {'center_x': .5, 'center_y': .5}
5 on_press: app.on_press_button[]
0, vì vậy Kivy sẽ tìm tệp có tên 1:
2 text: 'Press me'
3 size_hint: [.5, .5]
4 pos_hint: {'center_x': .5, 'center_y': .5}
5 on_press: app.on_press_button[]
1. Nếu tệp đó tồn tại và được định dạng đúng thì Kivy sẽ sử dụng tệp đó để tải lên giao diện người dùng. Hãy tiếp tục và tạo tệp này và thêm đoạn mã sau 1:
2 text: 'Press me'
3 size_hint: [.5, .5]
4 pos_hint: {'center_x': .5, 'center_y': .5}
5 on_press: app.on_press_button[]
Đây là những gì mỗi dòng làm
- Dòng 1 khớp với lệnh gọi
8 trong mã Python của bạn. Nó yêu cầu Kivy xem xét đối tượng được khởi tạo để biết định nghĩa nútfrom kivy.app import App from kivy.uix.button import Button class ButtonApp[App]: def build[self]: return Button[] def on_press_button[self]: print['You pressed the button!'] if __name__ == '__main__': app = ButtonApp[] app.run[]
- Dòng 2 đặt
6 của nútfrom kivy.app import App from kivy.uix.label import Label class MainApp[App]: def build[self]: label = Label[text='Hello from Kivy', size_hint=[.5, .5], pos_hint={'center_x': .5, 'center_y': .5}] return label if __name__ == '__main__': app = MainApp[] app.run[]
- Dòng 3 đặt chiều rộng và chiều cao với
7from kivy.app import App from kivy.uix.label import Label class MainApp[App]: def build[self]: label = Label[text='Hello from Kivy', size_hint=[.5, .5], pos_hint={'center_x': .5, 'center_y': .5}] return label if __name__ == '__main__': app = MainApp[] app.run[]
- Dòng 4 đặt vị trí của nút bằng
8from kivy.app import App from kivy.uix.label import Label class MainApp[App]: def build[self]: label = Label[text='Hello from Kivy', size_hint=[.5, .5], pos_hint={'center_x': .5, 'center_y': .5}] return label if __name__ == '__main__': app = MainApp[] app.run[]
- Dòng 5 đặt trình xử lý sự kiện
3. Để báo cho Kivy biết nơi xử lý sự kiện, bạn sử dụngfrom kivy.app import App from kivy.uix.button import Button class ButtonApp[App]: def build[self]: return Button[] def on_press_button[self]: print['You pressed the button!'] if __name__ == '__main__': app = ButtonApp[] app.run[]
7. Ở đây, Kivy biết sẽ tìm trong lớp1: 2 text: 'Press me' 3 size_hint: [.5, .5] 4 pos_hint: {'center_x': .5, 'center_y': .5} 5 on_press: app.on_press_button[]
8 một phương thức có tên là1: 2 text: 'Press me' 3 size_hint: [.5, .5] 4 pos_hint: {'center_x': .5, 'center_y': .5} 5 on_press: app.on_press_button[]
91: 2 text: 'Press me' 3 size_hint: [.5, .5] 4 pos_hint: {'center_x': .5, 'center_y': .5} 5 on_press: app.on_press_button[]
Bạn có thể thiết lập tất cả các vật dụng và bố cục của mình bên trong một hoặc nhiều tệp ngôn ngữ KV. Ngôn ngữ KV cũng hỗ trợ nhập các mô-đun Python trong KV, tạo các lớp động, v.v. Để biết chi tiết đầy đủ, hãy xem hướng dẫn của Kivy về Ngôn ngữ KV
Bây giờ bạn đã sẵn sàng để tạo một ứng dụng thực sự
Tạo ứng dụng Kivy
Một trong những cách tốt nhất để học một kỹ năng mới là tạo ra thứ gì đó hữu ích. Với ý nghĩ đó, bạn sẽ sử dụng Kivy để xây dựng một máy tính hỗ trợ các hoạt động sau
- Phép cộng
- phép trừ
- Phép nhân
- Phân công
Đối với ứng dụng này, bạn sẽ cần một loạt nút theo kiểu bố cục nào đó. Bạn cũng sẽ cần một hộp ở đầu ứng dụng của mình để hiển thị các phương trình và kết quả của chúng. Đây là một bản phác thảo của máy tính của bạn
Bây giờ bạn đã có mục tiêu cho giao diện người dùng, bạn có thể tiếp tục và viết mã
$ source bin/activate
0Đây là cách mã máy tính của bạn hoạt động
- Trong các dòng 8 đến 10, bạn tạo một danh sách
00 và một vài giá trị tiện dụng,$ source bin/activate
01 và$ source bin/activate
02, mà bạn sẽ sử dụng sau này$ source bin/activate
- Trong dòng 11 đến 15, bạn tạo bố cục cấp cao nhất
03 và thêm tiện ích chỉ đọc$ source bin/activate
04 vào đó$ source bin/activate
- Trong các dòng 16 đến 21, bạn tạo một danh sách các danh sách lồng nhau chứa hầu hết
05 của bạn cho máy tính$ source bin/activate
- Ở dòng 22, bạn bắt đầu một vòng lặp
6 trên nhữngimport kivy import random from kivy.app import App from kivy.uix.button import Button from kivy.uix.boxlayout import BoxLayout red = [1,0,0,1] green = [0,1,0,1] blue = [0,0,1,1] purple = [1,0,1,1] class HBoxLayoutExample[App]: def build[self]: layout = BoxLayout[padding=10] colors = [red, green, blue, purple] for i in range[5]: btn = Button[text="Button #%s" % [i+1], background_color=random.choice[colors] ] layout.add_widget[btn] return layout if __name__ == "__main__": app = HBoxLayoutExample[] app.run[]
05 đó. Đối với mỗi danh sách lồng nhau, bạn sẽ làm như sau$ source bin/activate
- Ở dòng 23, bạn tạo một
5 với hướng nằm ngangfrom kivy.app import App from kivy.uix.image import Image class MainApp[App]: def build[self]: img = Image[source='/path/to/real_python.png', size_hint=[1, .5], pos_hint={'center_x':.5, 'center_y':.5}] return img if __name__ == '__main__': app = MainApp[] app.run[]
- Ở dòng 24, bạn bắt đầu một vòng lặp
6 khác trên các mục trong danh sách lồng nhauimport kivy import random from kivy.app import App from kivy.uix.button import Button from kivy.uix.boxlayout import BoxLayout red = [1,0,0,1] green = [0,1,0,1] blue = [0,0,1,1] purple = [1,0,1,1] class HBoxLayoutExample[App]: def build[self]: layout = BoxLayout[padding=10] colors = [red, green, blue, purple] for i in range[5]: btn = Button[text="Button #%s" % [i+1], background_color=random.choice[colors] ] layout.add_widget[btn] return layout if __name__ == "__main__": app = HBoxLayoutExample[] app.run[]
- Trong các dòng từ 25 đến 39, bạn tạo các nút cho hàng, liên kết chúng với trình xử lý sự kiện và thêm các nút vào
5 nằm ngang từ dòng 23from kivy.app import App from kivy.uix.image import Image class MainApp[App]: def build[self]: img = Image[source='/path/to/real_python.png', size_hint=[1, .5], pos_hint={'center_x':.5, 'center_y':.5}] return img if __name__ == '__main__': app = MainApp[] app.run[]
- Ở dòng 31, bạn thêm bố cục này vào
03$ source bin/activate
- Ở dòng 23, bạn tạo một
- Trong các dòng từ 33 đến 37, bạn tạo nút bằng [
12], liên kết nó với trình xử lý sự kiện và thêm nó vào$ source bin/activate
03$ source bin/activate
Bước tiếp theo là tạo trình xử lý sự kiện
$ source bin/activate
14. Đây là mã đó trông như thế nào$ source bin/activate
1Hầu hết các widget trong ứng dụng của bạn sẽ gọi
$ source bin/activate
14. Đây là cách nó hoạt độngDòng 41 lấy đối số
5 để bạn có thể truy cập tiện ích nào được gọi là hàmfrom kivy.app import App from kivy.uix.button import Button class ButtonApp[App]: def build[self]: return Button[] def on_press_button[self]: print['You pressed the button!'] if __name__ == '__main__': app = ButtonApp[] app.run[]
Dòng 42 và 43 trích xuất và lưu trữ giá trị của nút
17 và nút$ source bin/activate
6from kivy.app import App from kivy.uix.label import Label class MainApp[App]: def build[self]: label = Label[text='Hello from Kivy', size_hint=[.5, .5], pos_hint={'center_x': .5, 'center_y': .5}] return label if __name__ == '__main__': app = MainApp[] app.run[]
Dòng 45 đến 47 kiểm tra xem nút nào đã được nhấn. Nếu người dùng nhấn
19, thì bạn sẽ xóa$ source bin/activate
17. Nếu không, hãy chuyển sang câu lệnh$ source bin/activate
21$ source bin/activate
Dòng 49 kiểm tra xem giải pháp có bất kỳ giá trị tồn tại trước nào không
Dòng 50 đến 52 kiểm tra xem nút cuối cùng được nhấn có phải là nút điều hành không. Nếu đúng như vậy, thì
17 sẽ không được cập nhật. Điều này là để ngăn người dùng có hai toán tử liên tiếp. Ví dụ,$ source bin/activate
23 không phải là một tuyên bố hợp lệ$ source bin/activate
Dòng 53 đến 55 kiểm tra xem ký tự đầu tiên có phải là toán tử không. Nếu có, thì
17 sẽ không được cập nhật, vì giá trị đầu tiên không thể là giá trị toán tử$ source bin/activate
Dòng 56 đến 58 chuyển sang mệnh đề
21. Nếu không có điều kiện nào trước đó được đáp ứng, thì hãy cập nhật$ source bin/activate
17$ source bin/activate
Dòng 59 đặt
02 thành nhãn của nút cuối cùng được nhấn$ source bin/activate
Dòng 60 đặt
01 thành$ source bin/activate
29 hoặc$ source bin/activate
30 tùy thuộc vào việc đó có phải là ký tự toán tử hay không$ source bin/activate
Đoạn mã cuối cùng cần viết là
$ source bin/activate
31$ source bin/activate
2Một lần nữa, bạn lấy văn bản hiện tại từ
$ source bin/activate
17 và sử dụng $ source bin/activate
33 tích hợp sẵn của Python để thực thi nó. Nếu người dùng đã tạo một công thức như $ source bin/activate
34, thì $ source bin/activate
33 sẽ chạy mã của bạn và trả về kết quả. Cuối cùng, bạn đặt kết quả làm giá trị mới cho tiện ích $ source bin/activate
17Ghi chú.
$ source bin/activate
33 hơi nguy hiểm vì nó có thể chạy mã tùy ý. Hầu hết các nhà phát triển tránh sử dụng nó vì thực tế đó. Tuy nhiên, vì bạn chỉ cho phép số nguyên, toán tử và dấu chấm làm đầu vào cho $ source bin/activate
33, nên sử dụng an toàn trong ngữ cảnh nàyKhi bạn chạy mã này, ứng dụng của bạn sẽ trông như thế này trên máy tính để bàn
Để xem mã đầy đủ cho ví dụ này, hãy mở rộng khối mã bên dưới
Ví dụ về mã hoàn chỉnhHiển thị/Ẩn
Đây là mã đầy đủ cho máy tính
$ source bin/activate
3Đã đến lúc triển khai ứng dụng của bạn
Loại bỏ các quảng cáoĐóng gói ứng dụng của bạn cho Android
Bây giờ bạn đã hoàn thành mã cho ứng dụng của mình, bạn có thể chia sẻ nó với những người khác. Một cách tuyệt vời để làm điều đó là biến mã của bạn thành một ứng dụng có thể chạy trên điện thoại Android của bạn. Để thực hiện điều này, trước tiên, bạn cần cài đặt gói có tên
$ source bin/activate
39 với from kivy.app import App
from kivy.uix.label import Label
class MainApp[App]:
def build[self]:
label = Label[text='Hello from Kivy',
size_hint=[.5, .5],
pos_hint={'center_x': .5, 'center_y': .5}]
return label
if __name__ == '__main__':
app = MainApp[]
app.run[]
1$ source bin/activate
4Sau đó, tạo một thư mục mới và điều hướng đến nó trong thiết bị đầu cuối của bạn. Khi bạn ở đó, bạn sẽ cần chạy lệnh sau
$ source bin/activate
5Thao tác này sẽ tạo tệp
$ source bin/activate
41 mà bạn sẽ sử dụng để định cấu hình bản dựng của mình. Đối với ví dụ này, bạn có thể chỉnh sửa một vài dòng đầu tiên của tệp thông số kỹ thuật như sau$ source bin/activate
6Vui lòng duyệt qua phần còn lại của tệp để xem bạn có thể thay đổi những gì khác
Tại thời điểm này, bạn gần như đã sẵn sàng để xây dựng ứng dụng của mình, nhưng trước tiên, bạn sẽ muốn cài đặt cho
$ source bin/activate
39. Sau khi chúng được cài đặt, hãy sao chép ứng dụng máy tính của bạn vào thư mục mới và đổi tên nó thành $ source bin/activate
43. Điều này được yêu cầu bởi $ source bin/activate
39. Nếu bạn không đặt tên tệp chính xác thì quá trình xây dựng sẽ thất bạiBây giờ bạn có thể chạy lệnh sau
$ source bin/activate
7Bước xây dựng mất nhiều thời gian. Trên máy của tôi, mất 15 đến 20 phút. Tùy thuộc vào phần cứng của bạn, quá trình này có thể mất nhiều thời gian hơn, vì vậy hãy thoải mái lấy một tách cà phê hoặc chạy bộ trong khi chờ đợi.
$ source bin/activate
45 sẽ tải xuống bất kỳ phần SDK Android nào nó cần trong quá trình xây dựng. Nếu mọi thứ diễn ra theo đúng kế hoạch, thì bạn sẽ có một tệp có tên giống như $ source bin/activate
46 trong thư mục from kivy.app import App
from kivy.uix.label import Label
class MainApp[App]:
def build[self]:
label = Label[text='Hello from Kivy',
size_hint=[.5, .5],
pos_hint={'center_x': .5, 'center_y': .5}]
return label
if __name__ == '__main__':
app = MainApp[]
app.run[]
0 của mìnhBước tiếp theo là kết nối điện thoại Android của bạn với máy tính và sao chép tệp
$ source bin/activate
48 vào đó. Sau đó, bạn có thể mở trình duyệt tệp trên điện thoại của mình và nhấp vào tệp $ source bin/activate
48. Android sẽ hỏi bạn có muốn cài đặt ứng dụng không. Bạn có thể thấy cảnh báo do ứng dụng được tải xuống từ bên ngoài Google Play nhưng bạn vẫn có thể cài đặt ứng dụng đóĐây là máy tính chạy trên Samsung S9 của tôi
Công cụ
$ source bin/activate
39 có một số lệnh khác mà bạn có thể sử dụng. Kiểm tra tài liệu để xem bạn có thể làm gì khácBạn cũng có thể đóng gói ứng dụng bằng cách sử dụng
$ source bin/activate
51 nếu bạn cần kiểm soát chi tiết hơn. Bạn sẽ không trình bày vấn đề này ở đây, nhưng nếu bạn quan tâm, hãy xem phần bắt đầu nhanh của dự ánĐóng gói ứng dụng của bạn cho iOS
Hướng dẫn xây dựng ứng dụng cho iOS phức tạp hơn Android một chút. Để có thông tin cập nhật nhất, bạn phải luôn sử dụng tài liệu đóng gói chính thức của Kivy. Bạn sẽ cần chạy các lệnh sau trước khi có thể đóng gói ứng dụng cho iOS trên máy Mac của mình
$ source bin/activate
8Khi tất cả những thứ đó đã được cài đặt thành công, bạn sẽ cần biên dịch bản phân phối bằng các lệnh sau
$ source bin/activate
9Nếu bạn gặp lỗi cho biết không thể tìm thấy
$ source bin/activate
52, thì hãy xem câu trả lời StackOverflow này để biết cách giải quyết vấn đề đó. Sau đó thử chạy lại các lệnh trênNếu bạn gặp phải lỗi SSL, thì có thể bạn chưa thiết lập OpenSSL của Python. Lệnh này sẽ khắc phục điều đó
$ python -m pip install kivy
0Bây giờ hãy quay lại và thử chạy lại lệnh
$ source bin/activate
53Khi bạn đã chạy thành công tất cả các lệnh trước đó, bạn có thể tạo dự án Xcode của mình bằng cách sử dụng tập lệnh
$ source bin/activate
53. Điểm đầu vào của ứng dụng chính của bạn phải được đặt tên là $ source bin/activate
43 trước khi bạn tạo dự án Xcode. Đây là lệnh bạn sẽ chạy$ python -m pip install kivy
1Cần có một thư mục có tên
$ source bin/activate
56 với dự án Xcode của bạn trong đó. Bây giờ bạn có thể mở dự án đó trong Xcode và làm việc với nó từ đó. Lưu ý rằng nếu bạn muốn gửi ứng dụng của mình lên App Store, thì bạn sẽ phải tạo tài khoản nhà phát triển tại nhà phát triển. quả táo. com và trả phí hàng năm của họLoại bỏ các quảng cáoĐóng gói ứng dụng của bạn cho Windows
Bạn có thể đóng gói ứng dụng Kivy của mình cho Windows bằng PyInstaller. Nếu bạn chưa từng sử dụng nó trước đây, thì hãy xem Sử dụng PyInstaller để dễ dàng phân phối các ứng dụng Python
Bạn có thể cài đặt PyInstaller bằng cách sử dụng
from kivy.app import App
from kivy.uix.label import Label
class MainApp[App]:
def build[self]:
label = Label[text='Hello from Kivy',
size_hint=[.5, .5],
pos_hint={'center_x': .5, 'center_y': .5}]
return label
if __name__ == '__main__':
app = MainApp[]
app.run[]
1$ python -m pip install kivy
2Lệnh sau sẽ đóng gói ứng dụng của bạn
$ python -m pip install kivy
3Lệnh này sẽ tạo một tệp thực thi Windows và một số tệp khác. Đối số
$ source bin/activate
58 cho PyInstaller biết rằng đây là ứng dụng có cửa sổ, chứ không phải ứng dụng dòng lệnh. Nếu bạn muốn PyInstaller tạo một tệp thực thi duy nhất, thì bạn có thể chuyển vào đối số $ source bin/activate
59 ngoài $ source bin/activate
58Đóng gói ứng dụng của bạn cho macOS
Bạn có thể sử dụng PyInstaller để tạo tệp thực thi Mac giống như bạn đã làm cho Windows. Yêu cầu duy nhất là bạn chạy lệnh này trên máy Mac
$ python -m pip install kivy
4Thao tác này sẽ tạo một tệp duy nhất có thể thực thi được trong thư mục
$ source bin/activate
61. Tệp thực thi sẽ có cùng tên với tệp Python mà bạn đã chuyển đến PyInstaller. Nếu bạn muốn giảm kích thước tệp của tệp thực thi hoặc bạn đang sử dụng GStreamer trong ứng dụng của mình, thì hãy xem trang đóng gói của Kivy dành cho macOS để biết thêm thông tinPhần kết luận
Kivy là một khung GUI thực sự thú vị mà bạn có thể sử dụng để tạo giao diện người dùng trên máy tính để bàn và ứng dụng di động trên cả iOS và Android. Các ứng dụng Kivy sẽ không giống như các ứng dụng gốc trên bất kỳ nền tảng nào. Đây có thể là một lợi thế nếu bạn muốn ứng dụng của mình có giao diện khác với đối thủ cạnh tranh
Trong hướng dẫn này, bạn đã học những kiến thức cơ bản về Kivy, bao gồm cách thêm tiện ích, kết nối sự kiện, bố trí nhiều tiện ích và sử dụng ngôn ngữ KV. Sau đó, bạn đã tạo ứng dụng Kivy đầu tiên của mình và học cách phân phối nó trên các nền tảng khác, bao gồm cả thiết bị di động
Có nhiều tiện ích và khái niệm về Kivy mà bạn chưa trình bày ở đây, vì vậy hãy nhớ xem trang web của Kivy để biết hướng dẫn, ứng dụng mẫu, v.v.
Đọc thêm
Để tìm hiểu thêm về Kivy, hãy xem các tài nguyên này
- Hướng dẫn lập trình Kivy
- Tài liệu Bao bì Kivy
- Xây dựng ứng dụng GUI trên máy tính để bàn bằng Python
Để xem cách bạn có thể tạo ứng dụng máy tính để bàn với khung GUI Python khác, hãy xem Cách xây dựng ứng dụng GUI Python với wxPython
Đánh dấu là đã hoàn thành
Xem ngay Hướng dẫn này có một khóa học video liên quan do nhóm Real Python tạo. Xem nó cùng với hướng dẫn bằng văn bản để hiểu sâu hơn. Xây dựng ứng dụng GUI đa nền tảng với Kivy
🐍 Thủ thuật Python 💌
Nhận một Thủ thuật Python ngắn và hấp dẫn được gửi đến hộp thư đến của bạn vài ngày một lần. Không có thư rác bao giờ. Hủy đăng ký bất cứ lúc nào. Được quản lý bởi nhóm Real Python
Gửi cho tôi thủ thuật Python »
Giới thiệu về Mike Driscoll
Mike đã lập trình bằng Python hơn một thập kỷ và thích viết về Python
» Thông tin thêm về MikeMỗi hướng dẫn tại Real Python được tạo bởi một nhóm các nhà phát triển để nó đáp ứng các tiêu chuẩn chất lượng cao của chúng tôi. Các thành viên trong nhóm đã làm việc trong hướng dẫn này là
Aldren
Geir Arne
Jaya
Joanna
Kyle
Bậc thầy Kỹ năng Python trong thế giới thực Với quyền truy cập không giới hạn vào Python thực
Tham gia với chúng tôi và có quyền truy cập vào hàng nghìn hướng dẫn, khóa học video thực hành và cộng đồng các Pythonistas chuyên gia
Nâng cao kỹ năng Python của bạn »
Chuyên gia Kỹ năng Python trong thế giới thực
Với quyền truy cập không giới hạn vào Python thực
Tham gia với chúng tôi và có quyền truy cập vào hàng ngàn hướng dẫn, khóa học video thực hành và cộng đồng Pythonistas chuyên gia
Nâng cao kỹ năng Python của bạn »
Bạn nghĩ sao?
Đánh giá bài viết này
Tweet Chia sẻ Chia sẻ EmailBài học số 1 hoặc điều yêu thích mà bạn đã học được là gì?
Mẹo bình luận. Những nhận xét hữu ích nhất là những nhận xét được viết với mục đích học hỏi hoặc giúp đỡ các sinh viên khác. và nhận câu trả lời cho các câu hỏi phổ biến trong cổng thông tin hỗ trợ của chúng tôi