GUI ví dụ:
Hãy nói rằng tôi có GUI:
import tkinter as tk
root = tk.Tk()
btn = tk.Button(root, text="Press")
btn.pack()
root.mainloop()
Điều gì xảy ra khi nhấn nút
Xem rằng khi btn
được nhấn, nó gọi hàm riêng của nó rất giống với button_press_handle
ví dụ sau:
def button_press_handle(callback=None):
if callback:
callback() # Where exactly the method assigned to btn['command'] is being callled
với:
button_press_handle(btn['command'])
Bạn có thể nghĩ đơn giản rằng command
tùy chọn đó nên được đặt là, tham chiếu đến phương thức chúng ta muốn được gọi, tương tự như callback
trong button_press_handle
.
Gọi một phương thức ( Gọi lại ) Khi nhấn nút
Không cần tranh luận
Vì vậy, nếu tôi muốn print
một cái gì đó khi nhấn nút, tôi sẽ cần phải thiết lập:
btn['command'] = print # default to print is new line
Hãy chú ý đến các thiếu của ()
với print
phương pháp được bỏ qua trong ý nghĩa rằng: "Đây là tên của phương pháp mà tôi muốn bạn để gọi khi ép nhưng . Không gọi nó chỉ rất tức này" Tuy nhiên, tôi đã không vượt qua bất kỳ đối số nào print
để nó in bất cứ thứ gì nó in khi được gọi mà không có đối số.
Với (các) đối số
Bây giờ Nếu tôi cũng muốn truyền đối số cho phương thức tôi muốn được gọi khi nhấn nút, tôi có thể sử dụng các hàm ẩn danh, có thể được tạo bằng câu lệnh lambda , trong trường hợp này là print
phương thức dựng sẵn, như sau :
btn['command'] = lambda arg1="Hello", arg2=" ", arg3="World!" : print(arg1 + arg2 + arg3)
Gọi nhiều phương thức khi nhấn nút
Không có đối số
Bạn cũng có thể đạt được điều đó bằng cách sử dụng lambda
câu lệnh nhưng nó được coi là thông lệ xấu và do đó tôi sẽ không đưa nó vào đây. Cách thực hành tốt là xác định một phương thức riêng biệt, multiple_methods
gọi các phương thức muốn và sau đó đặt nó làm phương thức gọi lại cho nút nhấn:
def multiple_methods():
print("Vicariously") # the first inner callback
print("I") # another inner callback
Với (các) đối số
Để truyền (các) đối số cho phương thức gọi các phương thức khác, một lần nữa sử dụng lambda
câu lệnh, nhưng trước tiên:
def multiple_methods(*args, **kwargs):
print(args[0]) # the first inner callback
print(kwargs['opt1']) # another inner callback
và sau đó đặt:
btn['command'] = lambda arg="live", kw="as the" : a_new_method(arg, opt1=kw)
Đối tượng quay lại từ cuộc gọi lại
Cũng lưu ý thêm rằng callback
có thể không thực sự return
vì nó chỉ được gọi là bên trong button_press_handle
với callback()
như trái ngược với return callback()
. Nó không return
nhưng không phải bất cứ nơi nào bên ngoài chức năng đó. Do đó, bạn nên sửa đổi (các) đối tượng có thể truy cập trong phạm vi hiện tại.
Ví dụ hoàn chỉnh với toàn cầu (các) Sửa đổi đối tượng
Ví dụ dưới đây sẽ gọi một phương thức thay đổi btn
văn bản mỗi lần nhấn nút:
import tkinter as tk
i = 0
def text_mod():
global i, btn # btn can be omitted but not sure if should be
txt = ("Vicariously", "I", "live", "as", "the", "whole", "world", "dies")
btn['text'] = txt[i] # the global object that is modified
i = (i + 1) % len(txt) # another global object that gets modified
root = tk.Tk()
btn = tk.Button(root, text="My Button")
btn['command'] = text_mod
btn.pack(fill='both', expand=True)
root.mainloop()
Gương