【问题标题】:Pynput: detecting global hotkey blocks wxPython framePynput:检测全局热键块 wxPython 框架
【发布时间】:2020-06-28 08:03:56
【问题描述】:

我试图通过按下全局热键在 wxPython 框架上的 show()hide() 之间切换。以下代码有两个障碍。

首先,我无法将“self”传递给keyboard.GlobalHotKeys 函数。据我所知,这是一个范围问题,但我该如何解决?

其次,with keyboard.GlobalHotKeys() as x 会阻止其余代码运行。阅读pynput documentation 我觉得它是非阻塞的。

此处提供的代码是一个示例。在我的真实程序中,有一个托盘图标表示程序正在运行。我想要几个热键,但在实施时遇到了这个问题。我知道这个问题可能与线程有关。我一直在尝试阅读 wxPython 的线程处理,但目前它对我来说太高级了。

谢谢。

import wx
from pynput import keyboard

class Test(wx.Frame):
    def __init__(self, parent):
        super().__init__(parent, title="title")

        def show_panel(self):
            if self.Show() == True:
                self.Show()
            else:
                self.Hide()

    def h_show(self):
        print('<ctrl>+s pressed')
        self.show_panel

    with keyboard.GlobalHotKeys({'<ctrl>+s': h_show}) as x:
        x.join()

def main():
    app = wx.App()
    ex = Test(None)
    app.MainLoop()

if __name__ == '__main__':
    main()

【问题讨论】:

    标签: python wxpython pynput


    【解决方案1】:

    所以,我第四次重做了所有事情,并意识到我做错了什么。这并不能回答我的问题,但它确实可以满足我的要求。

    import wx
    from pynput import keyboard
    
    class Test(wx.Frame):
        def __init__(self, parent):
            super().__init__(parent, title="title")
    
    
    def main():
        app = wx.App()
        ex = Test(None)
        def show_panel():
            if ex.Show() == True:
                ex.Show()
            else:
                ex.Hide()
    
        listener = keyboard.GlobalHotKeys({'<ctrl>+s': show_panel})
        listener.start()
        app.MainLoop()
    
    if __name__ == '__main__':
        main()
    

    【讨论】:

      猜你喜欢
      • 2012-03-09
      • 2021-12-21
      • 1970-01-01
      • 2020-02-17
      • 2016-02-28
      • 2010-12-12
      • 2019-12-07
      • 2016-02-22
      • 2018-05-01
      相关资源
      最近更新 更多