我有一個帶鍵盤快捷鍵的下拉選單,每當我點擊它時就會呼叫一個函式。
from tkinter import *
class app。
def __init__(self):
self.root = root
self.root.geometry('500x380')
self.root.title('Text Editor')
self.menu = Menu(self.root)
self.root.config(menu=self.menu)
self.submenu = Menu(self.menu)
self.menu.add_cascade(label='Tab', menu=self.submenu)
self.submenu.add_command(label='Do Somthing', command=self.doomthing)
self.root.bind('<Control-r>'/span>, self.dosomthing)
def dosomthing(self, event)。
print('Somthing Was Done! ')
root = Tk()
應用()
root.mainloop()
這個快捷方式作業得很好。然而,每當我想直接點擊標簽而不是使用快捷方式時,它就會說。TypeError: dosomthing() 缺少1個必要的位置引數:'event'
。我如何修復它,以便我可以點擊標簽并使用鍵盤快捷方式?
uj5u.com熱心網友回復:
我將把我的dosomthing方法的事件引數改為*args,因為Tkinter在呼叫選單中的方法時沒有傳遞任何引數。
它應該這樣:
def dosomthing(self, *args)。
print('Somthing Was Done! ')
如果你從來沒有使用過*args,它是一個帶有傳遞引數的串列,例如,如果你有這樣的:
def method(*args)。
for i in args:
print(i)
method("something","other thing")
它將回傳
某樣東西
另一件事
你也可以使用lambda
。 self.root.bind('<Control-r> ', lambda e: self.dosomthing()
def dosomthing(self)。
print('Somthing Was Done! ')
uj5u.com熱心網友回復:
dosomething方法期待一個引數。當你點擊選單項時,dosomething被呼叫,沒有任何引數。
解決這個問題的一個方法是將事件引數設定為None或者給出一些默認值。
def dosomthing(self, event=None) 。
print('Somthing Was Done!')
完整的例子:
from tkinter import *
class App。
def __init__(self):
self.root = Tk()
self.root.geometry('500x380')
self.root.title('Text Editor')
self.menu = Menu(self.root)
self.submenu = Menu(self.menu)
self.menu.add_cascade(label='Tab', menu=self.submenu)
self.submenu.add_command(label='Do Somthing', command=self.doomthing)
self.root.config(menu=self.menu)
self.root.bind('<Control-r>', self.dosomthing) # bind_all在這里更合適。
self.root.mainloop()
def dosomthing(self, event=None) 。
print('Somthing Was Done! ')
應用()
uj5u.com熱心網友回復:
這個問題已經被@Tartyto正確回答了,但是對于將來可能會看到這個問題的其他人來說,這里是出現這種情況的原因,以及@Tartyto提到的哪種方法更好。
編輯:感謝 @Art 讓我知道了我的答案中的錯誤,這次編輯是希望能解決這些錯誤。
通常情況下,當你在tkinter中把一個函式系結到一個鍵位上時,你的做法與你的做法類似--:
def __init__(self, ...) :
self.root.bind('KEYBINDING', self.do_something)
回傳。
def do_something(self, event) 。
print('Did something....'/span>)
return('Did something')
因此,這里發生的情況是,我們的回呼函式接受了一個事件引數,該引數在系結函式呼叫回呼時被傳遞。
但是當你的選單按鈕被按下時,同樣的函式被呼叫,回呼函式沒有被傳遞任何引數,這導致python提示你為回呼函式傳遞事件引數。
為了解決這個問題,我們可以讓第二個引數變得可有可無,當第二個引數沒有被傳遞時,我們可以手動傳遞,或者為第二個引數設定一個默認值。所有這些都是有效的方法。
# OPTIONAL ARGUMENT WAY。
def __init__(self, ....) :
root.bind('KEYBINDING', self.do_something)
...
回傳。
def do_something(self, *args) 。
print('Did something....'/span>)
return('Did something')
# DEFAULT ARGUMENT WAY[/span]。
def __init__(self, ....) :
root.bind('KEYBINDING', self.do_something)
...
回傳。
def do_something(self, event = None) 。
print('Did something....'/span>)
return('Did something')
# LAMBDA WAY[/span]。
def __init__(self, ....) :
root.bind('KEYBINDING', lambda : self.do_something(None)
...
returndef do_something(self, event) 。
print('Did something....'/span>)
return('Did something')
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/330598.html
標籤:
