2011-12-30 25 views
6

tôi bị ràng buộc sự kiện <Return> đến một Button, nghĩ rằng điều này sẽ gây ra command được chạy sau khi chạm Nhập:Binding <Return> nút không làm việc như mong đợi

Button(self.f, text="Print", command=self.Printer).pack(side=RIGHT, padx=10, pady=10) 
self.button1 = Button(self.f, text="search", command=self.search) 
self.button1.bind('<Return>', self.search) 
self.button1.pack(side=RIGHT, padx=10, pady=10) 

Nhưng nó không làm bất cứ điều gì. Tôi phải làm gì để self.search chạy khi Nhập được nhấn?

Trả lời

12

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**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. eventTkinter.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:

+0

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

+0

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

Các vấn đề liên quan