Python 尝试将keybinding添加到使用工厂创建回调的按钮
因此,我有以下代码使用tkinter创建按钮网格:Python 尝试将keybinding添加到使用工厂创建回调的按钮,python,python-3.x,tkinter,Python,Python 3.x,Tkinter,因此,我有以下代码使用tkinter创建按钮网格: class Application(Frame):UP = 'Up' DOWN = 'Down' LEFT = 'Left' RIGHT = 'Right' END = "E" SEND = "S" STAR = "*" POUND = "#" def __init__(self, master=None): Frame.__init__(self, master)
class Application(Frame):UP = 'Up'
DOWN = 'Down'
LEFT = 'Left'
RIGHT = 'Right'
END = "E"
SEND = "S"
STAR = "*"
POUND = "#"
def __init__(self, master=None):
Frame.__init__(self, master)
self.grid()
self.createWidgets()
def createWidgets(self):
self.arrowButtons = []
self.arrowButtons += [Button(self, text=self.LEFT[0], command=self.buttonPressFactory(self.LEFT) )]
self.arrowButtons += [Button(self, text=self.UP[0], command=self.buttonPressFactory(self.UP) )]
self.arrowButtons += [Button(self, text=self.RIGHT[0], command=self.buttonPressFactory(self.RIGHT) )]
self.arrowButtons += [Button(self, text=self.DOWN[0], command=self.buttonPressFactory(self.DOWN) )]
self.send = Button(self, text=self.SEND, command=self.buttonPressFactory(self.SEND) )
self.end = Button(self, text=self.END, command=self.buttonPressFactory(self.END) )
self.send.grid(row=2,column=1)
self.end.grid(row=2,column=3)
self.numButtons = []
for i in range(0,10):#make the number buttons
self.numButtons.append(Button(self, text=str(i), command=self.buttonPressFactory(str(i))))
self.starButton = Button(self, text=self.STAR, command=self.buttonPressFactory(self.STAR) )
self.hashButton = Button(self, text=self.POUND, command=self.buttonPressFactory(self.POUND) )
self.arrowButtons[0].grid(row=1,column=1)
self.arrowButtons[1].grid(row=1,column=2)
self.arrowButtons[2].grid(row=1,column=3)
self.arrowButtons[3].grid(row=2,column=2)
self.send.grid(row=2,column=1)
self.end.grid(row=2,column=3)
self.numButtons[1].grid(row=3,column=1)
self.numButtons[2].grid(row=3,column=2)
self.numButtons[3].grid(row=3,column=3)
self.numButtons[4].grid(row=4,column=1)
self.numButtons[5].grid(row=4,column=2)
self.numButtons[6].grid(row=4,column=3)
self.numButtons[7].grid(row=5,column=1)
self.numButtons[8].grid(row=5,column=2)
self.numButtons[9].grid(row=5,column=3)
self.starButton.grid(row=6,column=1)
self.numButtons[0].grid(row=6,column=2)
self.hashButton.grid(row=6,column=3)
def press(self, x):
print(x)
def buttonPressFactory(self, button):
def buttonPress(*args):
self.press(button)
root.bind("<"+button+">", buttonPress)
return buttonPress
if __name__ == '__main__':
root = Tk()
app = Application(root)
app.master.title("stackoverflow is great")
app.mainloop()
类应用程序(框架):UP='UP'
向下=‘向下’
左=‘左’
右=‘右’
END=“E”
SEND=“S”
STAR=“*”
POUND=“#”
def uuu init uuu(self,master=None):
帧。\uuuu初始化(自,主)
self.grid()
self.createWidgets()
def createWidgets(自):
self.arrowButtons=[]
self.arrowButtons+=[按钮(self,text=self.LEFT[0],命令=self.buttonPressFactory(self.LEFT))]
self.arrowButtons+=[按钮(self,text=self.UP[0],命令=self.buttonPressFactory(self.UP))]
self.arrowButtons+=[按钮(self,text=self.RIGHT[0],命令=self.buttonPressFactory(self.RIGHT))]
self.arrowButtons+=[按钮(self,text=self.DOWN[0],命令=self.buttonPressFactory(self.DOWN))]
self.send=按钮(self,text=self.send,command=self.buttonPressFactory(self.send))
self.end=按钮(self,text=self.end,command=self.buttonPressFactory(self.end))
self.send.grid(行=2,列=1)
self.end.grid(行=2,列=3)
self.numButtons=[]
对于范围(0,10)内的i:#制作数字按钮
self.numButtons.append(按钮(self,text=str(i),command=self.buttonPressFactory(str(i)))
self.starButton=Button(self,text=self.STAR,command=self.buttonPressFactory(self.STAR))
self.hashButton=Button(self,text=self.POUND,command=self.buttonPressFactory(self.POUND))
self.arrowButtons[0]。网格(行=1,列=1)
self.arrowButtons[1]。网格(行=1,列=2)
self.arrowButtons[2]。网格(行=1,列=3)
self.arrowButtons[3]。网格(行=2,列=2)
self.send.grid(行=2,列=1)
self.end.grid(行=2,列=3)
self.numButtons[1]。网格(行=3,列=1)
self.numButtons[2]。网格(行=3,列=2)
self.numButtons[3]。网格(行=3,列=3)
self.numButtons[4]。网格(行=4,列=1)
self.numButtons[5]。网格(行=4,列=2)
self.numButtons[6]。网格(行=4,列=3)
self.numButtons[7]。网格(行=5,列=1)
self.numButtons[8]。网格(行=5,列=2)
self.numButtons[9]。网格(行=5,列=3)
self.starButton.grid(行=6,列=1)
self.numButtons[0]。网格(行=6,列=2)
self.hashButton.grid(行=6,列=3)
def压力(自身,x):
打印(x)
def按钮压力工厂(自身,按钮):
def按钮按(*参数):
按下(按钮)
root.bind(“,按钮按)
返回按钮按下
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
root=Tk()
app=应用程序(根)
app.master.title(“stackoverflow很棒”)
app.mainloop()
当我在buttonPressFactory中添加开始“root.bind(”
当我添加该行时,突然单击任何按钮似乎都会调用press(1),然后调用press(无论什么)。除了1、2、3、4和5(在numpad或numrow上)外,键绑定工作正常。如果删除该行,一切正常,但当然不能使用键绑定。我是tkinter的新手,所以我可能犯了一个明显的错误,尽管我的直觉告诉我可能犯了语法错误
如何在不破坏代码的情况下向代码添加键绑定?'
是鼠标按钮1,'1'
是文字字符()。因此不要在文字键上使用括号
下面是固定的按钮pressFactory
:
def buttonPressFactory(self, button):
def buttonPress(*args):
self.press(button)
eventname = '<' + button + '>' if len(button) > 1 else button
root.bind(eventname, buttonPress)
return buttonPress
def按钮压力工厂(self,按钮):
def按钮按(*参数):
按下(按钮)
如果len(按钮)>1个else按钮,则eventname=''
root.bind(eventname,buttonPress)
返回按钮按下
关于你的陈述
我是tkinter的新手,所以我可能犯了一个明显的错误
我的直觉告诉我这实际上是一个python错误
一个好的经验法则是,这几乎总是你的错误。这对每个人都是正确的。我的意思是“我不懂python”的错误,而不是语言本身的错误。我同意,我的错误几乎总是一个好的经验法则