无法在 tkinter 中绑定按键
unable to bind keypress in tkinter
我浏览了大约十二篇关于 Tkinter、绑定按键事件和 canvas 小部件的帖子,但我阅读的 none 解决方案改变了我程序中的任何内容。 GUI 当前使用 Button-1 作为事件,但我需要它可以通过键盘进行操作。我尝试使用各种键和字母表中的字母。我也试过 self.c.focus_set(),当我尝试将事件绑定到 canvas 或框架时,它不起作用。这是我的代码:
from Tkinter import *
class App:
def __init__(self, master):
self.parent = master
frame = Frame(master)
screen_width, screen_height = master.winfo_screenwidth(), master.winfo_screenheight()
frame.configure(background='black')
frame.place(x=0,y=0,width=screen_width,height=screen_height)
master.overrideredirect(1)
h = .8*screen_height
self.c = Canvas(frame, width=h, height=h, bd=0, highlightthickness=0, bg='black')
self.c.place(relx=0.5, rely=0.5, anchor=CENTER)
radius = 10
self.c.update_idletasks()
hCanvas = (self.c.winfo_height())
offset = int(float(.4*hCanvas))
self.c.create_oval(hCanvas/2-radius, hCanvas/2-radius, hCanvas/2+radius, hCanvas/2+radius, fill='white', outline='white')
self.c.focus_set()
self.c.update_idletasks()
self.c.bind('<Key>', lambda event, arg=[radius]: self.create_stim(event, arg))
def create_stim(self, event, args):
print('create stim')
if __name__ == "__main__":
root = Tk()
root.attributes('-fullscreen', True)
app=App(root)
root.update()
root.mainloop()
提前感谢您的帮助!
- 已编辑以反映 martineau 建议的更改。
目前,当我以这种方式运行程序时,我不再全屏,我无法点击window到select它,我得到了错误噪音每次我敲键盘上的一个键。如果我在 app=App(root) 之后放置 root.attributes('-fullscreen', True),那么我会得到全屏的 GUI,我可以点击它,每次按下一个键时都会再次出现错误噪音.
有没有可能是我电脑上 python (2.7.10) 运行ning 的版本有问题 (MacBook Pro, 运行ning on OS X Yosemite, 10.10.4)?我应该下载 python 3 吗?
这似乎是 Tkinter 在 OSX 上的限制。当你调用 master.overrideredirect(1)
时,它似乎关闭了 tkinter 处理键盘事件的能力。如果您省略对 overrideredirect
的调用,您的代码将开始工作。
我浏览了大约十二篇关于 Tkinter、绑定按键事件和 canvas 小部件的帖子,但我阅读的 none 解决方案改变了我程序中的任何内容。 GUI 当前使用 Button-1 作为事件,但我需要它可以通过键盘进行操作。我尝试使用各种键和字母表中的字母。我也试过 self.c.focus_set(),当我尝试将事件绑定到 canvas 或框架时,它不起作用。这是我的代码:
from Tkinter import *
class App:
def __init__(self, master):
self.parent = master
frame = Frame(master)
screen_width, screen_height = master.winfo_screenwidth(), master.winfo_screenheight()
frame.configure(background='black')
frame.place(x=0,y=0,width=screen_width,height=screen_height)
master.overrideredirect(1)
h = .8*screen_height
self.c = Canvas(frame, width=h, height=h, bd=0, highlightthickness=0, bg='black')
self.c.place(relx=0.5, rely=0.5, anchor=CENTER)
radius = 10
self.c.update_idletasks()
hCanvas = (self.c.winfo_height())
offset = int(float(.4*hCanvas))
self.c.create_oval(hCanvas/2-radius, hCanvas/2-radius, hCanvas/2+radius, hCanvas/2+radius, fill='white', outline='white')
self.c.focus_set()
self.c.update_idletasks()
self.c.bind('<Key>', lambda event, arg=[radius]: self.create_stim(event, arg))
def create_stim(self, event, args):
print('create stim')
if __name__ == "__main__":
root = Tk()
root.attributes('-fullscreen', True)
app=App(root)
root.update()
root.mainloop()
提前感谢您的帮助!
- 已编辑以反映 martineau 建议的更改。
目前,当我以这种方式运行程序时,我不再全屏,我无法点击window到select它,我得到了错误噪音每次我敲键盘上的一个键。如果我在 app=App(root) 之后放置 root.attributes('-fullscreen', True),那么我会得到全屏的 GUI,我可以点击它,每次按下一个键时都会再次出现错误噪音. 有没有可能是我电脑上 python (2.7.10) 运行ning 的版本有问题 (MacBook Pro, 运行ning on OS X Yosemite, 10.10.4)?我应该下载 python 3 吗?
这似乎是 Tkinter 在 OSX 上的限制。当你调用 master.overrideredirect(1)
时,它似乎关闭了 tkinter 处理键盘事件的能力。如果您省略对 overrideredirect
的调用,您的代码将开始工作。