You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中实现PyQt5 GUI后台时禁用Pynput

实现PyQt5后台时禁用Pynput快捷键监听

要实现GUI后台时禁用Pynput监听,核心思路是监听窗口的激活状态变化,在窗口失去焦点(后台)时停止Pynput监听,重新获得焦点(前台)时重启监听。

关键实现步骤

  • 保存Pynput的Listener实例,方便动态启停
  • 利用PyQt5的QApplication.focusChanged信号,监听窗口焦点变化
  • 在状态切换时,启停Pynput监听线程

修改后的完整代码示例

from pytube import YouTube
from PyQt5 import QtCore, QtGui, QtWidgets
from tkinter.messagebox import showerror as hata, showinfo as bilgi, showwarning as uyari, askyesno as soru
from sys import argv, exit as exiting
from threading import Thread as th
from GUI import *  # 替换为你的UI类所在模块
from numpy import arange as range
import sqlite3 as sql
import youtube_dl
import vlc
import time
import os
from pynput.keyboard import Listener, Key
from keyboard import is_pressed as pressed, press


class YourMainWindow(QtWidgets.QMainWindow, Ui_MainWindow):  # 替换为你的实际窗口类
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.listener = None
        self.listener_thread = None
        
        # 绑定窗口焦点变化信号
        QtCore.QApplication.instance().focusChanged.connect(self.on_focus_changed)
        
        # 程序启动时默认启动监听
        self.start_listener()

    def start_listener(self):
        """启动Pynput监听线程"""
        if not (self.listener and self.listener.is_alive()):
            def listener_task():
                self.listener = Listener(on_press=self.onpress)
                self.listener.start()
                self.listener.join()
            
            self.listener_thread = th(target=listener_task, daemon=True)
            self.listener_thread.start()

    def stop_listener(self):
        """停止Pynput监听"""
        if self.listener and self.listener.is_alive():
            self.listener.stop()
            self.listener = None

    def on_focus_changed(self, old_widget, new_widget):
        """窗口焦点切换时触发"""
        if new_widget == self:
            # 窗口回到前台,重启监听
            self.start_listener()
        else:
            # 窗口退到后台,停止监听
            self.stop_listener()

    def onpress(self, key):
        """快捷键处理逻辑"""
        try:
            if key == Key.esc or pressed("ESC"):
                os.system(fr"taskkill /f /im {__file__.split(chr(92))[-1]}")
        except Exception:
            pass


if __name__ == "__main__":
    app = QtWidgets.QApplication(argv)
    window = YourMainWindow()
    window.show()
    exiting(app.exec_())

代码说明

  1. 窗口类整合:将主窗口类继承自自动生成的UI类和PyQt5窗口基类,确保能监听窗口事件
  2. 焦点监听:通过QApplication.focusChanged信号,实时判断当前窗口是否处于前台
  3. 监听启停控制:start_listener和stop_listener方法封装了监听线程的创建和停止逻辑,避免重复启动线程
  4. 守护线程设置:将监听线程设为守护线程,保证程序退出时线程能自动终止

注意事项

  • 替换代码中的YourMainWindow和Ui_MainWindow为你实际的窗口类名(来自GUI.py)
  • 若你的窗口是QWidget而非QMainWindow,只需修改继承类即可,逻辑通用
  • 避免在onpress回调中执行耗时操作,防止阻塞GUI主线程

内容的提问来源于stack exchange,提问作者Deezwend

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 13:03:17