Professional Documents
Culture Documents
Python - Xây D NG NG D NG Di Đ NG V I Framework Python Kivy - V1Study
Python - Xây D NG NG D NG Di Đ NG V I Framework Python Kivy - V1Study
Z 0986589410 Email
≡ ≡
report this ad
Thêm sự kiện
Đóng
góiứng
dụngZcủa bạn cho macOS 0986589410 Email
Ngày nay, các nhà phát triển rất có thể đang làm việc trên một ứng dụng web hoặc di động. 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 các ứ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 thư viện chủ đạo để phát triển ứng dụng di động bằng Python. Tuy nhiên, bạn sẽ thấy một
số lợi ích 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 lần 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.
Thêm sự kiện
Sử dụng ngôn ngữ KV
Đó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 với Python.
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 hoặc không cần hướng
dẫn.
Kivy không cố gắng sử dụng các tiện ích hoặc điều khiển gốc. Tất cả các widget của nó đều được vẽ theo yêu cầu. Đ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 các ứ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.
Thao tác 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 gọi là my_kivy_project 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 phải kích hoạt nó. Trên Mac và Linux, bạn có thể thực hiện điều đó bằng cách
thực hiện như sau khi ở bên trong thư mục my_kivy_project:
Hide Copy
$ source bin/activate
Lệnh dành cho Windows cũng tương tự, nhưng vị trí của tập lệnh kích hoạt nằm bên trong thư mục Scripts thay vì bin.
Bây giờ bạn đã kích hoạt môi trường ảo Python, bạn có thể chạy pip để cài đặt Kivy. Trên Linux và Mac, bạn sẽ chạy lệnh
sau:
Hide Copy
Trên Windows, việc cài đặt phức tạp hơn một chút. Xem tài liệu chính thức để biết cách cài đặt Kivy trên Windows (người
dùng Mac cũng có thể tải xuống tệp dmg 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 hướng
dẫn.
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 là lớp con của App và ghi đè build(). Đâ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 các lệnh gọi đến các hàm khác mà bạn định nghĩa 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 widget Label và truyền các text, size_hint và pos_hint của nó. Hai đối số cuối cùng này không bắt buộc.
size_hint cho Kivy biết tỷ lệ sử dụng khi tạo tiện ích con. Nó có hai số:
1. Số đầu tiên là x gợi ý về kích thước và đề cập đến chiều rộng của điều khiển.
2. Số thứ hai là y gợi ý kích thước và đề cập đến chiều cao của điều khiển.
Cả hai số này đều 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 pos_hint để đị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 con trên trục x và y.
Để làm cho ứng dụng chạy, bạn khởi tạo lớp MainApp của mình và sau đó gọi run(). Khi làm như vậy, bạn sẽ thấy thông tin
sau trên màn hình của mình:
Điều này rất hữu ích để gỡ lỗi ứng dụng của bạn.
class MainApp(App):
def build(self):
img = Image(source='icon_v1study.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 Imagetừ kivy.uix.imagegói phụ. Các Imagelớp mất rất nhiều thông số khác nhau, nhưng một
trong những mà bạn muốn sử dụng là source. Điều này cho Kivy biết hình ảnh nào cần tải. Tại đây, bạn chuyển một đường
dẫn đầy đủ điều kiện đến 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ước.
Khi bạn chạy mã này, bạn sẽ thấy một cái gì đó như sau:
Bây giờ ta sẽ học cách thêm và sắp xếp nhiều widget trong ứng dụng của mình.
FloatLayout
GridLayout
Dưới đây là ví dụ với BoxLayout:
Hide Copy
import kivy
import random
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 ví dụ trên, ta import BoxLayout từ kivy.uix.boxlayout và khởi tạo nó. Sau đó, ta tạo một danh sách các màu. Cuối
cùng, ta dùng vòng lặp lặp 5 lần, mỗi lần lặp sẽ tạo một nút btn. Để làm cho mọi thứ vui vẻ hơn một chút, bạn đặt thuộc
tính background_color của nút thành một màu ngẫu nhiên. Sau đó, bạn thêm nút vào bố cục của mình bằng
lệnh layout.add_widget(btn).
Khi bạn chạy mã trên thì kết quả sẽ có dạng như ảnh dưới đây:
Có 5 nút màu ngẫu nhiên, một nút cho mỗi lần lặp lại vòng lặp for của bạn.
Khi bạn tạo một bố cục, có một số đối số bạn nên biết:
padding: Bạn có thể chỉ định paddingin theo đơn vị pixel giữa bố cục và con của nó theo một trong ba cách:
spacing: Bạn có thể thêm khoảng cách giữa các widget con bằng đối số này.
orientation: Bạn có thể thay đổi mặc định orientation của BoxLayout từ ngang sang dọc.
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. Framework phản hồi các thao tác nhấn phím của
người dùng, sự kiện chuột và sự kiện chạm. Kivy có khái niệm về Đồng hồ (Clock) mà bạn có thể sử dụng để lên lịch các
lời gọi hàm trong một thời gian nào đó trong tương lai.
Kivy cũng có khái niệm về Properties, nó hoạt động với EventDispatcher. Thuộc tính này 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 tiện ích con thay đổi kích thước hoặc vị trí của nó.
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
if __name__ == '__main__':
app = MainApp()
app.run()
Trong ví dụ trên, bạn gọi button.bind() và liên kết sự kiện on_presssự kiện với MainApp.on_press_button(). Phương thức
này mặc nhiên nhận widget obj, chính là đối tượng button. Cuối cùng, một thông báo sẽ được in ra stdout bất cứ khi nào
người dùng nhấn vào nút button.
-24% -13%
def on_press_button(self):
print('You pressed the button!')
if __name__ == '__main__':
app = ButtonApp()
app.run()
Mã này thoạt nhìn có thể hơi kỳ quặc, vì nó tạo ra một mã Button mà không đặt 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 App của tên của lớp.
Trong trường hợp này, tên lớp là ButtonApp, vì vậy Kivy sẽ tìm kiếm một tệp có tên button.kv. 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 mã sau:
Hide Copy
1<Button>:
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()
Kết quả:
Giải thích:
Dòng 1 khớp với lệnh gọi Button trong mã Python của bạn. Nó yêu cầu Kivy nhìn vào đối tượng khởi tạo để xác định nút.
Dòng 5 thiết lập trình xử lý sự kiện on_press. Để cho Kivy biết trình xử lý sự kiện ở đâu, bạn sử dụng app.on_press_button(). Ở đây,
Kivy biết sẽ tìm trong lớp ButtonApp phương thức có tên .on_press_button().
Bạn có thể thiết lập tất cả các widget 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à hơn thế nữa. Để biết đầy đủ chi tiết, 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ự!
Phép trừ
Phép nhân
Phép chia
Đối với ứng dụng này, bạn sẽ cần một loạt các nút trong một số loại bố cục. Bạn cũng sẽ cần một box phía đầu ứng dụng
của mình để hiển thị cho phần tính toán và kết quả. Đây là 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ã Python:
Hide Copy
Giải thích:
Trong các dòng từ 8 đến 10: bạn tạo một danh sách (list) các phép toán (operators) và hai giá
trị last_was_operator và last_button sẽ sử dụng sau này.
Trong các dòng từ 11 đến 15, bạn tạo bố cục cấp cao nhất main_layout và thêm tiện ích TextInput chỉ đọc vào bố cục.
Trong các dòng từ 16 đến 21, bạn tạo một danh sách lồng nhau gồm các danh sách chứa hầu hết các buttons cho máy tính.
Trong dòng 22, bạn bắt đầu một vòng lặp for trên các buttons. Đối với mỗi danh sách lồng nhau, bạn sẽ thực hiện như sau:
Trong dòng 23, bạn tạo một BoxLayout với hướng nằm ngang.
Trong dòng 24, bạn bắt đầu một vòng lặp for khác trên các mục trong danh sách lồng nhau.
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 một trình xử lý sự kiện và thêm các nút vào hàng
ngang BoxLayout từ dòng 23.
Trong các dòng từ 33 đến 37, bạn tạo nút bằng (=), liên kết nó với một trình xử lý sự kiện và thêm nó vào main_layout.
Bước tiếp theo là ta tạo trình xử lý sự kiện on_button_press() với đoạn mã như sau:
Hide Copy
Hầu hết các widget trong ứng dụng của bạn sẽ gọi .on_button_press(). Sau đây là một số giải thích:
Dòng 41 lấy đối số instance để bạn có thể truy cập tiện ích con nào được gọi là hàm.
Dòng 42 và 43 trích xuất và lưu trữ giá trị của solution và của nút text.
Dòng 45 đến 47 kiểm tra xem nút nào đã được nhấn. Nếu người dùng nhấn C, thì bạn sẽ xóa solution. Nếu không thì chuyển
sang else.
Dòng 49 kiểm tra xem solution có bất kỳ giá trị nào tồn tại từ trước hay 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 phép toán hay không. Nếu phải thì solution sẽ không được
cập nhật. Điều này là để ngăn người dùng đưa vào hai phép toán liên tiếp. Ví dụ như 1 */ là không hợp lệ.
Các dòng từ 53 đến 55 kiểm tra xem ký tự đầu tiên có phải là toán tử hay không. Nếu đúng thì solution sẽ không được cập nhật vì
giá trị đầu tiên không được là giá trị toán tử.
Các dòng từ 56 đến 58 là mệnh đề else. Nếu không có điều kiện nào trước đó được đáp ứng thì sẽ cập nhật solution.
Dòng 59 đặt last_button thành nhãn của nút cuối cùng được nhấn.
Dòng 60 đặt last_was_operator thành True hoặc False tùy thuộc vào việc nó có phải là một ký tự toán tử hay không.
Sau đây là phần cuối của chương trình, phương thức on_solution():
Hide Copy
Một lần nữa, bạn lấy văn bản hiện tại solution và sử dụng hàm eval() để thực thi nó. Nếu người dùng đã tạo một
biểu thức chẳng hạn như 1+2, thì eval() 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à giá trị mới
cho tiện ích con solution.
Lưu ý: eval() 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ế này. 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 eval(), nên bạn có thể sử dụng an toàn trong tình huống này.
Khi bạn chạy code trên, ứng dụng của bạn sẽ trông giống như thế này trên máy tính để bàn (desktop):
Đóng gói ứng dụng của bạn cho Android
Bây giờ bạn bạn có thể chia sẻ code 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 sẽ cần phải cài đặt một
gói phần mềm được gọi là buildozer với pip:
Hide Copy
Sau đó, 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:
Hide Copy
$ buildozer init
Thao tác này sẽ tạo một tệp buildozer.spec 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 đặc tả như sau:
Hide Copy
[app]
Bạn có thể xem 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
các phụ thuộc cho buildozer. 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 main.py. Điều này được yêu cầu bởi buildozer. Nếu bạn không có tên tệp chính xác, thì quá trình xây
dựng sẽ không thành công.
Bước xây dựng mất nhiều thời gian, mất từ 15 đến 20 phút. Tùy thuộc vào phần cứng của bạn, 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. Buildozer sẽ tải xuống bất kỳ phần Android
SDK 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
dạng như kvcalc-0.1-debug.apk trong thư mục bin của mình.
Bướ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 apk 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 apk. Android sẽ hỏi bạn xem bạn có muốn cài đặt ứng dụng hay
không. Bạn có thể thấy cảnh báo vì ứ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.
Công cụ buildozer này 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ác.
Bạn cũng có thể đóng gói ứng dụng bằng cách sử dụng python-for-android nếu bạn cần kiểm soát chi tiết hơn. Hãy xem
phần bắt đầu nhanh của dự án.
Khi tất cả chúng được cài đặt thành công, bạn sẽ cần phải biên dịch bản phân phối bằng các lệnh sau:
Hide Copy
Nếu bạn gặp lỗi cho biết iphonesimulator không thể tìm thấy, hãy xem câu trả lời StackOverflow này để biết các cách giải
quyết vấn đề đó. Sau đó, hãy thử chạy lại các lệnh trên.
Nếu bạn gặp 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 đó:
Hide Copy
$ cd /Applications/Python\ 3.7/
$ ./Install\ Certificates.command
Bây giờ hãy quay lại và thử chạy lại lệnh toolchain.
Khi bạn đã chạy tất cả các lệnh trước thành công, bạn có thể tạo dự án Xcode của mình bằng cách sử dụng tập
lệnh toolchain. Điểm nhập của ứng dụng chính của bạn phải được đặt tên main.py trước khi bạn tạo dự án Xcode. Đây là
lệnh bạn sẽ chạy:
Hide Copy
Nên có một thư mục có tên title với dự án Xcode của bạn trong đó. Bây giờ bạn có thể mở dự án đó bằng Xcode và
làm
việc trên đó. 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 và trả phí hàng năm cho họ.
$ pyinstaller main.py -w
Lệnh này sẽ tạo tệp thực thi Windows và một số tệp khác. Đối số -w cho PyInstaller biết rằng đây là một ứng dụng cửa sổ,
chứ không phải là một ứ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ể thêm
đối số --onefile vào -w.
Thao tác này sẽ tạo một tệp thực thi duy nhất trong thư mục dist. Tệp thực thi sẽ có cùng tên với tệp Python mà bạn đã
chuyển cho 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, hãy xem trang đóng gói của Kivy dành cho macOS để biết thêm thông tin.
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 con, kết nối sự kiện, bố trí
nhiều tiện ích con 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ó rất 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à hơn thế nữa.
Đọc thêm
Để tìm hiểu thêm về Kivy, hãy xem các tài nguyên sau:
Hướng dẫn lập trình Kivy
Xây dựng ứng dụng GUI cho máy tính để bàn bằng Python
Để xem cách bạn có thể tạo ứng dụng dành cho máy tính để bàn với framework GUI Python khác, hãy xem Cách tạo ứng
dụng GUI Python với wxPython.