Giới thiệu Có lẽ bạn mới bắt đầu học Python và đã xây dựng một hoặc hai ứng dụng đơn giản. Xin chúc mừng! Nhưng, bây giờ thì sao? Chà, còn về việc xây dựng giao diện người dùng đồ họa ("GUI") để tương tác với ứng dụng Python mới, sáng bóng của bạn thì sao? Có một số tùy chọn để xây dựng các ứng dụng GUI với Python, bao gồm và . Tuy nhiên, hướng dẫn này sẽ giới thiệu cho bạn về . PyQt wxPython Tkinter , viết tắt của "Tk interface", là tiêu chuẩn của Python để xây dựng GUI và được bao gồm trong . Nó là một ràng buộc với , một thư viện mã nguồn mở miễn phí của GUI có thể được sử dụng để xây dựng giao diện đồ họa bằng nhiều ngôn ngữ lập trình. Tkinter Thư viện tiêu chuẩn Python bộ công cụ Tk GUI các tiện ích Hướng dẫn này trình bày về thiết kế của một ứng dụng GUI cơ bản hiển thị giờ địa phương trong múi giờ do người dùng chọn. Các bước xây dựng ứng dụng dần dần và mô tả một số khái niệm chính khi làm việc với , bao gồm cách bố trí các phần tử GUI, thu thập thông tin đầu vào của người dùng và liên kết các phần tử GUI với các phương thức gọi lại. Tkinter Điều kiện tiên quyết Để hoàn thành hướng dẫn này, bạn sẽ cần phải có: . Đã cài đặt Python cài đặt. pip Đã cài đặt thư viện múi giờ . Thư viện có thể được cài đặt bằng . pytz pip pip install pytz Hướng dẫn này sẽ sử dụng thuật ngữ và cửa thay thế cho nhau. cửa sổ gốc sổ chính Bước 1 - Tạo một ứng dụng Python mới và đặt các mục nhập bắt buộc Tạo một ứng dụng Python mới có tên và thêm các câu lệnh sau để nhập các mô-đun , và . timezone.py import Tkinter datetime pytz import tkinter as tk import datetime import pytz Bước 2 - Thêm múi giờ Hướng dẫn này kết hợp bộ múi giờ của Hoa Kỳ là một phần nhỏ của múi giờ được hỗ trợ. Chức năng của ứng dụng có thể được mở rộng bằng cách thêm các tên múi giờ bổ sung. Có thể xuất danh sách đầy đủ các múi giờ có sẵn với bằng cách chạy lệnh sau: pytz pytz pytz print(pytz.all_timezones) Bộ múi giờ của Hoa Kỳ có sẵn qua được chỉ định dưới dạng danh sách. pytz import tkinter as tk import datetime import pytz timezones = ["US/Alaska", "US/Aleutian", "US/Arizona", "US/Central", "US/East-Indiana", "US/Eastern", "US/Hawaii", "US/Indiana-Starke", "US/Michigan", "US/Mountain", "US/Pacific", "US/Samoa"] Bước 3 - Tạo một phiên bản của Lớp Tk Khởi tạo lớp tạo ra một sẽ đóng vai trò là cửa sổ chính của GUI của ứng dụng múi giờ. Tk cửa sổ gốc import tkinter as tk import datetime import pytz timezones = ["US/Alaska", "US/Aleutian", "US/Arizona", "US/Central", "US/East-Indiana", "US/Eastern", "US/Hawaii", "US/Indiana-Starke", "US/Michigan", "US/Mountain", "US/Pacific", "US/Samoa"] root = tk.Tk() Bước 4 - Thiết lập cửa sổ chính Bước này định cấu hình cửa sổ gốc, đặc biệt là tiêu đề, hình học và khả năng thay đổi kích thước của nó. Bước 4a - Đặt tiêu đề cửa sổ chính Tiêu đề cửa sổ được đặt bằng phương pháp . title import tkinter as tk import datetime import pytz timezones = ["US/Alaska", "US/Aleutian", "US/Arizona", "US/Central", "US/East-Indiana", "US/Eastern", "US/Hawaii", "US/Indiana-Starke", "US/Michigan", "US/Mountain", "US/Pacific", "US/Samoa"] root = tk.Tk() root.title("Simple Timezone Application") Bước 4b - Đặt Chiều rộng và Chiều cao của Cửa sổ Chính Giá trị chiều rộng và chiều cao của cửa sổ, được biểu thị bằng pixel, có thể được gán cho các biến để làm cho mã dễ theo dõi hơn. import tkinter as tk import datetime import pytz timezones = ["US/Alaska", "US/Aleutian", "US/Arizona", "US/Central", "US/East-Indiana", "US/Eastern", "US/Hawaii", "US/Indiana-Starke", "US/Michigan", "US/Mountain", "US/Pacific", "US/Samoa"] root = tk.Tk() root.title("Simple Timezone Application") window_width = 450 window_height = 175 Bước 4c - Tính toán Vị trí Trung tâm Cửa sổ Chính Cửa sổ chính có thể được đặt ở bất kỳ vị trí nào trên màn hình, ví dụ như ở giữa, ở góc trên bên trái, v.v. Cửa sổ căn giữa cung cấp "giao diện" đẹp mắt và vị trí trung tâm của cửa sổ chính có thể được xác định bằng cách sử dụng của cửa sổ gốc. và các phương thức cùng với một số phép toán đơn giản. Hai phương thức này trả về chiều rộng màn hình và chiều cao màn hình được sử dụng để tính toán tọa độ (x, y) thích hợp để căn giữa cửa sổ chính. Như với chiều rộng và chiều cao của cửa sổ, các giá trị vị trí trung tâm cũng có thể được gán cho các biến để làm cho mã dễ đọc hơn. winfo_screenwidth() winfo_screenwidth() winfo_screenheight() import tkinter as tk import datetime import pytz timezones = ["US/Alaska", "US/Aleutian", "US/Arizona", "US/Central", "US/East-Indiana", "US/Eastern", "US/Hawaii", "US/Indiana-Starke", "US/Michigan", "US/Mountain", "US/Pacific", "US/Samoa"] root = tk.Tk() root.title("Simple Timezone Application") window_width = 450 window_height = 175 screen_width = root.winfo_screenwidth() screen_height = root.winfo_screenheight() center_x = int((screen_width - window_width)/2) center_y = int((screen_height - window_height)/2) Lưu ý rằng giá trị và cũng được biểu thị bằng pixel và được sử dụng để đảm bảo cả hai giá trị được tính toán đều là số nguyên. center_x center_y int Bước 4d - Thiết lập Hình học Cửa sổ Chính Hình học cửa sổ , chỉ định kích thước và vị trí của cửa sổ chính, được thiết lập bằng phương pháp của cửa sổ gốc. Để làm cho mọi thứ trở nên đơn giản, bạn có thể sử dụng một chuỗi ký tự sting được định dạng, hoặc , sẽ nội suy các biểu thức biến hình học trong thời gian chạy. Theo khối mã sau, được chuyển đến phương thức dưới dạng tham số. root geometry chuỗi f chuỗi ký tự f geometry import tkinter as tk import datetime import pytz timezones = ["US/Alaska", "US/Aleutian", "US/Arizona", "US/Central", "US/East-Indiana", "US/Eastern", "US/Hawaii", "US/Indiana-Starke", "US/Michigan", "US/Mountain", "US/Pacific", "US/Samoa"] root = tk.Tk() root.title("Simple Timezone Application") window_width = 450 window_height = 175 screen_width = root.winfo_screenwidth() screen_height = root.winfo_screenheight() center_x = int((screen_width - window_width)/2) center_y = int((screen_height - window_height)/2) root.geometry(f"{window_width}x{window_height}+{center_x}+{center_y}") Bước 4e - Đặt khả năng thay đổi kích thước cửa sổ chính Khả năng thay đổi kích thước của cửa sổ gốc dọc theo trục x và y của nó có thể được đặt thông qua phương pháp của cửa sổ gốc. Phương thức chấp nhận các tham số và , theo thứ tự đó. Giá trị hoặc khác 0 cho một trong hai tham số chỉ định rằng cửa sổ chính có thể thay đổi kích thước dọc theo trục được liên kết. Giá trị hoặc cho một trong hai tham số chỉ định rằng cửa sổ chính không thể thay đổi kích thước dọc theo trục đã cho. Ứng dụng hẹn giờ sẽ sử dụng giá trị cho cả chiều cao và chiều rộng để ngăn cửa sổ chính bị thay đổi kích thước. resizable resizable height width True False 0 False import tkinter as tk import datetime import pytz timezones = ["US/Alaska", "US/Aleutian", "US/Arizona", "US/Central", "US/East-Indiana", "US/Eastern", "US/Hawaii", "US/Indiana-Starke", "US/Michigan", "US/Mountain", "US/Pacific", "US/Samoa"] root = tk.Tk() root.title("Simple Timezone Application") window_width = 450 window_height = 175 screen_width = root.winfo_screenwidth() screen_height = root.winfo_screenheight() center_x = int((screen_width - window_width)/2) center_y = int((screen_height - window_height)/2) root.geometry(f"{window_width}x{window_height}+{center_x}+{center_y}") root.resizable(False, False) Bước 5 - Chỉ định lưới cho bố cục tiện ích con Các có thể được sắp xếp trên đầu cửa sổ chính theo nhiều cách khác nhau bằng cách sử dụng . Nói chung, các widget có thể được sắp xếp theo 3 cách: widget trình quản lý hình học bằng phương thức . Trình quản lý hình học sắp xếp các widget thành các khối trước khi chúng được thêm vào cửa sổ gốc hoặc widget cha. Một cách không hoàn hảo nhưng có lẽ hữu ích để nghĩ về việc là nghĩ về việc thêm các mặt hàng tạp hóa vào một túi hàng tạp hóa. Các mục không nhất thiết phải được thêm vào các vị trí được xác định trước trong túi. Thay vào đó, chúng được lần lượt, sử dụng hết không gian có sẵn cho đến khi tất cả các mặt hàng đã được cho vào túi. Trình quản lý hình học hoạt động theo cách tương tự. Được đóng gói pack() pack() đóng gói đóng gói pack() bằng phương thức . Trình quản lý hình học các tiện ích con vào các vị trí cụ thể, được xác định trước trong cửa sổ gốc hoặc tiện ích con. Trình quản lý hình học này rõ ràng là hữu ích khi xây dựng bố cục GUI chính xác. Được đặt place() place() đặt Được sắp xếp dưới dạng bằng cách sử dụng phương thức . Lưới là bảng hàng / cột 2 chiều. Tiện ích con được thêm vào lưới bằng cách chỉ định hàng và cột cụ thể nơi tiện ích con sẽ được đặt. Lưới được thiết lập bằng phương pháp và của cửa sổ gốc. Mỗi phương pháp này có một và một thuộc tính . Thuộc tính định vị trí của cột hoặc hàng bằng cách sử dụng cơ sở bắt đầu là . Thuộc tính chỉ định kích thước của một cột hoặc hàng cụ thể so với các cột khác. Ví dụ, nếu có trọng số và có trọng số , thì sẽ lớn gấp 3 lần . lưới grid() columnconfigure rowconfigure index weight index 0 weight cột 0 1 cột 1 3 cột 1 cột 0 Lưới rất tiện dụng khi đặt các phần tử cạnh nhau và chúng tương đối đơn giản để thực hiện. Ứng dụng múi giờ sẽ sử dụng lưới cửa sổ chính được chia thành 4 cột bằng nhau. import tkinter as tk import datetime import pytz timezones = ["US/Alaska", "US/Aleutian", "US/Arizona", "US/Central", "US/East-Indiana", "US/Eastern", "US/Hawaii", "US/Indiana-Starke", "US/Michigan", "US/Mountain", "US/Pacific", "US/Samoa"] root = tk.Tk() root.title("Simple Timezone Application") window_width = 450 window_height = 175 screen_width = root.winfo_screenwidth() screen_height = root.winfo_screenheight() center_x = int((screen_width - window_width)/2) center_y = int((screen_height - window_height)/2) root.geometry(f"{window_width}x{window_height}+{center_x}+{center_y}") root.resizable(False, False) root.columnconfigure(0, weight=1) root.columnconfigure(1, weight=1) root.columnconfigure(2, weight=1) root.columnconfigure(3, weight=1) Bước 6 - Thêm tiện ích Trong bước này, các widget được thêm vào lưới cửa sổ chính được xác định trong Bước 4. Ứng dụng múi giờ sẽ sử dụng 3 widget : TKinter Label Listbox Button Các widget và của Tkinter đúng như tên gọi của chúng. Tiện ích cho phép người lập trình hiển thị văn bản (tức là nhãn), và tiện ích được sử dụng để hiển thị các nút. ích Hộp danh sách được sử dụng để chọn một giá trị (hoặc các giá trị) từ danh sách các tùy chọn. Label Button Label Button Listbox Tất nhiên, có những widget khác ngoài 3 widget được liệt kê ở trên, chẳng hạn như các , và . chính thức là một tài nguyên hữu ích để tìm hiểu thêm về các tiện ích con có sẵn thông qua bộ công cụ Tk. SpinBox Entry Message Tài liệu về các lệnh Tk Bước 6a - Tạo tiện ích con Một phiên bản của mỗi lớp widget được tạo cho một widget nhất định được sử dụng với thiết kế GUI. Ứng dụng múi giờ sử dụng 4 phiên bản tiện ích con: 2 tiện ích , 1 ích Hộp danh sách và 1 tiện ích . Label Listbox Button import tkinter as tk import datetime import pytz timezones = ["US/Alaska", "US/Aleutian", "US/Arizona", "US/Central", "US/East-Indiana", "US/Eastern", "US/Hawaii", "US/Indiana-Starke", "US/Michigan", "US/Mountain", "US/Pacific", "US/Samoa"] root = tk.Tk() root.title("Simple Timezone Application") window_width = 450 window_height = 175 screen_width = root.winfo_screenwidth() screen_height = root.winfo_screenheight() center_x = int((screen_width - window_width)/2) center_y = int((screen_height - window_height)/2) root.geometry(f"{window_width}x{window_height}+{center_x}+{center_y}") root.resizable(False, False) root.columnconfigure(0, weight=1) root.columnconfigure(1, weight=1) root.columnconfigure(2, weight=1) root.columnconfigure(3, weight=1) # Instance of Label widget class for selection prompt. select_timezone_label = tk.Label(root, text="Please select a timezone.") # Instance of Listbox class for selection of timezone from list. list_var = tk.Variable(value=timezones) select_timezone_listbox = tk.Listbox(root, listvariable=list_var, height=1) # Instance of Button class to get the local time in the selected timezone. select_timezone_button = tk.Button(root, text="Get Time") # Second instance of the Label class to display the local time in the selected timezone. time_label = tk.Label(root, text="") Như đã thấy trong khối mã ở trên, mỗi cá thể widget được "đính kèm" vào cửa sổ . Tiện ích cũng yêu cầu khởi tạo lớp Tkinter đặc biệt được sử dụng để cung cấp cho widget danh sách các tùy chọn múi giờ mà người dùng có thể chọn thông qua thuộc tính . Văn bản được hiển thị bởi mỗi tiện ích có thể được định cấu hình bằng cách sử dụng thuộc tính . Giá trị văn bản cho được để trống vì nó sẽ được đặt động mỗi khi người dùng "lấy" thời gian cho một múi giờ đã chọn. root Listbox Variable() listvariable Listbox Label text time_label Bước 6b - Đặt Widget trên Lưới Các cá thể widget được tạo ở Bước 5a có thể được đặt trên lưới được xác định trong Bước 4 bằng cách sử dụng phương thức . Ứng dụng múi giờ sẽ sử dụng các thuộc tính phương thức sau để xác định bố cục: grid() grid() : Chỉ định cột cụ thể nơi tiện ích con sẽ được đặt bằng cách sử dụng cơ sở . column 0 : Chỉ định hàng cụ thể nơi tiện ích con sẽ được đặt bằng cách sử dụng cơ sở . row 0 : Chỉ định rằng widget sẽ kéo dài số cột được chỉ định. Ví dụ: một tiện ích con có giá trị cột sẽ kéo dài 3 cột ngay cả khi chính tiện ích con đó nhỏ hơn 3 cột. columnspan columnspan=3 : Hành vi mặc định của Tkinter là đặt tiện ích con ở tâm ngang và dọc của ô (tức là vị trí hàng / cột cụ thể) nơi nó được đặt. Hành vi mặc định này có thể được ghi đè bằng cách sử dụng tính cố định sử dụng các giá trị giống như la bàn, bao gồm , , , , , , và , để căn chỉnh tiện ích tại một vị trí cụ thể ô của tiện ích. Ví dụ: chỉ định rằng tiện ích con phải được căn chỉnh về góc phía tây của ô lưới của nó. Tương tự, chỉ định rằng tiện ích con phải được căn chỉnh theo góc phía đông của ô lưới của nó. sticky sticky NW N NE W E SW S SE trong sticky=tK.W sticky=tK.E , : Thuộc tính và được sử dụng để thêm đệm trục x và trục y tương ứng với các giá trị được chỉ định bằng pixel. Đương nhiên, padding có thể cung cấp một GUI trông chuyên nghiệp hơn, đảm bảo rằng các widget không "va chạm" trực tiếp vào các cạnh của cửa sổ gốc hoặc các widget khác. padx pady padx pady import tkinter as tk import datetime import pytz timezones = ["US/Alaska", "US/Aleutian", "US/Arizona", "US/Central", "US/East-Indiana", "US/Eastern", "US/Hawaii", "US/Indiana-Starke", "US/Michigan", "US/Mountain", "US/Pacific", "US/Samoa"] root = tk.Tk() root.title("Simple Timezone Application") window_width = 450 window_height = 175 screen_width = root.winfo_screenwidth() screen_height = root.winfo_screenheight() center_x = int((screen_width - window_width)/2) center_y = int((screen_height - window_height)/2) root.geometry(f"{window_width}x{window_height}+{center_x}+{center_y}") root.resizable(False, False) root.columnconfigure(0, weight=1) root.columnconfigure(1, weight=1) root.columnconfigure(2, weight=1) root.columnconfigure(3, weight=1) # Instance of Label widget class for selection prompt. select_timezone_label = tk.Label(root, text="Please select a timezone.") # Instance of Listbox class for selection of timezone from list. list_var = tk.Variable(value=timezones) select_timezone_listbox = tk.Listbox(root, listvariable=list_var, height=1) # Instance of Button class to get the local time in the selected timezone. select_timezone_button = tk.Button(root, text="Get Time") # Second instance of the Label class to display the local time in the selected timezone. time_label = tk.Label(root, text="") # Place widgets on grid. select_timezone_label.grid(column=0, row=0, columnspan=4, sticky=tk.W, padx=10, pady=10) select_timezone_listbox.grid(column=0, row=1, columnspan=3, sticky=tk.EW, padx=10, pady=10) select_timezone_button.grid(column=4, row=1, sticky=tk.E, padx=10, pady=10) time_label.grid(column=0, row=4, columnspan=4, sticky=tk.W, padx=10, pady=10) Bước 7 - Tạo phương pháp gọi lại nút lấy thời gian Phương thức gọi lại cần được xác định để xử lý các sự kiện khi người dùng nhấp vào nút được tạo ở Bước 5. select_timezone_button Bước 7a - Ràng buộc nút Lấy thời gian Trước khi xác định logic gọi lại, điều hữu ích là đầu tiên liên kết nút với tên phương thức mà cuối cùng sẽ bao gồm mã gọi lại. Phương thức có thể được sử dụng cùng với một hàm để liên kết với phương thức gọi lại được chỉ định. Ngoài ra, hãy lưu ý rằng hàm được sử dụng để chuyển các tham chiếu đến các widget và dưới dạng các tham số gọi lại. Các thông số gọi lại này thực sự cần thiết vì và đều nằm trong phạm vi chung. Tuy nhiên, nó được cho là hữu ích để chứng minh cách các đối số có thể được truyền cho hàm gọi lại. bind() lambda select_timezone_button lambda select_timezone_listbox time_label không select_timezone_listbox time_label import tkinter as tk import datetime import pytz timezones = ["US/Alaska", "US/Aleutian", "US/Arizona", "US/Central", "US/East-Indiana", "US/Eastern", "US/Hawaii", "US/Indiana-Starke", "US/Michigan", "US/Mountain", "US/Pacific", "US/Samoa"] root = tk.Tk() root.title("Simple Timezone Application") window_width = 450 window_height = 175 screen_width = root.winfo_screenwidth() screen_height = root.winfo_screenheight() center_x = int((screen_width - window_width)/2) center_y = int((screen_height - window_height)/2) root.geometry(f"{window_width}x{window_height}+{center_x}+{center_y}") root.resizable(False, False) root.columnconfigure(0, weight=1) root.columnconfigure(1, weight=1) root.columnconfigure(2, weight=1) root.columnconfigure(3, weight=1) # Instance of Label widget class for selection prompt. select_timezone_label = tk.Label(root, text="Please select a timezone.") # Instance of Listbox class for selection of timezone from list. list_var = tk.Variable(value=timezones) select_timezone_listbox = tk.Listbox(root, listvariable=list_var, height=1) # Instance of Button class to get the local time in the selected timezone. select_timezone_button = tk.Button(root, text="Get Time") # Second instance of the Label class to display the local time in the selected timezone. time_label = tk.Label(root, text="") # Place widgets on grid. select_timezone_label.grid(column=0, row=0, columnspan=4, sticky=tk.W, padx=10, pady=10) select_timezone_listbox.grid(column=0, row=1, columnspan=3, sticky=tk.EW, padx=10, pady=10) select_timezone_button.grid(column=4, row=1, sticky=tk.E, padx=10, pady=10) time_label.grid(column=0, row=4, columnspan=4, sticky=tk.W, padx=10, pady=10) select_timezone_button.bind("<Button>", lambda e, args=[select_timezone_listbox, time_label]: get_timezone_time(e, args)) Bước 7b - Xác định Logic Gọi lại Logic gọi lại để xử lý các sự kiện nhấp vào nút được định nghĩa bên dưới. def get_timezone_time(e, args): select_timezone_listbox = args[0] time_label = args[1] selection_index = select_timezone_listbox.curselection() selected_timezone = select_timezone_listbox.get(selection_index) now_time = datetime.datetime.now() tz_time = now_time.astimezone(pytz.timezone(selected_timezone)) tz_formatted = tz_time.strftime("%H:%M:%S") time_label.configure({"text": f"The time in {selected_timezone} is {tz_formatted}."}) time_label.update() Các và được sử dụng để truy xuất múi giờ đã chọn của người dùng từ tham chiếu đến tiện ích con . Thời gian hiện tại của người dùng sau đó được chuyển đổi thành múi giờ đã chọn. Cuối cùng, phương thức được sử dụng để thay đổi thuộc tính của tham chiếu đến nhãn thời với giờ địa phương trong múi giờ đã chọn. Lưu ý rằng phương thức được sử dụng để "buộc" tiện ích tự cập nhật giá trị văn bản mới. curselection() get() select_timezone_listbox configure text time_label update() time_label Bước 8 - Hoàn thành và chạy ứng dụng Phương thức của cửa sổ gốc được áp dụng làm dòng mã cuối cùng. Phương thức sẽ chạy GUI trong một vòng lặp vô hạn cho đến khi người dùng thoát. mainloop() mainloop() Mã hoàn thành như sau: import tkinter as tk import datetime import pytz timezones = ["US/Alaska", "US/Aleutian", "US/Arizona", "US/Central", "US/East-Indiana", "US/Eastern", "US/Hawaii", "US/Indiana-Starke", "US/Michigan", "US/Mountain", "US/Pacific", "US/Samoa"] def get_timezone_time(e, args): select_timezone_listbox = args[0] time_label = args[1] selection_index = select_timezone_listbox.curselection() selected_timezone = select_timezone_listbox.get(selection_index) now_time = datetime.datetime.now() tz_time = now_time.astimezone(pytz.timezone(selected_timezone)) tz_formatted = tz_time.strftime("%H:%M:%S") time_label.configure({"text": f"The time in {selected_timezone} is {tz_formatted}."}) time_label.update() root = tk.Tk() root.title("Simple Timezone Application") window_width = 450 window_height = 175 screen_width = root.winfo_screenwidth() screen_height = root.winfo_screenheight() center_x = int((screen_width - window_width)/2) center_y = int((screen_height - window_height)/2) root.geometry(f"{window_width}x{window_height}+{center_x}+{center_y}") root.resizable(False, False) root.columnconfigure(0, weight=1) root.columnconfigure(1, weight=1) root.columnconfigure(2, weight=1) root.columnconfigure(3, weight=1) # Instance of Label widget class for selection prompt. select_timezone_label = tk.Label(root, text="Please select a timezone.") # Instance of Listbox class for selection of timezone from list. list_var = tk.Variable(value=timezones) select_timezone_listbox = tk.Listbox(root, listvariable=list_var, height=1) # Instance of Button class to get the local time in the selected timezone. select_timezone_button = tk.Button(root, text="Get Time") # Second instance of the Label class to display the local time in the selected timezone. time_label = tk.Label(root, text="") # Place widgets on grid. select_timezone_label.grid(column=0, row=0, columnspan=4, sticky=tk.W, padx=10, pady=10) select_timezone_listbox.grid(column=0, row=1, columnspan=3, sticky=tk.EW, padx=10, pady=10) select_timezone_button.grid(column=4, row=1, sticky=tk.E, padx=10, pady=10) time_label.grid(column=0, row=4, columnspan=4, sticky=tk.W, padx=10, pady=10) # Bind button to callback. select_timezone_button.bind("<Button>", lambda e, args=[select_timezone_listbox, time_label]: get_timezone_time(e, args)) root.mainloop() Khi ứng dụng được khởi chạy, GUI sẽ giống như sau: Để sử dụng ứng dụng, hãy nhấp vào hộp danh sách và sử dụng các phím con trỏ lên / xuống của bàn phím để cuộn qua các tùy chọn múi giờ. Nhấp vào nút để hiển thị thời gian hiện tại trong múi giờ đã chọn của bạn. Lấy thời gian Bước tiếp theo Chúc mừng bạn đã xây dựng ứng dụng GUI Python đầu tiên của mình với ! Như đã đề cập trong phần Giới thiệu, hướng dẫn này được thiết kế để giới thiệu cho bạn một vài khái niệm cơ bản. và tài liệu tham khảo được đề cập trước đó là hai tài nguyên tuyệt vời để giúp bạn tìm hiểu về các tính năng và chức năng Tkinter nâng cao hơn. Tkinter Tài liệu Thư viện tiêu chuẩn Python tài liệu lệnh Tk Các ứng dụng Tkinter GUI đôi khi bị chỉ trích là có giao diện không giống gốc. Điều đó có thể đúng. Nhưng các widget của bộ công cụ có khả năng cấu hình cao và các ứng dụng Tkinter GUI có thể được xây dựng tương đối nhanh chóng mà không cần phải cài đặt bất kỳ gói Python bên ngoài nào. Ngoài tài liệu chính thức, có vô số hướng dẫn có sẵn trên Internet để tìm hiểu về cách xây dựng các ứng dụng GUI phức tạp hơn với Tkinter.