GUI 예 :
GUI가 있다고 가정 해 봅시다.
import tkinter as tk
root = tk.Tk()
btn = tk.Button(root, text="Press")
btn.pack()
root.mainloop()
버튼을 눌렀을 때 일어나는 일
때 참조 btn
누르면이 호출 자신 과 매우 유사 기능 button_press_handle
다음 예제를 :
def button_press_handle(callback=None):
if callback:
callback() # Where exactly the method assigned to btn['command'] is being callled
와:
button_press_handle(btn['command'])
command
옵션을 callback
in에서 와 같이 호출하려는 메소드에 대한 참조로 설정해야 한다고 생각할 수 있습니다 button_press_handle
.
버튼을 눌렀을 때 메소드 호출 ( 콜백 )
논증 없이
따라서 print
버튼을 눌렀을 때 무언가를 원한다면 설정해야합니다.
btn['command'] = print # default to print is new line
에주의를 기울이 부족 의 ()
에 print
있음을 의미 생략 방법 : "이것은 내가 누르면 통화 할 메서드의 이름입니다 만 . 단지 바로이 순간을 호출하지 않습니다" 그러나 인수에 대한 인수를 전달하지 않았으므로 인수 print
없이 호출 할 때 인쇄 된 내용을 인쇄했습니다.
와 인수 (들)
이제 버튼을 누를 때 호출 될 메소드에 인수를 전달 하려면 익명 함수를 사용할 수 있습니다.이 함수 는 다음과 같이 내장 메소드의 경우 람다 문 으로 만들 수 있습니다. print
:
btn['command'] = lambda arg1="Hello", arg2=" ", arg3="World!" : print(arg1 + arg2 + arg3)
버튼을 눌렀을 때 여러 메소드 호출
인수 없이
당신은 또한 그 lambda
진술 을 사용하여 달성 할 수는 있지만 나쁜 습관으로 간주되므로 여기에 포함시키지 않을 것입니다. 모범 사례는 multiple_methods
원하는 메소드를 호출 한 다음 버튼 누름에 대한 콜백으로 설정 하는 별도의 메소드를 정의하는 것입니다.
def multiple_methods():
print("Vicariously") # the first inner callback
print("I") # another inner callback
와 인수 (들)
다른 메소드를 호출하는 메소드에 인수를 전달하려면 다시 lambda
명령문 을 사용하십시오 .
def multiple_methods(*args, **kwargs):
print(args[0]) # the first inner callback
print(kwargs['opt1']) # another inner callback
그런 다음 설정하십시오.
btn['command'] = lambda arg="live", kw="as the" : a_new_method(arg, opt1=kw)
콜백에서 객체 반환
또한 추가로 내부 와 만 호출되기 때문에 callback
실제로는 불가능 합니다 . 그것은 않습니다 만 하지 아무 곳이나 그 함수 외부. 따라서 현재 범위에서 액세스 할 수있는 개체를 수정 해야합니다 .return
button_press_handle
callback()
return callback()
return
글로벌로 완전한 예제 객체 수정을
아래 예제는 btn
버튼을 누를 때마다 텍스트 를 변경하는 메소드를 호출합니다 .
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()
거울