微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

tkinter绑定到“ <Shift_L>”不起作用

如何解决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()

这似乎如您所愿,因为它使用.focus_set()方法将焦点放在框架上。您可以参考thisthis以获得更多信息。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。