Tkinter 密钥绑定不适用于密钥:"PrintScreen"



im正在尝试构建一个"关键测试";应显示钥匙是否工作的程序。(我来自自定义键盘社区(

我的代码对";esc";以及";F1"-"F12";但是用";PrintScreen";它不起作用。我不知道为什么它能和所有其他键一起工作,而不能和打印屏幕一起工作。以下是相关文章的代码片段:

from tkinter import *
window = Tk()
c = Canvas(window, width=1135, height=300, bg="lavender")
c.pack()
#Create the rectangle for PrintScreen, ScrollLock and Pause
key13 = c.create_rectangle(772.5, 10, 812.5, 50, fill="white") #PrintScreen
key14 = c.create_rectangle(822.5, 10, 862.5, 50, fill="white") #ScrollLock
key15 = c.create_rectangle(872.5, 10, 912.5, 50, fill="white")  # Pause
#(german) Text for each Key 
text13 = c.create_text(791, 20, text="Druck", font=('Helvetica', '8'))
text14 = c.create_text(841, 20, text="Rollen", font=('Helvetica', '8'))
text15 = c.create_text(891, 20, text="Pause", font=('Helvetica', '8'))
#event functions 
def key_event13(event):
c.itemconfig(key13, fill="DarkSeaGreen2")

def key_event14(event):
c.itemconfig(key14, fill="DarkSeaGreen2")

def key_event15(event):
c.itemconfig(key15, fill="DarkSeaGreen2")

#bind the keys
c.bind_all("<KeyPress-Print>", key_event13)
c.bind_all("<KeyPress-Scroll_Lock>", key_event14)
c.bind_all("<KeyPress-Pause>", key_event15)
window.mainloop()

我已经尝试过使用

c.bind_all("event.keysym_num == 65377", key_event13) 

而不是

c.bind_all("<KeyPress-Print>", key_event13) 

这也不起作用。。。

我希望这里有人能帮助我。向Simon 致以最良好的问候

我不能告诉你为什么它不起作用,但你可以通过使用keyboard模块来解决这个问题:

pip install keyboard

它有一个监听按键的功能,因此您可以使用它来检测何时按下打印屏幕键并调用回调(因此您将使用它而不是bind(:

keyboard.on_press_key('print screen', key_event13)

因此完整的版本(没有不必要的部分(将是:

from tkinter import Tk, Canvas
import keyboard

def key_event13(event):
# may want to add this since `keyboard` listens to all keyboard events and
# so even if the window is not in focus it will call this function
# which these two lines would prevent if needed
if window.focus_get() is None:
return
c.itemconfig(key13, fill="DarkSeaGreen2")

window = Tk()
c = Canvas(window, width=1135, height=300, bg="lavender")
c.pack()
key13 = c.create_rectangle(772.5, 10, 812.5, 50, fill="white")
text13 = c.create_text(791, 20, text="Druck", font=('Helvetica', '8'))
keyboard.on_press_key('print screen', key_event13)
window.mainloop()

显然,对于其余的密钥,只需使用bind

此外:
我强烈建议在导入某些内容时不要使用通配符(*(,您应该导入您需要的内容,例如from module import Class1, func_1, var_2等,或者导入整个模块:import module然后您也可以使用别名:import module as md或类似的东西,重点是除非您真的知道自己在做什么,否则不要导入所有内容;名称冲突是个问题。

作为组织代码的附带说明(我的观点(,我还建议您将函数与GUI分离,就像我在示例中所做的那样,这样代码更可读。

最新更新