2011-11-25 33 views
12

Tôi mới dùng Python và cố gắng viết một chương trình bằng tkinter. Tại sao hàm Xin chào bên dưới được thực thi? Như tôi đã hiểu, cuộc gọi lại sẽ chỉ được thực hiện khi nhấn nút? Tôi rất bối rối ...Tại sao tham số Nút "lệnh" được thực hiện khi được khai báo?

>>> def Hello(): 
     print("Hi there!") 

>>> hi=Button(frame,text="Hello",command=Hello()) 
Hi there! 
>>> 

Trả lời

25

Nó được gọi là trong khi các thông số cho Button đang được giao:

command=Hello() 

Nếu bạn muốn vượt qua chức năng (giá trị không nó trả lại), bạn nên thay vì:

command=Hello 

nói chung function_name là một đối tượng chức năng, function_name() là bất cứ điều gì trở về chức năng. Xem nếu điều này giúp thêm:

>>> def func(): 
...  return 'hello' 
... 
>>> type(func) 
<type 'function'> 
>>> type(func()) 
<type 'str'> 

Nếu bạn muốn vượt qua đối số, bạn có thể sử dụng một lambda expression để xây dựng một parameterless callable.

>>> hi=Button(frame, text="Hello", command=lambda: Goodnight("Moon")) 

một cách đơn giản, bởi vì Goodnight("Moon") là trong một lambda, nó sẽ không thực hiện ngay lập tức, thay vì chờ đợi cho đến khi nút được nhấp.

+0

Cảm ơn bạn! Theo dõi rõ ràng là; làm thế nào để vượt qua đối số? Bây giờ tôi đang đọc về Lambda, có vẻ như đó chỉ là câu trả lời. – wjakobw

+0

@wjakobw - Vượt qua đối số cho hàm hoặc chuyển hàm làm đối số? Trong trường hợp đầu tiên bạn khai báo các đối số trong định nghĩa hàm ex: 'def func (par1, par2):' trong phần sau, bạn chỉ cần sử dụng tên hàm mà không có dấu ngoặc đơn, như tôi đã nêu trong câu trả lời của tôi. Kể từ khi bạn được thừa nhận là mới để python, tôi có thể đề nghị [đọc này] (http://www.diveintopython.net/)? Thật dễ dàng để theo dõi và rất thú vị. – mac

+1

Tôi muốn chuyển một biến làm đối số khi nhấn nút. Lệnh theo cách thông thường = Hello (arg) sẽ không hoạt động khi gọi lại sau đó chứa các dấu ngoặc đơn và sử dụng giá trị trả về thay cho hàm. * Trong ví dụ trên Hello-function không có đối số, nhưng hãy tưởng tượng một số trường hợp khác. – wjakobw

2

Bạn cũng có thể sử dụng một biểu thức lambda như là đối số lệnh:

import tkinter as tk 
def hello(): 
    print("Hi there!") 

main = tk.Tk() 
hi = tk.Button(main,text="Hello",command=lambda: hello()).pack() 
main.mainloop() 
+3

Lambda hoàn toàn không cần thiết nếu bạn không vượt qua các đối số. Bạn có thể cải thiện câu trả lời của bạn bằng cách hiển thị cách sử dụng lambda để vượt qua các đối số. –

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