Mã của bạn có vẻ tốt, nhưng lưu ý rằng tiêu điểm phải nằm trên nút nếu bạn muốn Return
gọi self.search()
. Bạn có thể thay đổi tiêu điểm từ tiện ích con sang tiện ích con bằng cách nhấn Tab
. Các widget trong tập trung được vạch ra với một đường màu đen mỏng. Bạn có thể phải bấm Tab
một hoặc nhiều lần để di chuyển tiêu điểm đến nút trước khi nhấn Return
.
Nếu bạn muốn Return
để làm việc bất cứ nơi nào trong cửa sổ giao diện, sau đó thay đổi
self.button1.bind('<Return>', self.search)
để
root.bind('<Return>', self.search)
nơi root = tk.Tk()
.
Ví dụ, so sánh button.bind
với master.bind
trong các mã dưới đây:
import Tkinter as tk
class SimpleApp(object):
def __init__(self, master, **kwargs):
title = kwargs.pop('title')
frame = tk.Frame(master, **kwargs)
frame.grid()
button = tk.Button(frame, text = 'search', command = self.search)
button.grid()
button.bind('<Return>', self.search)
# uncomment if you want `<Return>` bound everywhere.
# master.bind('<Return>', self.search)
def search(self,*args):
print('searching...')
def basic():
root = tk.Tk()
app = SimpleApp(root, title = 'Hello, world')
root.mainloop()
basic()
Ngoài ra, bạn có thể sử dụng
button.bind('<Return>', self.search)
button.focus()
Làm theo cách này, nhấn Return
cuộc gọi self.search()
chỉ khi nút có tiêu điểm, nhưng nút sẽ tập trung khi ứng dụng bắt đầu.
Về việc sử dụng *args
và **kwargs
:
**kwargs
cho phép đối số từ khóa tùy ý để được thông qua để __init__
.
Khi **kwargs
được sử dụng trong định nghĩa hàm như thế này:
def __init__(self, master, **kwargs):
và chúng tôi nhanh chóng SimpleApp
như thế này:
app = SimpleApp(root, title = 'Hello, world')
sau đó Python đặt kwargs
đến một dict chứa các đối số từ khóa, ví dụ {'title':'Hello, world'}
. Lưu ý rằng **kwargs
là cú pháp Python chỉ có thể được sử dụng trong các định nghĩa chức năng và các cuộc gọi hàm (xem bên dưới), nhưng chính bản thân nó chỉ là một mệnh lệnh.
kwargs
sau đó được chuyển cho Frame
:
frame = tk.Frame(master, **kwargs)
Bây giờ, khi kwargs ** được sử dụng trong một cuộc gọi chức năng, các cặp khóa-giá trị trong kwargs
dict được mở rộng để các chức năng cuộc gọi trên là tương đương để
frame = tk.Frame(master, title = 'Hello, world')
Kể từ Frame
có thể mất rất nhiều tranh cãi từ khóa, và tôi không biết tất cả chúng và không muốn liệt kê chúng, đó là thuận lợi để sử dụng **kwargs
. Lưu ý rằng ngay cả khi các đối số từ khóa mới được thêm vào Frame
vào một số ngày sau đó, mã của tôi vẫn hoạt động, trong khi nếu tôi viết đúng từ khóa thì mã của tôi sẽ không tự động "nâng cấp" nếu các từ khóa cho phép của Frame
thay đổi .
*args
, tương tự, cho phép bạn bao gồm lập luận vị trí tùy ý để search
:
def search(self,*args):
Python đặt args
vào một danh sách chứa tất cả các đối số vị trí gửi đến search
khi search
được gọi.
Tôi đã sử dụng * args tại đây vì self.search
được gọi không có đối số hoặc một đối số.
Khi bạn nói
button = tk.Button(frame, text = 'search', command = self.search)
self.search()
được gọi với không argumens khi nút được nhấp. Nhưng khi bạn nói
button.bind('<Return>', self.search)
self.search(event)
được gọi với một đối số khi phím Return
được nhấn. event
là Tkinter.Event có thuộc tính (thời gian, trạng thái, loại, tiện ích, x, y, v.v.) cho phép bạn tìm hiểu thêm về sự kiện đã diễn ra.
khác, có lẽ tốt hơn, cách để xác định search
có thể đã được
def search(self, event = None):
...
này sẽ làm cho nó rõ ràng rằng search
có thể được thông qua 0 hoặc 1 đối số, và không chỉ đơn giản và số lượng tùy ý các đối số. Nó cũng sẽ cung cấp truy cập dễ dàng hơn để event
nếu một sự kiện được chuyển đến search
.
tham khảo:
Cảm ơn, giờ đây rõ ràng hơn đối với tôi. Chỉ cần đặt câu hỏi những gì đứng những người: "** kwargs và * args" cho? – Thomas
Tôi đã thêm giải thích lý do tại sao tôi đã sử dụng '** kwargs' và' * args'. Nếu quá dài để đọc, hãy xem [lời giải thích của saltcrane] (http://www.saltycrane.com/blog/2008/01/how-to-use-args-and-kwargs-in-python/). – unutbu