Hướng dẫn python 3.10 tkinter - python 3.10 tkinter

Mã nguồn: lib/tkinter/__ init__.py Lib/tkinter/__init__.py


Gói

from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
9 (Giao diện TK TK) là giao diện Python tiêu chuẩn cho bộ công cụ GUI TCL/TK. Cả TK và
from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
9 đều có sẵn trên hầu hết các nền tảng Unix, bao gồm cả MacOS, cũng như trên các hệ thống Windows.

Chạy

ttk::frame .frm -padding 10
grid .frm
grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0
grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0
1 từ dòng lệnh sẽ mở cửa sổ thể hiện giao diện TK đơn giản, cho bạn biết rằng
from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
9 được cài đặt đúng trên hệ thống của bạn và cũng hiển thị phiên bản TCL/TK được cài đặt, vì vậy bạn có thể đọc tài liệu TCL/TK cụ thể đến phiên bản đó.

Tkinter hỗ trợ một loạt các phiên bản TCL/TK, được xây dựng có hoặc không có hỗ trợ chủ đề. Bản phát hành nhị phân Python chính thức gói TCL/TK 8.6 Chủ đề. Xem mã nguồn cho mô -đun

ttk::frame .frm -padding 10
grid .frm
grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0
grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0
3 để biết thêm thông tin về các phiên bản được hỗ trợ.

Tkinter không phải là một trình bao bọc mỏng, nhưng thêm một số lượng lớn logic của riêng mình để làm cho trải nghiệm trở nên pythonic hơn. Tài liệu này sẽ tập trung vào các bổ sung và thay đổi này, và tham khảo tài liệu chính thức của TCL/TK để biết các chi tiết không thay đổi.

Ghi chú

TCL/TK 8.5 (2007) đã giới thiệu một bộ các thành phần giao diện người dùng theo chủ đề hiện đại cùng với API mới để sử dụng chúng. Cả API cũ và mới vẫn có sẵn. Hầu hết các tài liệu bạn sẽ tìm thấy trực tuyến vẫn sử dụng API cũ và có thể lỗi thời.

Xem thêm

  • TKDocs

    Hướng dẫn mở rộng về việc tạo giao diện người dùng với Tkinter. Giải thích các khái niệm chính và minh họa các phương pháp được đề xuất bằng API hiện đại.

  • Tkinter 8.5 Tài liệu tham khảo: GUI cho Python

    Tài liệu tham khảo cho Tkinter 8.5 Chi tiết các lớp, phương thức và tùy chọn có sẵn.

Tài nguyên TCL/TK:

  • Các lệnh TK

    Tham chiếu toàn diện về từng lệnh TCL/TK cơ bản được sử dụng bởi Tkinter.

  • Trang chủ TCL/TK

    Tài liệu bổ sung và liên kết đến phát triển lõi TCL/TK.

Books:

  • Tkinter hiện đại cho các nhà phát triển Python bận rộn

    Của Mark Roseman. (ISBN 978-1999149567)

  • Lập trình Python và Tkinter

    Bởi Alan Moore. (ISBN 978-1788835886)

  • Lập trình Python

    Bởi Mark Lutz; Có phạm vi bảo hiểm tuyệt vời của Tkinter. (ISBN 978-0596158101)

  • TCL và bộ công cụ TK (Phiên bản thứ 2)

    Bởi John Ousterhout, nhà phát minh của TCL/TK và Ken Jones; Không bao gồm tkinter. (ISBN 978-0321336330)

Ngành kiến ​​​​trúc¶

TCL/TK không phải là một thư viện duy nhất mà là một vài mô -đun riêng biệt, mỗi mô -đun có chức năng riêng biệt và tài liệu chính thức của riêng nó. Các bản phát hành nhị phân Python sườn cũng gửi một mô-đun bổ sung cùng với nó.

TCL

TCL là một ngôn ngữ lập trình được giải thích năng động, giống như Python. Mặc dù nó có thể được sử dụng một mình như một ngôn ngữ lập trình đa năng, nhưng nó thường được nhúng vào các ứng dụng C như một công cụ kịch bản hoặc giao diện cho bộ công cụ TK. Thư viện TCL có giao diện C để tạo và quản lý một hoặc nhiều phiên bản của trình thông dịch TCL, chạy các lệnh và tập lệnh TCL trong các trường hợp đó và thêm các lệnh tùy chỉnh được triển khai trong TCL hoặc C. mỗi trình thông dịch có hàng đợi sự kiện và có các cơ sở để gửi các sự kiện cho nó và xử lý chúng. Không giống như Python, mô hình thực thi TCL, được thiết kế xung quanh đa nhiệm hợp tác và Tkinter cầu nối sự khác biệt này (xem mô hình luồng để biết chi tiết).

TK

TK là gói TCL được triển khai trong C thêm các lệnh tùy chỉnh để tạo và thao tác các tiện ích GUI. Mỗi đối tượng

ttk::frame .frm -padding 10
grid .frm
grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0
grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0
4 nhúng thể hiện thông dịch TCL của riêng mình với TK được tải vào nó. Các vật dụng TK TK rất có thể tùy chỉnh, mặc dù với chi phí xuất hiện trên ngày. TK sử dụng hàng đợi sự kiện TCL, để tạo và xử lý các sự kiện GUI.

TTK

TK theo chủ đề (TTK) là một gia đình TK mới hơn, cung cấp diện mạo tốt hơn nhiều trên các nền tảng khác nhau so với nhiều tiện ích TK cổ điển. TTK được phân phối như một phần của TK, bắt đầu với phiên bản TK 8.5. Các ràng buộc Python được cung cấp trong một mô -đun riêng,

ttk::frame .frm -padding 10
grid .frm
grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0
grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0
5.

Trong nội bộ, TK và TTK sử dụng các cơ sở của hệ điều hành cơ bản, tức là, XLIB trên UNIX/X11, Ca cao trên MacOS, GDI trên Windows.

Khi ứng dụng Python của bạn sử dụng một lớp trong Tkinter, ví dụ: để tạo tiện ích, mô -đun

from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
9 trước tiên lắp ráp chuỗi lệnh TCL/TK. Nó chuyển chuỗi lệnh TCL đó đến mô -đun nhị phân
ttk::frame .frm -padding 10
grid .frm
grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0
grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0
3 nội bộ, sau đó gọi trình thông dịch TCL để đánh giá nó. Trình thông dịch TCL sau đó sẽ gọi vào các gói TK và/hoặc TTK, từ đó sẽ thực hiện các cuộc gọi đến XLIB, Ca cao hoặc GDI.

Mô -đun Tkinter

Hỗ trợ cho Tkinter được trải đều trên một số mô -đun. Hầu hết các ứng dụng sẽ cần mô -đun chính

from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
9, cũng như mô -đun
ttk::frame .frm -padding 10
grid .frm
grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0
grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0
5, cung cấp bộ tiện ích theo chủ đề hiện đại và API:

