【发布时间】:2020-11-26 10:01:36
【问题描述】:
使用下面的代码Button-1单击调用relief更改仅在已经单击一次时才起作用(只有第一次双击有效,第二次可以,但是如果选择了其他小部件,也会发生同样的情况) :
def selected(event):
event.widget.config(relief=SUNKEN if event.widget.cget("relief") == "raised" else RAISED)
B1 = Button(root, text ='BUTTON1', font='-size 8', relief=RAISED)
B1.bind("<Button>", selected)
B1.grid(row = 1, column = 2, sticky = N+E+S+W)
B2 = Button(root, text ='BUTTON2', font='-size 8', relief=RAISED)
B2.bind("<Button>", selected)
B2.grid(row = 2, column = 2, sticky = N+E+S+W)
使用 Button-2 和 Button-3 可以正常工作,
是什么原因?
【问题讨论】:
-
首先使用
print()来检查您点击event.widget.cget("relief")时会得到什么。第二:根据您的问题创建最小的工作代码,我们可以测试。 -
尝试在
select()函数中添加return 'break'。 -
其实
Checkbutton可以和indicator=False一起使用,效果是一样的。 -
其实我只是觉得默认的鼠标按键释放事件处理器可能会搞乱浮雕状态的同步。但是为什么它在第二次单击时起作用,然后在单击另一个按钮后不起作用,我不知道原因。
return "break"只是跳过默认事件处理程序。再一次,我更喜欢使用Checkbutton和indicator=False。 -
你必须将按钮分配给
arg=- 你不能直接把它放在selected()-button['command'] = lambda arg=button:selected(arg)所有的问题是它不会将值从button复制到@987654337 @ 但仅引用变量button,它在循环中更改,所以最后所有selected都使用对相同值的引用——for-loop 中的最后一个值。使用arg=button它会在每个循环中创建新变量,并将值从button复制到arg- 所以每个selected()使用不同的arg具有不同的值。
标签: python button events tkinter bind