第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

使用“鍵盤(pán)”在失去焦點(diǎn)時(shí)打開(kāi)新窗口

使用“鍵盤(pán)”在失去焦點(diǎn)時(shí)打開(kāi)新窗口

慕森卡 2022-12-20 15:27:22
我正在嘗試使用模塊“鍵盤(pán)”跟蹤我的按鍵,而 PySide2 小部件未處于焦點(diǎn)狀態(tài),效果很好。但是,當(dāng)我嘗試使用“鍵盤(pán)”快捷方式創(chuàng)建新的 Widget 時(shí),程序崩潰了。按下按鈕打開(kāi)一個(gè)窗口工作正常。我也可以使用“鍵盤(pán)”調(diào)用非 UI 函數(shù),例如。打印功能沒(méi)有任何問(wèn)題。你知道解決這個(gè)問(wèn)題的方法嗎?使用“鍵盤(pán)”或任何其他方法打開(kāi)一個(gè)新窗口,而 PySide2 窗口不在焦點(diǎn)上。在這個(gè)例子中,我想在“CTRL+D”上打開(kāi)一個(gè)新窗口。PySide2 和 PyQt5 都存在該問(wèn)題。這是我的縮短代碼:import sysimport jsonimport osimport keyboardfrom PySide2.QtWidgets import QApplication, QWidget, QGridLayout, QKeySequenceEdit, QLabel, QPushButton, QShortcutfrom PySide2.QtCore import Qt, QObject, Signal, Slot # Qt.Key_W beispielsweise#from PyQt5.QtWidgets import QApplication, QWidget, QGridLayout, QKeySequenceEdit, QLabel, QPushButton, QShortcut#from PyQt5.QtCore import Qt, QObject, pyqtSignal as Signal, pyqtSlot as Slot # Qt.Key_W beispielsweiseclass ConfigWindow(QWidget):    def __init__(self):        super().__init__()        self.initUi()        self.init_shortcuts()        self.show()    def initUi(self):        self.setGeometry(300,300, 400, 250)        self.setWindowTitle("Settings")        grid = QGridLayout()        self.setLayout(grid)        self.keyseq = QKeySequenceEdit("CTRL+D")        grid.addWidget(self.keyseq, 0, 0)        s_button = QPushButton("Safe")        grid.addWidget(s_button, 1, 0)        cl_button = QPushButton("Close")        grid.addWidget(cl_button, 1, 1)        cl_button.clicked.connect(self.close)        open_button = QPushButton("openw")        grid.addWidget(open_button, 2, 0)        open_button.clicked.connect(self.call_item_parser)    def keyPressEvent(self, event): #event:PySide2.QtGui.QKeyEvent        if event.key() == Qt.Key_Escape:            self.close()
查看完整描述

1 回答

?
藍(lán)山帝景

TA貢獻(xiàn)1843條經(jīng)驗(yàn) 獲得超7個(gè)贊

問(wèn)題是因?yàn)樵阪I盤(pán)上注冊(cè)的回調(diào)是在輔助線(xiàn)程中執(zhí)行的,可以通過(guò)修改以下部分代碼并打印來(lái)驗(yàn)證threading.current_thread()。在 Qt 中,禁止在另一個(gè)線(xiàn)程中創(chuàng)建任何小部件,因?yàn)樗鼈儾皇蔷€(xiàn)程安全的。


def call_item_parser(self):

    print(threading.current_thread())

    self.h_w = ParseWindow()

    self.h_w.setWindowTitle("New Window")

    self.h_w.setGeometry(100, 100, 100, 100)

    self.h_w.show()

print(threading.current_thread())

app = QApplication(sys.argv)

w = ConfigWindow()

sys.exit(app.exec_())

輸出:


<_MainThread(MainThread, started 140144979916608)>

Binding _price_keyseq to ctrl+a

<Thread(Thread-10, started daemon 140144220817152)>

一種可能的解決方案是使用信號(hào)將信息發(fā)送到主線(xiàn)程,并在主線(xiàn)程中調(diào)用回調(diào)。


import sys

from functools import partial

import platform

import threading


import keyboard



from PySide2.QtCore import Qt, QObject, Signal, Slot

from PySide2.QtGui import QKeySequence

from PySide2.QtWidgets import (

    QApplication,

    QWidget,

    QGridLayout,

    QKeySequenceEdit,

    QPushButton,

)



class KeyBoardManager(QObject):

    activated = Signal(str)


    def __init__(self, parent=None):

        super().__init__(parent)

        self._callbacks = dict()

        self.activated.connect(self._handle_activated)


    @property

    def callbacks(self):

        return self._callbacks


    def register(self, shortcut, callback, *, args=(), kwargs=None):

        self.callbacks[shortcut] = (callback, args, kwargs or {})

        keyboard.add_hotkey(shortcut, partial(self.activated.emit, shortcut))


    @Slot(str)

    def _handle_activated(self, shortcut):

        values = self.callbacks.get(shortcut)

        if values is not None:

            callback, args, kwargs = self._callbacks[shortcut]


            callback(*args, **kwargs)



class ConfigWindow(QWidget):

    def __init__(self):

        super().__init__()

        self.initUi()

        self.init_shortcuts()

        self.show()


    def initUi(self):

        self.setGeometry(300, 300, 400, 250)

        self.setWindowTitle("Settings")

        grid = QGridLayout(self)


        self.keyseq = QKeySequenceEdit("CTRL+A")

        grid.addWidget(self.keyseq, 0, 0)


        s_button = QPushButton("Safe")

        grid.addWidget(s_button, 1, 0)


        cl_button = QPushButton("Close")

        grid.addWidget(cl_button, 1, 1)

        cl_button.clicked.connect(self.close)


        open_button = QPushButton("openw")

        grid.addWidget(open_button, 2, 0)

        open_button.clicked.connect(self.call_item_parser)


    def keyPressEvent(self, event):  # event:PySide2.QtGui.QKeyEvent

        if event.key() == Qt.Key_Escape:

            self.close()


    # shortcuts are listened to, while program is running

    def init_shortcuts(self):

        self.keyboard_manager = KeyBoardManager()


        str_value = self.keyseq.keySequence().toString()

        if platform.system() == "Linux":

            str_value = str_value.lower()

        print("Binding _price_keyseq to {}".format(str_value))

        self.keyboard_manager.register(str_value, self.call_item_parser)


    def call_item_parser(self):

        print(threading.current_thread())

        self.h_w = ParseWindow()

        self.h_w.setWindowTitle("New Window")

        self.h_w.setGeometry(100, 100, 100, 100)

        self.h_w.show()



class ParseWindow(QWidget):

    pass



def main():

    print(threading.current_thread())

    app = QApplication(sys.argv)

    w = ConfigWindow()

    sys.exit(app.exec_())



if __name__ == "__main__":

    main()

輸出:


<_MainThread(MainThread, started 140037641176896)>

Binding _price_keyseq to ctrl+a

<_MainThread(MainThread, started 140037641176896)>


查看完整回答
反對(duì) 回復(fù) 2022-12-20
  • 1 回答
  • 0 關(guān)注
  • 111 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)