如何解决tkinter绑定到“ <Shift_L>”不起作用
我正在尝试将一个名为cancel_select()
的函数绑定到释放左shift键。
为此,我使用以下代码行:
self.bind("<keyrelease-Shift_L>",self.cancel_select)
即使我在没有keyrelease-
的情况下尝试也不起作用。我认为这与Shift_L
有关,但是我不知道这有什么问题。我没有任何错误,但是它什么也没做。我所有其他的绑定都可以工作,并且cancel_select()
也可以正常工作。我可以将其与其他绑定一起使用而没有问题。
示例
from tkinter import Tk,Frame
global i
i = 0
colors = ["red","green","blue"]
def change_color(self):
global i
if i == 3:
i = 0
test_frame.configure(bg=colors[i])
i += 1
root = Tk()
root.grid_columnconfigure(0,weight=1)
root.grid_rowconfigure(0,weight=1)
test_frame = Frame(root,bg="#333",width=300,height=300)
test_frame.grid(row=0,column=0,sticky="nsew")
test_frame.bind("<Button-1>",change_color) # works
test_frame.bind("<Shift_L>",change_color) # doesn't work
test_frame.bind("Shift_L",change_color) # doesn't work
root.mainloop()
解决方法
框架的问题是它从来没有集中精力,所以它没有收到关键事件。要使其接收关键事件,请使用focus_set()
这是更新的代码:
test_frame = Frame(root,bg="#333",width=300,height=300)
test_frame.grid(row=0,column=0,sticky="nsew")
test_frame.focus_set() # add this line to accept key events
test_frame.bind("<Button-1>",change_color) # works
#test_frame.bind("<Key>",change_color) # works :)
test_frame.bind("<Shift_L>",change_color) # works :)
正如您提到的,将事件绑定到根目录也可以,因为它捕获了整个应用程序的事件。
,已解决。我必须将<Shift_L>
绑定到根目录,而不是test_frame
。
root.bind("<KeyRelease-Shift_L>",change_color)
有效。
是的,这似乎是关注的问题。除非它具有焦点,否则框架不会检测到该事件。
"<Button-1>"
之所以起作用,是因为它将焦点对准了框架。 编辑:该按钮起作用了,因为它不是按键,因此不需要键盘焦点。感谢@Bryan Oakley的纠正。
from tkinter import Tk,Frame
i = 0
colors = ["red","green","blue"]
def change_color(self):
global i
test_frame.focus_set()
if i == 3:
i = 0
test_frame.configure(bg=colors[i])
i += 1
root = Tk()
root.grid_columnconfigure(0,weight=1)
root.grid_rowconfigure(0,weight=1)
test_frame = Frame(root,sticky="nsew")
test_frame.bind("<Button-1>",change_color) # works
test_frame.bind("<Shift_L>",change_color) # doesn't work
test_frame.focus_set()
root.mainloop()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。