【问题标题】:Tkinter key bind don't work with key: "PrintScreen"Tkinter 键绑定不适用于键:“PrintScreen”
【发布时间】:2022-01-21 06:54:44
【问题描述】:

我正在尝试构建一个“Key-Test”程序,它应该显示一个键是否有效。 (我来自自定义键盘社区)

我的代码在“esc”和“F1”-“F12”上运行良好,但在“PrintScreen”下它不起作用。我不知道为什么它适用于所有其他键而不适用于 printscreen。 这是相关段落中的代码sn-p:

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) 

这也不行……

我希望这里有人可以帮助我。 最好的问候西蒙

【问题讨论】:

  • 我怀疑您的操作系统正在处理该按键本身,甚至没有将其传递给应用程序。
  • 您可以确定 tkinter 是否对该键做出反应。执行root.bind("&lt;Key&gt;", lambda e: print(e.keysyms) 并按下打印屏幕按钮。
  • 我用以下小程序进行了尝试:codespeedy.com/detect-keypress-in-tkinter-in-python tkinker 无法识别“PrintScreen”-Key...但是它的工作原理,我在一个密钥测试网站上对其进行了测试...

标签: python tkinter key-bindings


【解决方案1】:

我不能告诉你为什么它不起作用,但你可以通过使用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 分开,就像我在示例中所做的那样,以便代码更具可读性。

【讨论】:

  • 感谢您的详细解答和提示!不幸的是,即使这样也行不通。我已经编写了一个显示按下的键的程序,并且我的 PrintScreen 键根本无法识别...也许我尝试使用另一个 IDE(使用 PyCharm)或新安装...您的代码示例是否适合您?
  • 是的,它确实有效,您可以尝试使用keyboard 模块的功能来监听击键,您可以按打印屏幕并查看它的名称(如果已注册),也可以尝试使用一些windows api,否则我不知道
猜你喜欢
  • 2011-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多