Để trả lời câu hỏi cụ thể của bạn về việc liệu bạn có thể có một ràng buộc duy nhất áp dụng cho nhiều tiện ích hay không, câu trả lời là có. Nó có thể sẽ dẫn đến nhiều dòng mã hơn là ít hơn, nhưng nó dễ dàng để làm.
Tất cả tiện ích con tkinter đều có tên "bindtags". Bindtags là một danh sách các "thẻ" mà các ràng buộc được đính kèm. Bạn sử dụng tất cả các thời gian mà không biết nó. Khi bạn liên kết với một tiện ích, liên kết không thực sự trên tiện ích con, nhưng trên thẻ có cùng tên với tên cấp thấp của tiện ích con. Các ràng buộc mặc định là trên một thẻ có cùng tên với lớp widget (lớp cơ bản, không nhất thiết là lớp python). Và khi bạn gọi bind_all
, bạn đang ràng buộc với thẻ "all"
.
Điều tuyệt vời về thẻ bắt buộc là bạn có thể thêm và xóa thẻ tất cả những gì bạn muốn. Vì vậy, bạn có thể thêm thẻ của riêng bạn, và sau đó gán các ràng buộc với nó với bind_class
(Tôi không biết tại sao các tác giả Tkinter đã chọn tên đó ...).
Điều quan trọng cần nhớ là thẻ liên kết có thứ tự và sự kiện được xử lý theo thứ tự này. Nếu trình xử lý sự kiện trả về chuỗi "break"
, xử lý sự kiện sẽ dừng trước khi bất kỳ thẻ liên kết còn lại nào đã được kiểm tra cho các ràng buộc.
Kết quả thực tế của việc này là, nếu bạn muốn các ràng buộc khác có thể ghi đè lên các ràng buộc mới này, hãy thêm thẻ liên kết của bạn vào cuối. Nếu bạn muốn các ràng buộc của bạn không thể bị ghi đè bởi các ràng buộc khác, hãy đặt nó ngay từ đầu.
Ví dụ
import Tkinter as tk
class Example(tk.Frame):
def __init__(self, *args, **kwargs):
tk.Frame.__init__(self, *args, **kwargs)
# add bindings to a new tag that we're going to be using
self.bind_class("mytag", "<Enter>", self.on_enter)
self.bind_class("mytag", "<Leave>", self.on_leave)
# create some widgets and give them this tag
for i in range(5):
l = tk.Label(self, text="Button #%s" % i, background="white")
l.pack(side="top")
new_tags = l.bindtags() + ("mytag",)
l.bindtags(new_tags)
def on_enter(self, event):
event.widget.configure(background="bisque")
def on_leave(self, event):
event.widget.configure(background="white")
if __name__ == "__main__":
root = tk.Tk()
view = Example()
view.pack(side="top", fill="both", expand=True)
root.mainloop()
Một chút thêm thông tin về bindtags có thể được tìm thấy trong câu trả lời này: https://stackoverflow.com/a/11542200/7432
Ngoài ra, bindtags
phương pháp riêng của mình là tài liệu trên trang effbot Basic Widget Methods trong số những nơi khác.
Ngoài ra, bạn có thể đặt thông số bằng từ điển lồng nhau: 'bParams = {'button1': {'bg': 'red', 'command' = self.frame.quit, ...}, ... } '.Tôi không chắc chắn nếu bạn có thể thêm các lệnh trong từ điển, nhưng nếu không, bạn có thể làm: 'b = Button (root, văn bản = s, bg = bParams [b], ...)'. –
Ồ, cảm ơn. Điều đó có thể làm việc :) –