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

PySide6程序点击按钮无法在外部输入符号的问题求助

解决PySide6按钮点击抢占焦点导致无法在外部软件输入符号的问题

问题分析

点击PySide6程序中的按钮时,程序窗口会自动获取焦点,导致外部写作软件失去焦点,keyboard.write()无法将符号输入到目标软件中。

解决方案

通过禁止按钮获取焦点,并确保写入符号前激活原外部窗口来解决该问题,修改后的代码如下:

from PySide6.QtWidgets import QApplication, QPushButton, QLineEdit
from PySide6.QtCore import QFile, Qt
from PySide6.QtUiTools import QUiLoader
import keyboard, time

app = QApplication([])

# 加载UI文件
ui_file = QFile("test/ui_file.ui")
ui_file.open(QFile.ReadOnly)
loader = QUiLoader()
window = loader.load(ui_file)
ui_file.close()

# 设置窗口置顶
window.setWindowFlags(window.windowFlags() | Qt.WindowStaysOnTopHint)

# 获取按钮控件
pushButton_arrow = window.findChild(QPushButton, "pushButton_arrow")
pushButton_checkmark = window.findChild(QPushButton, "pushButton_checkmark")
pushButton_cross = window.findChild(QPushButton, "pushButton_cross")

# 关键修改:禁止按钮获取焦点,避免点击时窗口抢占外部软件焦点
pushButton_arrow.setFocusPolicy(Qt.NoFocus)
pushButton_checkmark.setFocusPolicy(Qt.NoFocus)
pushButton_cross.setFocusPolicy(Qt.NoFocus)

def write_1(a):
    # 获取点击按钮前的活动窗口(外部目标软件窗口)
    active_window = QApplication.activeWindow()
    if active_window and active_window != window:
        # 激活原外部窗口
        active_window.activateWindow()
    # 短暂延迟确保窗口激活完成
    time.sleep(0.05)
    keyboard.write(a)

# 绑定按钮点击事件
pushButton_arrow.clicked.connect(lambda: write_1("⇒"))
pushButton_cross.clicked.connect(lambda: write_1("✖"))
pushButton_checkmark.clicked.connect(lambda: write_1("✔"))

window.show()
app.exec()

核心改动说明

  1. 禁止按钮获取焦点:通过setFocusPolicy(Qt.NoFocus)让按钮在被点击时不会触发窗口焦点切换,外部软件的焦点得以保留。
  2. 恢复原窗口焦点:在写入符号前,获取并激活点击按钮前的活动窗口,确保符号输入到目标软件中;添加短暂延迟是为了等待窗口激活完成,避免写入操作失效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 14:37:48