from tkinter import *
from tkinter import ttk

Lớp ________ 30 ________ 31 (ScreenRame = none, basename = none, className = 'tk', usetk = true, sync = false(screenName=None, baseName=None, className='Tk', useTk=True, sync=False, use=None)

Xây dựng một tiện ích TK TK, thường là cửa sổ chính của ứng dụng và khởi tạo trình thông dịch TCL cho tiện ích này. Mỗi trường hợp có trình thông dịch TCL liên quan riêng.

Lớp

ttk::frame .frm -padding 10
grid .frm
grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0
grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0
4 thường được khởi tạo bằng tất cả các giá trị mặc định. Tuy nhiên, các đối số từ khóa sau đây hiện đang được công nhận:

Tên hiển thị

Khi được đưa ra (dưới dạng chuỗi), đặt biến môi trường

btn = ttk.Button(frm, ...)
print(btn.configure().keys())
3. (Chỉ x11)
btn = ttk.Button(frm, ...)
print(btn.configure().keys())
3 environment variable. (X11 only)

Basename

Tên của tệp hồ sơ. Theo mặc định, basename có nguồn gốc từ tên chương trình (

btn = ttk.Button(frm, ...)
print(btn.configure().keys())
4).

tên lớp

Tên của lớp Widget. Được sử dụng làm tệp hồ sơ và cũng là tên mà TCL được gọi (argv0 trong interp).

Usetk

Nếu

btn = ttk.Button(frm, ...)
print(btn.configure().keys())
5, khởi tạo hệ thống con TK. Hàm
btn = ttk.Button(frm, ...)
print(btn.configure().keys())
6 đặt điều này thành
btn = ttk.Button(frm, ...)
print(btn.configure().keys())
7.

đồng bộ hóa

Nếu

btn = ttk.Button(frm, ...)
print(btn.configure().keys())
5, thực thi tất cả các lệnh máy chủ X một cách đồng bộ, để các lỗi được báo cáo ngay lập tức. Có thể được sử dụng để gỡ lỗi. (Chỉ x11)

sử dụng

Chỉ định ID của cửa sổ để nhúng ứng dụng, thay vì nó được tạo như một cửa sổ Toplevel độc lập. ID phải được chỉ định theo cách tương tự như giá trị cho tùy chọn -use cho các widget toplevel (nghĩa là nó có một hình thức như thế được trả về bởi

btn = ttk.Button(frm, ...)
print(btn.configure().keys())
9).

Lưu ý rằng trên một số nền tảng, điều này sẽ chỉ hoạt động chính xác nếu ID đề cập đến khung TK hoặc Toplevel có tùy chọn -Container của nó được bật.

ttk::frame .frm -padding 10
grid .frm
grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0
grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0
4 Đọc và diễn giải các tệp hồ sơ, được đặt tên là
print(set(btn.configure().keys()) - set(frm.configure().keys()))
1 và
print(set(btn.configure().keys()) - set(frm.configure().keys()))
2, vào trình thông dịch TCL và gọi
print(set(btn.configure().keys()) - set(frm.configure().keys()))
3 về nội dung của
print(set(btn.configure().keys()) - set(frm.configure().keys()))
4 và
print(set(btn.configure().keys()) - set(frm.configure().keys()))
5. Đường dẫn cho các tệp hồ sơ là biến môi trường
print(set(btn.configure().keys()) - set(frm.configure().keys()))
6 hoặc, nếu đó không được xác định, thì
print(set(btn.configure().keys()) - set(frm.configure().keys()))
7.
print(set(btn.configure().keys()) - set(frm.configure().keys()))
6 environment variable or, if that isn’t defined, then
print(set(btn.configure().keys()) - set(frm.configure().keys()))
7.

________ 48¶

Đối tượng ứng dụng TK được tạo bằng cách khởi tạo

ttk::frame .frm -padding 10
grid .frm
grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0
grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0
4. Điều này cung cấp quyền truy cập vào phiên dịch TCL. Mỗi tiện ích được đính kèm cùng một phiên bản của
ttk::frame .frm -padding 10
grid .frm
grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0
grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0
4 có cùng giá trị cho thuộc tính
print(dir(btn))
print(set(dir(btn)) - set(dir(frm)))
1 của nó.

________ 52¶

Đối tượng Widget chứa tiện ích này. Đối với

ttk::frame .frm -padding 10
grid .frm
grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0
grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0
4, chủ là
print(dir(btn))
print(set(dir(btn)) - set(dir(frm)))
4 vì nó là cửa sổ chính. Các thuật ngữ chủ và phụ huynh là tương tự nhau và đôi khi được sử dụng thay thế cho tên đối số; Tuy nhiên, gọi
print(dir(btn))
print(set(dir(btn)) - set(dir(frm)))
5 trả về một chuỗi của tên tiện ích trong khi
print(dir(btn))
print(set(dir(btn)) - set(dir(frm)))
6 trả về đối tượng. Cha mẹ/con phản ánh mối quan hệ giống như cây trong khi Master/Slave phản ánh cấu trúc container.

________ 57¶

Hậu duệ ngay lập tức của tiện ích này dưới dạng

print(dir(btn))
print(set(dir(btn)) - set(dir(frm)))
8 với tên tiện ích con là các phím và đối tượng cá thể con là các giá trị.

________ 30 ________ 60 (ScreenRame = none, basename = none(screenName=None, baseName=None, className='Tk', useTk=False)

Hàm

destroy .
grid .frm.btn -column 0 -row 0
1 là một hàm nhà máy tạo ra một đối tượng giống như được tạo bởi lớp
ttk::frame .frm -padding 10
grid .frm
grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0
grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0
4, ngoại trừ việc nó không khởi tạo hệ thống con TK. Điều này thường hữu ích nhất khi lái trình thông dịch TCL trong môi trường mà người ta không muốn tạo các cửa sổ Toplevel bên ngoài hoặc nơi người ta không thể (như hệ thống Unix/Linux không có máy chủ X). Một đối tượng được tạo bởi đối tượng
destroy .
grid .frm.btn -column 0 -row 0
1 có thể có một cửa sổ Toplevel (và hệ thống con TK được khởi tạo) bằng cách gọi phương thức
destroy .
grid .frm.btn -column 0 -row 0
4 của nó.

Các mô -đun cung cấp hỗ trợ TK bao gồm:

from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
9

Mô -đun Tkinter chính.

destroy .
grid .frm.btn -column 0 -row 0
6

Hộp thoại để cho người dùng chọn một màu.

destroy .
grid .frm.btn -column 0 -row 0
7

Lớp cơ sở cho các hộp thoại được xác định trong các mô -đun khác được liệt kê ở đây.

destroy .
grid .frm.btn -column 0 -row 0
8

Hộp thoại phổ biến để cho phép người dùng chỉ định một tệp để mở hoặc lưu.

destroy .
grid .frm.btn -column 0 -row 0
9

Các tiện ích để giúp làm việc với phông chữ.

.frm.btn invoke
.frm.lbl configure -text "Goodbye"
0

Truy cập vào hộp thoại TK tiêu chuẩn.

.frm.btn invoke
.frm.lbl configure -text "Goodbye"
1

Tiện ích văn bản với một thanh cuộn dọc được tích hợp.

.frm.btn invoke
.frm.lbl configure -text "Goodbye"
2

Hộp thoại cơ bản và các chức năng tiện lợi.

ttk::frame .frm -padding 10
grid .frm
grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0
grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0
5

Bộ tiện ích theo chủ đề được giới thiệu trong TK 8.5, cung cấp các lựa chọn thay thế hiện đại cho nhiều tiện ích cổ điển trong mô -đun chính

from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
9.

Các mô -đun bổ sung:

ttk::frame .frm -padding 10
grid .frm
grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0
grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0
3

Một mô-đun nhị phân chứa giao diện cấp thấp với TCL/TK. Nó được tự động nhập bởi mô -đun chính

from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
9 và không bao giờ được sử dụng trực tiếp bởi các lập trình viên ứng dụng. Nó thường là một thư viện được chia sẻ (hoặc DLL), nhưng trong một số trường hợp có thể được liên kết tĩnh với trình thông dịch Python.

.frm.btn invoke
.frm.lbl configure -text "Goodbye"
7

Python sườn tích hợp phát triển và môi trường học tập (IDLE). Dựa trên

from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
9.

.frm.btn invoke
.frm.lbl configure -text "Goodbye"
9

Các hằng số biểu tượng có thể được sử dụng thay cho các chuỗi khi chuyển các tham số khác nhau cho các cuộc gọi Tkinter. Tự động nhập bởi mô -đun chính

from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
9.

fred = Button(self, fg="red", bg="blue")
1

(Thử nghiệm) Hỗ trợ kéo và thả cho

from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
9. Điều này sẽ trở nên không dùng nữa khi nó được thay thế bằng TK DND.

fred = Button(self, fg="red", bg="blue")
3

. Các lựa chọn thay thế tốt hơn cho hầu hết có thể được tìm thấy trong

ttk::frame .frm -padding 10
grid .frm
grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0
grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0
5.

fred = Button(self, fg="red", bg="blue")
5

Đồ họa rùa trong cửa sổ TK.

Người bảo thủ cuộc sống Tkinter

Phần này không được thiết kế để trở thành một hướng dẫn đầy đủ về TK hoặc Tkinter. Đối với điều đó, hãy tham khảo một trong những tài nguyên bên ngoài được ghi nhận trước đó. Thay vào đó, phần này cung cấp một định hướng rất nhanh cho ứng dụng Tkinter trông như thế nào, xác định các khái niệm TK nền tảng và giải thích cách cấu trúc trình bao bọc Tkinter.

Phần còn lại của phần này sẽ giúp bạn xác định các lớp, phương thức và tùy chọn mà bạn sẽ cần trong ứng dụng Tkinter của mình và nơi tìm tài liệu chi tiết hơn về chúng, bao gồm trong hướng dẫn tham khảo TCL/TK chính thức.

Chương trình Hello World¶

Chúng tôi sẽ bắt đầu bằng cách đi qua một ứng dụng Hello Hello World trong Tkinter. Đây là một loại nhỏ nhất mà chúng tôi có thể viết, nhưng có đủ để minh họa một số khái niệm chính mà bạn sẽ cần biết.

from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()

Sau khi nhập, dòng tiếp theo tạo ra một thể hiện của lớp

ttk::frame .frm -padding 10
grid .frm
grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0
grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0
4, khởi tạo TK và tạo trình thông dịch TCL liên quan của nó. Nó cũng tạo ra một cửa sổ Toplevel, được gọi là cửa sổ gốc, đóng vai trò là cửa sổ chính của ứng dụng.

Dòng sau tạo một tiện ích khung, trong trường hợp này sẽ chứa một nhãn và nút mà chúng tôi sẽ tạo tiếp theo. Khung phù hợp bên trong cửa sổ gốc.

Dòng tiếp theo tạo một tiện ích nhãn giữ một chuỗi văn bản tĩnh. Phương pháp

fred = Button(self, fg="red", bg="blue")
7 được sử dụng để chỉ định bố cục tương đối (vị trí) của nhãn trong tiện ích khung chứa của nó, tương tự như cách các bảng trong HTML hoạt động.

Một tiện ích nút sau đó được tạo và đặt ở bên phải của nhãn. Khi được nhấn, nó sẽ gọi phương thức

fred = Button(self, fg="red", bg="blue")
8 của cửa sổ gốc.

Cuối cùng, phương thức

fred = Button(self, fg="red", bg="blue")
9 đặt mọi thứ lên màn hình và phản hồi đầu vào của người dùng cho đến khi chương trình chấm dứt.

Khái niệm TK quan trọng

Ngay cả chương trình đơn giản này cũng minh họa các khái niệm TK chính sau:

Widgets

Một giao diện người dùng Tkinter được tạo thành từ các tiện ích riêng lẻ. Mỗi tiện ích được biểu diễn dưới dạng đối tượng Python, được khởi tạo từ các lớp như

fred["fg"] = "red"
fred["bg"] = "blue"
0,
fred["fg"] = "red"
fred["bg"] = "blue"
1 và
fred["fg"] = "red"
fred["bg"] = "blue"
2.

Phân cấp Widget

Các vật dụng được sắp xếp trong một hệ thống phân cấp. Nhãn và nút được chứa trong một khung, lần lượt được chứa trong cửa sổ gốc. Khi tạo mỗi tiện ích trẻ em, tiện ích cha mẹ của nó được chuyển làm đối số đầu tiên cho hàm tạo tiện ích.

Tùy chọn cấu hình

Các tiện ích có các tùy chọn cấu hình, sửa đổi sự xuất hiện và hành vi của chúng, chẳng hạn như văn bản để hiển thị trong nhãn hoặc nút. Các lớp tiện ích khác nhau sẽ có các bộ tùy chọn khác nhau.

Quản lý hình học

Các widget aren tự động được thêm vào giao diện người dùng khi chúng được tạo. Trình quản lý hình học như

fred["fg"] = "red"
fred["bg"] = "blue"
3 điều khiển trong đó trong giao diện người dùng chúng được đặt.

Vòng lặp sự kiện

Tkinter phản ứng với đầu vào của người dùng, thay đổi từ chương trình của bạn và thậm chí làm mới màn hình chỉ khi tích cực chạy vòng lặp sự kiện. Nếu chương trình của bạn không chạy vòng lặp sự kiện, giao diện người dùng của bạn sẽ cập nhật.

Hiểu cách Tkinter kết thúc TCL/TK¶

Khi ứng dụng của bạn sử dụng các lớp và phương thức của Tkinter, Tkinter nội bộ đang lắp ráp các chuỗi đại diện cho các lệnh TCL/TK và thực hiện các lệnh đó trong trình thông dịch TCL được đính kèm với phiên bản Ứng dụng ____ của bạn.

Cho dù đó là cố gắng điều hướng tài liệu tham khảo, cố gắng tìm phương thức hoặc tùy chọn phù hợp, điều chỉnh một số mã hiện có hoặc gỡ lỗi ứng dụng Tkinter của bạn, có những lúc sẽ hữu ích khi hiểu các lệnh TCL/TK bên dưới như thế nào.

Để minh họa, đây là TCL/TK tương đương với phần chính của tập lệnh Tkinter ở trên.

ttk::frame .frm -padding 10
grid .frm
grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0
grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0

Cú pháp TCL TCL tương tự như nhiều ngôn ngữ shell, trong đó từ đầu tiên là lệnh được thực thi, với các đối số cho lệnh đó theo nó, được phân tách bằng không gian. Không cần phải hiểu quá nhiều chi tiết, hãy chú ý những điều sau:

  • Các lệnh được sử dụng để tạo các tiện ích (như

    fred["fg"] = "red"
    fred["bg"] = "blue"
    
    5) tương ứng với các lớp Widget trong Tkinter.

  • Tùy chọn tiện ích TCL (như

    fred["fg"] = "red"
    fred["bg"] = "blue"
    
    6) tương ứng với các đối số từ khóa trong tkinter.

  • Các widget được đề cập bởi một tên đường dẫn trong TCL (như

    fred["fg"] = "red"
    fred["bg"] = "blue"
    
    7), trong khi Tkinter không sử dụng tên nhưng tham chiếu đối tượng.

  • Một vị trí của Widget trong hệ thống phân cấp tiện ích được mã hóa theo tên đường dẫn (phân cấp) của nó, sử dụng

    fred["fg"] = "red"
    fred["bg"] = "blue"
    
    8 (DOT) làm dấu phân cách đường dẫn. Tên đường dẫn cho cửa sổ gốc chỉ là
    fred["fg"] = "red"
    fred["bg"] = "blue"
    
    8 (dấu chấm). Trong Tkinter, hệ thống phân cấp được xác định không phải bằng tên đường dẫn mà bằng cách chỉ định tiện ích cha khi tạo mỗi tiện ích con.

  • Các hoạt động được triển khai dưới dạng các lệnh riêng biệt trong TCL (như

    fred["fg"] = "red"
    fred["bg"] = "blue"
    
    3 hoặc
    from tkinter import *
    from tkinter import ttk
    root = Tk()
    frm = ttk.Frame(root, padding=10)
    frm.grid()
    ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
    ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
    root.mainloop()
    
    01) được biểu diễn dưới dạng các phương thức trên các đối tượng Tkyter Widget. Như bạn sẽ thấy trong thời gian ngắn, vào những thời điểm khác, TCL sử dụng những gì dường như là các cuộc gọi phương thức trên các đối tượng Widget, mà phản ánh chặt chẽ hơn những gì sẽ được sử dụng trong Tkinter.

Làm thế nào để tôi…? Lựa chọn nào…? ¶

Nếu bạn không chắc chắn làm thế nào để làm điều gì đó trong Tkinter và bạn có thể ngay lập tức tìm thấy nó trong tài liệu hướng dẫn hoặc tham chiếu mà bạn sử dụng, có một vài chiến lược có thể hữu ích.

Đầu tiên, hãy nhớ rằng các chi tiết về cách thức hoạt động của các tiện ích riêng lẻ có thể thay đổi giữa các phiên bản khác nhau của cả Tkinter và TCL/TK. Nếu bạn đang tìm kiếm tài liệu, hãy đảm bảo nó tương ứng với các phiên bản Python và TCL/TK được cài đặt trên hệ thống của bạn.

Khi tìm kiếm cách sử dụng API, nó giúp biết tên chính xác của lớp, tùy chọn hoặc phương thức mà bạn sử dụng. Hướng nội, trong một vỏ python tương tác hoặc với

from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
02, có thể giúp bạn xác định những gì bạn cần.

Để tìm hiểu những tùy chọn cấu hình nào có sẵn trên bất kỳ tiện ích nào, hãy gọi phương thức

from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
03 của nó, trả về một từ điển chứa nhiều thông tin khác nhau về mỗi đối tượng, bao gồm các giá trị mặc định và hiện tại của nó. Sử dụng
from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
04 để chỉ nhận tên của mỗi tùy chọn.

btn = ttk.Button(frm, ...)
print(btn.configure().keys())

Vì hầu hết các tiện ích có nhiều tùy chọn cấu hình chung, nên có thể hữu ích để tìm ra loại nào cụ thể cho một lớp tiện ích cụ thể. So sánh danh sách các tùy chọn với một tiện ích đơn giản hơn, giống như một khung, là một cách để làm điều đó.

print(set(btn.configure().keys()) - set(frm.configure().keys()))

Tương tự, bạn có thể tìm thấy các phương thức có sẵn cho một đối tượng Widget bằng hàm

from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
05 tiêu chuẩn. Nếu bạn thử nó, bạn sẽ thấy có hơn 200 phương thức tiện ích phổ biến, vì vậy một lần nữa, việc xác định các phương thức cụ thể cho một lớp tiện ích là hữu ích.

print(dir(btn))
print(set(dir(btn)) - set(dir(frm)))

Điều hướng hướng dẫn tham khảo TCL/TK

Như đã lưu ý, Hướng dẫn tham khảo Lệnh TK chính thức (trang Man) thường là mô tả chính xác nhất về những gì hoạt động cụ thể trên các widget làm. Ngay cả khi bạn biết tên của tùy chọn hoặc phương thức mà bạn cần, bạn vẫn có thể có một vài nơi để xem.

Mặc dù tất cả các hoạt động trong Tkinter được triển khai dưới dạng các cuộc gọi phương thức trên các đối tượng Widget, nhưng bạn đã thấy rằng nhiều hoạt động TCL/TK xuất hiện dưới dạng các lệnh lấy tên đường dẫn tiện ích làm tham số đầu tiên của nó, theo sau là các tham số tùy chọn, ví dụ:

destroy .
grid .frm.btn -column 0 -row 0

Tuy nhiên, những người khác trông giống như các phương thức được gọi trên một đối tượng Widget (trên thực tế, khi bạn tạo một tiện ích trong TCL/TK, nó sẽ tạo một lệnh TCL với tên của đường dẫn tiện ích, với tham số đầu tiên cho lệnh đó là tên của một phương thức để gọi).

.frm.btn invoke
.frm.lbl configure -text "Goodbye"

Trong tài liệu tham khảo chính thức của TCL/TK, bạn sẽ tìm thấy hầu hết các hoạt động trông giống như phương thức gọi trên trang người đàn ông cho một tiện ích cụ thể (ví dụ: bạn sẽ tìm thấy phương thức

from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
06 trên trang TTK :: Nút Man), trong khi các chức năng Đó là một tiện ích làm tham số thường có trang người đàn ông riêng của họ (ví dụ: lưới).

Bạn sẽ tìm thấy nhiều tùy chọn và phương thức phổ biến trong các tùy chọn hoặc TTK :: Widget Man Pages, trong khi các trang khác được tìm thấy trong trang người đàn ông cho một lớp tiện ích cụ thể.

Bạn cũng sẽ thấy rằng nhiều phương pháp Tkinter có tên ghép, ví dụ:

from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
07,
from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
08,
from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
09. Bạn có thể tìm thấy tài liệu cho tất cả những điều này trong trang Winfo Man.

Ghi chú

Một cách khó hiểu, cũng có các phương pháp trên tất cả các tiện ích Tkinter mà don thực sự hoạt động trên tiện ích, nhưng hoạt động ở một phạm vi toàn cầu, không phụ thuộc vào bất kỳ tiện ích nào. Ví dụ là các phương pháp để truy cập vào bảng tạm hoặc chuông hệ thống. .

Mô hình luồng

Python và TCL/TK có các mô hình luồng rất khác nhau,

from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
9 cố gắng cầu nối. Nếu bạn sử dụng các chủ đề, bạn có thể cần phải nhận thức được điều này.

Một thông dịch viên Python có thể có nhiều chủ đề được liên kết với nó. Trong TCL, nhiều luồng có thể được tạo, nhưng mỗi luồng có một phiên bản phiên dịch TCL riêng biệt được liên kết với nó. Các luồng cũng có thể tạo nhiều hơn một phiên bản phiên dịch, mặc dù mỗi phiên bản phiên dịch chỉ có thể được sử dụng bởi một luồng tạo nó.

Mỗi đối tượng

ttk::frame .frm -padding 10
grid .frm
grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0
grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0
4 được tạo bởi
from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
9 chứa trình thông dịch TCL. Nó cũng theo dõi chủ đề nào đã tạo ra trình thông dịch đó. Các cuộc gọi đến
from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
9 có thể được thực hiện từ bất kỳ luồng Python nào. Trong nội bộ, nếu một cuộc gọi đến từ một luồng khác với cuộc gọi đã tạo đối tượng
ttk::frame .frm -padding 10
grid .frm
grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0
grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0
4, một sự kiện sẽ được đăng lên hàng đợi sự kiện phiên dịch và khi được thực hiện, kết quả sẽ được trả lại cho chuỗi cuộc gọi Python.

Các ứng dụng TCL/TK thường dựa trên sự kiện, có nghĩa là sau khi khởi tạo, trình thông dịch chạy một vòng lặp sự kiện (tức là

from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
16) và phản hồi các sự kiện. Bởi vì nó là một luồng đơn, người xử lý sự kiện phải phản hồi nhanh chóng, nếu không họ sẽ chặn các sự kiện khác được xử lý. Để tránh điều này, bất kỳ tính toán dài nào không nên chạy trong một trình xử lý sự kiện, mà được chia thành các phần nhỏ hơn bằng cách sử dụng bộ hẹn giờ hoặc chạy trong một luồng khác. Điều này khác với nhiều bộ công cụ GUI nơi GUI chạy trong một luồng hoàn toàn riêng biệt với tất cả các mã ứng dụng bao gồm cả trình xử lý sự kiện.

Nếu trình thông dịch TCL không chạy vòng lặp sự kiện và các sự kiện xử lý, bất kỳ cuộc gọi

from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
9 nào được thực hiện từ các luồng khác với cuộc gọi chạy trình thông dịch TCL sẽ thất bại.

Một số trường hợp đặc biệt tồn tại:

  • Các thư viện TCL/TK có thể được xây dựng để chúng không nhận thức được chủ đề. Trong trường hợp này,

    from tkinter import *
    from tkinter import ttk
    root = Tk()
    frm = ttk.Frame(root, padding=10)
    frm.grid()
    ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
    ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
    root.mainloop()
    
    9 gọi thư viện từ luồng Python gốc, ngay cả khi điều này khác với luồng tạo trình thông dịch TCL. Một khóa toàn cầu đảm bảo chỉ có một cuộc gọi xảy ra tại một thời điểm.

  • Mặc dù

    from tkinter import *
    from tkinter import ttk
    root = Tk()
    frm = ttk.Frame(root, padding=10)
    frm.grid()
    ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
    ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
    root.mainloop()
    
    9 cho phép bạn tạo nhiều hơn một phiên bản của đối tượng
    ttk::frame .frm -padding 10
    grid .frm
    grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0
    grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0
    
    4 (với trình phiên dịch riêng), tất cả các phiên dịch là một phần của cùng một chủ đề đều có chung hàng đợi sự kiện phổ biến, nhanh chóng xấu xí. Trong thực tế, don lồng tạo ra nhiều hơn một trường hợp của
    ttk::frame .frm -padding 10
    grid .frm
    grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0
    grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0
    
    4 cùng một lúc. Mặt khác, nó tốt nhất để tạo chúng trong các luồng riêng biệt và đảm bảo bạn đang chạy bản dựng TCL/TK nhận biết luồng.

  • Chặn các trình xử lý sự kiện không phải là cách duy nhất để ngăn trình thông dịch TCL nhập lại vòng lặp sự kiện. Thậm chí có thể chạy nhiều vòng lặp sự kiện lồng nhau hoặc từ bỏ hoàn toàn vòng lặp sự kiện. Nếu bạn làm bất cứ điều gì khó khăn khi nói đến các sự kiện hoặc chủ đề, hãy nhận thức được những khả năng này.

  • Có một vài chức năng chọn lọc

    from tkinter import *
    from tkinter import ttk
    root = Tk()
    frm = ttk.Frame(root, padding=10)
    frm.grid()
    ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
    ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
    root.mainloop()
    
    9 hiện chỉ hoạt động khi được gọi từ luồng tạo trình thông dịch TCL.

Tài liệu tham khảo tiện dụng

Cài đặt Tùy chọn Jo

Tùy chọn kiểm soát những thứ như màu sắc và chiều rộng đường viền của một tiện ích. Các tùy chọn có thể được đặt theo ba cách:

Tại thời điểm tạo đối tượng, sử dụng các đối số từ khóa

fred = Button(self, fg="red", bg="blue")

Sau khi tạo đối tượng, xử lý tên tùy chọn như chỉ mục từ điển

fred["fg"] = "red"
fred["bg"] = "blue"

Sử dụng phương thức config () để cập nhật nhiều attrs sau để tạo đối tượng

from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
0

Để có lời giải thích đầy đủ về một tùy chọn nhất định và hành vi của nó, hãy xem các trang TK Man để biết tiện ích trong câu hỏi.

Lưu ý rằng các trang người đàn ông liệt kê các tùy chọn tiêu chuẩn của các tùy chọn và các tùy chọn cụ thể của Widget Widget cho mỗi tiện ích. Cái trước là danh sách các tùy chọn phổ biến cho nhiều tiện ích, sau này là các tùy chọn đặc biệt với tiện ích cụ thể đó. Các tùy chọn tiêu chuẩn được ghi lại trên trang người đàn ông tùy chọn (3).

Không có sự khác biệt giữa các tùy chọn tiêu chuẩn và tiện ích cụ thể được thực hiện trong tài liệu này. Một số tùy chọn don lồng áp dụng cho một số loại vật dụng. Việc một tiện ích nhất định có phản hồi với một tùy chọn cụ thể hay không phụ thuộc vào lớp của tiện ích; Các nút có tùy chọn

from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
23, nhãn thì không.

Các tùy chọn được hỗ trợ bởi một tiện ích nhất định được liệt kê trong trang Widget Man Man hoặc có thể được truy vấn trong thời gian chạy bằng cách gọi phương thức

from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
24 mà không có đối số hoặc bằng cách gọi phương thức
from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
04 trên tiện ích đó. Giá trị trả về của các cuộc gọi này là một từ điển có khóa là tên của tùy chọn dưới dạng chuỗi (ví dụ:
from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
26) và có giá trị là 5 bộ.

Một số tùy chọn, như

from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
27 là từ đồng nghĩa với các tùy chọn phổ biến với tên dài (
from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
27 là tốc ký cho nền tảng của Hồi giáo). Vượt qua phương thức
from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
24 Tên của tùy chọn tốc ký sẽ trả về 2-tuple chứ không phải 5-tuple. 2-Tuple được truyền lại sẽ chứa tên của từ đồng nghĩa và tùy chọn thực tế của người dùng (chẳng hạn như
from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
30).

Mục lục

Nghĩa

Thí dụ

0

Tên tùy chọn

from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
26

1

Tên tùy chọn để tra cứu cơ sở dữ liệu

from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
26

2

Lớp tùy chọn để tra cứu cơ sở dữ liệu

from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
33

3

giá trị mặc định

from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
34

4

giá trị hiện tại

from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
35

Example:

from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
1

Tất nhiên, từ điển được in sẽ bao gồm tất cả các tùy chọn có sẵn và giá trị của chúng. Điều này chỉ có nghĩa là một ví dụ.

Packer¶

Packer là một trong những cơ chế quản lý hình học TK TK. Các nhà quản lý hình học được sử dụng để chỉ định vị trí tương đối của các vật dụng trong thùng chứa của họ - chủ nhân của chúng. Trái ngược với vị trí cồng kềnh hơn (được sử dụng ít phổ biến hơn và chúng tôi không bao gồm ở đây), người đóng gói có đặc điểm kỹ thuật về mối quan hệ định tính - ở trên, ở bên trái, làm đầy, v.v. - và thực hiện mọi thứ để xác định tọa độ vị trí chính xác cho bạn.

Kích thước của bất kỳ tiện ích chính nào được xác định bởi kích thước của các tiện ích nô lệ trên bên trong. Packer được sử dụng để kiểm soát nơi các tiện ích nô lệ xuất hiện bên trong chủ mà chúng được đóng gói. Bạn có thể đóng gói các widget vào khung và khung vào các khung khác, để đạt được loại bố cục mà bạn mong muốn. Ngoài ra, sự sắp xếp được điều chỉnh động để phù hợp với các thay đổi gia tăng đối với cấu hình, một khi nó được đóng gói.

Lưu ý rằng các widget không xuất hiện cho đến khi họ có hình học được chỉ định với trình quản lý hình học. Đó là một sai lầm sớm phổ biến để bỏ qua đặc điểm kỹ thuật hình học, và sau đó ngạc nhiên khi tiện ích được tạo nhưng không có gì xuất hiện. Một tiện ích sẽ chỉ xuất hiện sau khi nó có phương thức Packer

from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
36 được áp dụng cho nó.

Phương thức Gói () có thể được gọi với các cặp tùy chọn từ khóa/giá trị kiểm soát trong đó tiện ích sẽ xuất hiện trong thùng chứa của nó và cách hoạt động khi cửa sổ ứng dụng chính được thay đổi kích thước. Dưới đây là một số ví dụ:

from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
2

Tùy chọn Packer

Để biết thêm thông tin sâu rộng về Packer và các tùy chọn có thể thực hiện, hãy xem các trang Man và trang 183 của cuốn sách John Ousterhout.

mỏ neo

Loại neo. Biểu thị nơi người đóng gói đặt mỗi nô lệ trong bưu kiện của nó.

mở rộng

Boolean,

from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
37 hoặc
from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
38.

lấp đầy

Giá trị pháp lý:

from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
39,
from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
40,
from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
41,
from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
42.

iPadx và iPady

Một khoảng cách - chỉ định đệm nội bộ ở mỗi bên của tiện ích nô lệ.

Padx và Pady

Một khoảng cách - chỉ định đệm bên ngoài ở mỗi bên của tiện ích nô lệ.

cạnh

Các giá trị pháp lý là:

from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
43,
from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
44,
from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
45,
from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
46.

Các biến tiện ích ghép nối

Cài đặt giá trị hiện tại của một số tiện ích (như các tiện ích nhập văn bản) có thể được kết nối trực tiếp với các biến ứng dụng bằng cách sử dụng các tùy chọn đặc biệt. Các tùy chọn này là

from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
47,
from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
48,
from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
49,
from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
50 và
from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
51. Kết nối này hoạt động cả hai cách: nếu biến thay đổi vì bất kỳ lý do gì, thì tiện ích mà nó kết nối với sẽ được cập nhật để phản ánh giá trị mới.

Thật không may, trong quá trình triển khai hiện tại của

from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
9, không thể bàn giao biến Python tùy ý cho một tiện ích thông qua tùy chọn
from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
47 hoặc
from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
48. Các loại biến duy nhất mà các tác phẩm này là các biến được phân lớp từ một lớp gọi là biến, được định nghĩa trong
from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
9.

Có nhiều lớp con hữu ích của biến đã được xác định:

from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
56,
from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
57,
from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
58 và
from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
59. Để đọc giá trị hiện tại của một biến như vậy, hãy gọi phương thức
from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
60 trên nó và để thay đổi giá trị của nó, bạn gọi phương thức
from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
61. Nếu bạn tuân theo giao thức này, tiện ích sẽ luôn theo dõi giá trị của biến, không có sự can thiệp nào khác về phía bạn.

Ví dụ:

from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
3

Người quản lý cửa sổ

Trong TK, có một lệnh tiện ích,

from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
62, để tương tác với trình quản lý cửa sổ. Các tùy chọn cho lệnh
from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
62 cho phép bạn kiểm soát những thứ như tiêu đề, vị trí, bitmap biểu tượng và tương tự. Trong
from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
9, các lệnh này đã được thực hiện dưới dạng các phương thức trên lớp
from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
65. Các tiện ích Toplevel được phân lớp từ lớp
from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
65 và do đó có thể gọi trực tiếp các phương thức
from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
65.

Để có được ở cửa sổ Toplevel có chứa một tiện ích nhất định, bạn thường chỉ có thể tham khảo Widget Master Master. Tất nhiên, nếu tiện ích đã được đóng gói bên trong một khung, Master won đã đại diện cho một cửa sổ Toplevel. Để có được ở cửa sổ Toplevel có chứa tiện ích tùy ý, bạn có thể gọi phương thức

from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
68. Phương pháp này bắt đầu bằng một dấu gạch dưới để biểu thị thực tế rằng chức năng này là một phần của việc thực hiện và không phải là giao diện cho chức năng TK.

Dưới đây là một số ví dụ về cách sử dụng điển hình:

from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
4

Các loại dữ liệu tùy chọn TK

mỏ neo

Loại neo. Biểu thị nơi người đóng gói đặt mỗi nô lệ trong bưu kiện của nó.

mở rộng

Boolean,

from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
37 hoặc
from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
38.

boolean

lấp đầy

Giá trị pháp lý:
from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
39,
from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
40,
from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
41,
from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
42.

iPadx và iPady

from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
5

Một khoảng cách - chỉ định đệm nội bộ ở mỗi bên của tiện ích nô lệ.

Padx và Pady

Một khoảng cách - chỉ định đệm bên ngoài ở mỗi bên của tiện ích nô lệ.

cạnh

Các giá trị pháp lý là:
from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
43,
from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
44,
from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
45,
from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
46.

Các biến tiện ích ghép nối

Cài đặt giá trị hiện tại của một số tiện ích (như các tiện ích nhập văn bản) có thể được kết nối trực tiếp với các biến ứng dụng bằng cách sử dụng các tùy chọn đặc biệt. Các tùy chọn này là
from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
47,
from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
48,
from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
49,
from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
50 và
from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
51. Kết nối này hoạt động cả hai cách: nếu biến thay đổi vì bất kỳ lý do gì, thì tiện ích mà nó kết nối với sẽ được cập nhật để phản ánh giá trị mới.

Thật không may, trong quá trình triển khai hiện tại của

from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
9, không thể bàn giao biến Python tùy ý cho một tiện ích thông qua tùy chọn
from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
47 hoặc
from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
48. Các loại biến duy nhất mà các tác phẩm này là các biến được phân lớp từ một lớp gọi là biến, được định nghĩa trong
from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
9.

hình học

Đây là một chuỗi của mẫu

ttk::frame .frm -padding 10
grid .frm
grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0
grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0
04, trong đó chiều rộng và chiều cao được đo bằng pixel cho hầu hết các tiện ích (tính bằng các ký tự cho các widget hiển thị văn bản). Ví dụ:
ttk::frame .frm -padding 10
grid .frm
grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0
grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0
05.

Biện minh

Các giá trị pháp lý là các chuỗi:

ttk::frame .frm -padding 10
grid .frm
grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0
grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0
06,
from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
77,
ttk::frame .frm -padding 10
grid .frm
grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0
grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0
08 và
ttk::frame .frm -padding 10
grid .frm
grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0
grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0
09.

vùng đất

Đây là một chuỗi có bốn yếu tố được phân phối không gian, mỗi yếu tố là một khoảng cách hợp pháp (xem ở trên). Ví dụ:

ttk::frame .frm -padding 10
grid .frm
grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0
grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0
10 và
ttk::frame .frm -padding 10
grid .frm
grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0
grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0
11 và
ttk::frame .frm -padding 10
grid .frm
grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0
grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0
12 đều là các khu vực pháp lý.

sự cứu tế

Xác định phong cách biên giới của một tiện ích sẽ là gì. Các giá trị pháp lý là:

ttk::frame .frm -padding 10
grid .frm
grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0
grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0
13,
ttk::frame .frm -padding 10
grid .frm
grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0
grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0
14,
ttk::frame .frm -padding 10
grid .frm
grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0
grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0
15,
ttk::frame .frm -padding 10
grid .frm
grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0
grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0
16 và
ttk::frame .frm -padding 10
grid .frm
grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0
grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0
17.

cuộn

Đây hầu như luôn luôn là phương thức

from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
61 của một số tiện ích thanh cuộn, nhưng có thể là bất kỳ phương thức tiện ích nào có một đối số duy nhất.

bọc

Phải là một trong những:

ttk::frame .frm -padding 10
grid .frm
grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0
grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0
19,
ttk::frame .frm -padding 10
grid .frm
grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0
grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0
20 hoặc
ttk::frame .frm -padding 10
grid .frm
grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0
grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0
21.

Ràng buộc và sự kiện

Phương thức liên kết từ lệnh Widget cho phép bạn xem một số sự kiện nhất định và có kích hoạt chức năng gọi lại khi loại sự kiện đó xảy ra. Hình thức của phương thức liên kết là:

from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
6

where:

sự phối hợp

là một chuỗi biểu thị loại mục tiêu của sự kiện. .

func

là một hàm Python, lấy một đối số, được gọi khi sự kiện xảy ra. Một thể hiện sự kiện sẽ được thông qua như là đối số. (Các chức năng được triển khai theo cách này thường được gọi là gọi lại.)

cộng

là tùy chọn,

ttk::frame .frm -padding 10
grid .frm
grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0
grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0
22 hoặc
ttk::frame .frm -padding 10
grid .frm
grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0
grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0
23. Vượt qua một chuỗi trống biểu thị rằng ràng buộc này là để thay thế bất kỳ ràng buộc nào khác mà sự kiện này được liên kết. Truyền
ttk::frame .frm -padding 10
grid .frm
grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0
grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0
23 có nghĩa là chức năng này sẽ được thêm vào danh sách các chức năng bị ràng buộc với loại sự kiện này.

Ví dụ:

from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
7

Lưu ý cách trường Widget của sự kiện đang được truy cập trong cuộc gọi lại

ttk::frame .frm -padding 10
grid .frm
grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0
grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0
25. Trường này chứa các tiện ích bắt được sự kiện X. Bảng sau liệt kê các trường sự kiện khác mà bạn có thể truy cập và cách chúng được ký hiệu trong TK, có thể hữu ích khi đề cập đến các trang TK Man.

TK

Trường sự kiện Tkinter

TK

Trường sự kiện Tkinter

%f

tiêu điểm

%A

char

%h

Chiều cao

%E

send_event

%k

KEYCODE

%K

Bàn phím

%s

tiểu bang

%N

keysym_num

%t

thời gian

%T

loại hình

%w

bề rộng

%W

Widget

%x

x

%X

x_root

%y

y

%Y

y_root

Tham số chỉ mục

Một số tiện ích yêu cầu các tham số của Index Index phải được thông qua. Chúng được sử dụng để chỉ vào một vị trí cụ thể trong một tiện ích văn bản hoặc các ký tự cụ thể trong một tiện ích nhập hoặc các mục menu cụ thể trong một tiện ích menu.

Chỉ mục tiện ích nhập cảnh (chỉ mục, chỉ mục xem, v.v.)

Các tiện ích nhập có các tùy chọn đề cập đến các vị trí ký tự trong văn bản đang được hiển thị. Bạn có thể sử dụng các chức năng

from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
9 này để truy cập các điểm đặc biệt này trong các tiện ích văn bản:

Chỉ mục tiện ích văn bản

Ký hiệu chỉ mục cho các tiện ích văn bản rất phong phú và được mô tả tốt nhất trong các trang TK Man.

Chỉ mục menu (menu.invoke (), menu.entryconfig (), v.v.)

Một số tùy chọn và phương pháp cho các menu thao tác các mục menu cụ thể. Bất cứ khi nào một chỉ mục menu là cần thiết cho một tùy chọn hoặc tham số, bạn có thể chuyển vào:

  • một số nguyên đề cập đến vị trí số của mục nhập trong tiện ích, được tính từ đầu, bắt đầu bằng 0;

  • Chuỗi

    ttk::frame .frm -padding 10
    grid .frm
    grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0
    grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0
    
    27, đề cập đến vị trí menu hiện đang nằm dưới con trỏ;

  • Chuỗi

    ttk::frame .frm -padding 10
    grid .frm
    grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0
    grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0
    
    28 đề cập đến mục menu cuối cùng;

  • Một số nguyên đi trước

    from tkinter import *
    from tkinter import ttk
    root = Tk()
    frm = ttk.Frame(root, padding=10)
    frm.grid()
    ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
    ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
    root.mainloop()
    
    86, như trong
    ttk::frame .frm -padding 10
    grid .frm
    grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0
    grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0
    
    30, trong đó số nguyên được hiểu là tọa độ pixel y trong hệ tọa độ menu của Menu;

  • Chuỗi

    ttk::frame .frm -padding 10
    grid .frm
    grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0
    grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0
    
    19, cho biết không có mục nhập menu nào, thường được sử dụng với menu.activate () để hủy kích hoạt tất cả các mục, và cuối cùng,

  • Một chuỗi văn bản là mẫu phù hợp với nhãn của mục nhập menu, như được quét từ đầu menu xuống phía dưới. Lưu ý rằng loại chỉ mục này được xem xét sau tất cả các loại khác, điều đó có nghĩa là khớp với các mục menu được dán nhãn

    ttk::frame .frm -padding 10
    grid .frm
    grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0
    grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0
    
    32,
    ttk::frame .frm -padding 10
    grid .frm
    grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0
    grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0
    
    33 hoặc
    ttk::frame .frm -padding 10
    grid .frm
    grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0
    grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0
    
    34 có thể được hiểu là theo nghĩa đen.

Hình ảnh

Hình ảnh của các định dạng khác nhau có thể được tạo thông qua lớp con tương ứng của

ttk::frame .frm -padding 10
grid .frm
grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0
grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0
35:

  • ttk::frame .frm -padding 10
    grid .frm
    grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0
    grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0
    
    36 cho hình ảnh ở định dạng XBM.

  • ttk::frame .frm -padding 10
    grid .frm
    grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0
    grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0
    
    37 cho hình ảnh trong các định dạng PGM, PPM, GIF và PNG. Cái sau được hỗ trợ bắt đầu với TK 8.6.

Một trong hai loại hình ảnh được tạo thông qua tùy chọn

ttk::frame .frm -padding 10
grid .frm
grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0
grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0
38 hoặc
ttk::frame .frm -padding 10
grid .frm
grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0
grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0
39 (các tùy chọn khác cũng có sẵn).

Đối tượng hình ảnh sau đó có thể được sử dụng bất cứ nơi nào tùy chọn

ttk::frame .frm -padding 10
grid .frm
grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0
grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0
40 được hỗ trợ bởi một số tiện ích (ví dụ: nhãn, nút, menu). Trong những trường hợp này, TK sẽ không giữ một tham chiếu đến hình ảnh. Khi tham chiếu python cuối cùng đến đối tượng hình ảnh bị xóa, dữ liệu hình ảnh cũng sẽ bị xóa và TK sẽ hiển thị một hộp trống bất cứ nơi nào hình ảnh được sử dụng.

Xem thêm

Gói Gối bổ sung hỗ trợ cho các định dạng như BMP, JPEG, TIFF và Webp, trong số các định dạng khác.

Người xử lý tập tin

TK cho phép bạn đăng ký và hủy đăng ký chức năng gọi lại sẽ được gọi từ TK Mainloop khi I/O có thể trên bộ mô tả tệp. Chỉ có một người xử lý có thể được đăng ký cho mỗi mô tả tệp. Mã ví dụ:

from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
8

Tính năng này không có sẵn trên Windows.

Vì bạn không biết có bao nhiêu byte có sẵn để đọc, bạn có thể không muốn sử dụng các phương thức

ttk::frame .frm -padding 10
grid .frm
grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0
grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0
41 hoặc
ttk::frame .frm -padding 10
grid .frm
grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0
grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0
42
ttk::frame .frm -padding 10
grid .frm
grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0
grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0
43 hoặc
ttk::frame .frm -padding 10
grid .frm
grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0
grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0
44, vì chúng sẽ nhấn mạnh vào việc đọc một số byte được xác định trước. Đối với ổ cắm, các phương pháp
ttk::frame .frm -padding 10
grid .frm
grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0
grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0
45 hoặc
ttk::frame .frm -padding 10
grid .frm
grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0
grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0
46 sẽ hoạt động tốt; Đối với các tệp khác, sử dụng đọc thô hoặc
ttk::frame .frm -padding 10
grid .frm
grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0
grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0
47.

________ 248 ________ 249 (Tệp, Mặt nạ, Func) ¶(file, mask, func)

Đăng ký chức năng gọi lại tệp FUNC. Đối số tệp có thể là một đối tượng có phương thức

ttk::frame .frm -padding 10
grid .frm
grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0
grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0
50 (chẳng hạn như tệp hoặc đối tượng ổ cắm) hoặc bộ mô tả tệp số nguyên. Đối số mặt nạ là sự kết hợp của bất kỳ trong số ba hằng số bên dưới. Cuộc gọi lại được gọi như sau:

________ 248 ________ 252 (Tệp) ¶(file)

Ung đăng ký một người xử lý tập tin.

________ 30 ________ 254¶ ________ 30 ________ 256¶ ________ 30 ________ 258¶

Các hằng số được sử dụng trong các đối số mặt nạ.