【问题标题】:PySimpleGUI breaks pynput. How do I combine them?PySimpleGUI 会破坏 pynput。我如何将它们结合起来?
【发布时间】:2021-09-04 09:44:11
【问题描述】:

一旦我按下 alt+ctrl+t 快捷键并关闭弹出窗口,pynput 将对快捷键的任何双击做出反应。例如,如果我按“t”两次,它将再次打开窗口(即使没有按 alt+ctrl)。 有没有办法将 pynput 的全局热键与 PySimpleGUI 结合起来?

import PySimpleGUI as sg
from pynput import keyboard

def f_test():
    layout = [[sg.Text("Hello from PySimpleGUI")], [sg.Button("OK")]]
    window = sg.Window("Demo", layout)
    while True:
        event, values = window.read()
        if event == "OK" or event == sg.WIN_CLOSED:
            break
    window.close()

with keyboard.GlobalHotKeys({
        '<alt>+<ctrl>+t': f_test}) as h:
    h.join()

【问题讨论】:

    标签: python python-3.x pynput pysimplegui


    【解决方案1】:

    我为PySimpleGUIpynput 尝试了不同的线程。

    import threading
    import PySimpleGUI as sg
    from pynput import keyboard
    
    def f(key):
        window.write_event_value(key, None)
    
    def func():
        with keyboard.GlobalHotKeys({
                '<alt>+<ctrl>+t': lambda key='Hotkey1':f(key),
                '<alt>+<ctrl>+q': lambda key='Hotkey2':f(key)}) as h:
            h.join()
    
    def f_test():
        layout = [[sg.Text("Hello from PySimpleGUI")], [sg.Button("OK")]]
        window = sg.Window("Demo", layout)
        while True:
            event, values = window.read()
            if event == "OK" or event == sg.WIN_CLOSED:
                break
        window.close()
    
    layout = [[sg.Text("")]]
    window = sg.Window("Main Script", layout, finalize=True)
    window.hide()
    threading.Thread(target=func, daemon=True).start()
    
    while True:
        event, values = window.read()
        print(event)
        if event in (sg.WINDOW_CLOSED, 'Hotkey2'):
            break
        elif event == 'Hotkey1':
            f_test()
    
    window.close()
    

    【讨论】:

    • 非常感谢。这对我有用。如果您有时间再回答一个问题:我为什么需要两个 pysimplegui 线程?当我阅读有关线程的信息时,我假设我可以启动 PySimpleGUI 的一个线程和使用 pynput 的另一个线程,它们将独立运行,但这不起作用。
    • 虽然 Tkinter 在技术上是线程安全的(假设 Tk 是用 --enable-threads 构建的),但实际上在多线程 Python 应用程序中使用时仍然存在问题。问题源于 PySimpleGUI/tkinter 在处理来自其他线程的调用时试图通过轮询技术来控制主线程。大多数时候,PySimpleGUI/tkinter 会在主线程中。
    • 感谢您的解释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-13
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-21
    相关资源
    最近更新 更多