【问题标题】:Python program not responding when I run it, using PyQt 5使用 PyQt 5 运行 Python 程序时没有响应
【发布时间】:2021-05-17 00:26:49
【问题描述】:

我正在使用 PyQt 5 制作频率表当我运行代码时,会弹出窗口,在屏幕上绘制符号,但随后窗口冻结。然后它说它没有响应。我不明白发生了什么。代码如下:

import sys
from PyQt5.QtWidgets import QWidget,QApplication,QTableWidget,QTableWidgetItem,QVBoxLayout
from pynput.mouse import Button, Controller
from pynput.keyboard import Listener, KeyCode
a=KeyCode(char='r')

def getSelectedItemData():
    for currentItem  in tableWidget.selectedItems():
        print("ROw : "+str(currentItem.row())+" Column : "+str(currentItem.column())+" "+currentItem.text())

app=QApplication(sys.argv)

qwidget=QWidget()

qwidget.setWindowTitle("Python GUI Table")
qwidget.resize(300,400)

layout=QVBoxLayout()

tableWidget=QTableWidget()
tableWidget.setColumnCount(3)
tableWidget.setRowCount(2)

#adding item in table
tableWidget.setHorizontalHeaderItem(0,QTableWidgetItem("Scores"))
tableWidget.setHorizontalHeaderItem(1,QTableWidgetItem("Frquency"))
tableWidget.setHorizontalHeaderItem(2,QTableWidgetItem("FX"))
tableWidget.setItem(0,0,QTableWidgetItem(""))
tableWidget.setItem(0,1,QTableWidgetItem(""))
tableWidget.setItem(0,2,QTableWidgetItem(""))

tableWidget.setItem(1,0,QTableWidgetItem(""))
tableWidget.setItem(1,1,QTableWidgetItem(""))
tableWidget.setItem(1,2,QTableWidgetItem(""))

tableWidget.setItem(2,0,QTableWidgetItem(""))
tableWidget.setItem(2,1,QTableWidgetItem(""))
tableWidget.setItem(2,2,QTableWidgetItem(""))

tableWidget.setItem(3,0,QTableWidgetItem(""))
tableWidget.setItem(3,1,QTableWidgetItem(""))
tableWidget.setItem(3,2,QTableWidgetItem(""))

tableWidget.doubleClicked.connect(getSelectedItemData)
layout.addWidget(tableWidget)
qwidget.setLayout(layout)
qwidget.show()

#Adding loop 
def on_press(key):
    if key == a:
        tableWidget.insertRow(tableWidget.rowCount()+1)

with Listener(on_press=on_press) as listener:
    listener.join()

sys.exit(app.exec_())  

【问题讨论】:

    标签: python pyqt5


    【解决方案1】:

    您有以下错误:

    • 与 pyinput 事件关联的回调在辅助线程中调用,因此在您的代码中您试图直接从另一个线程修改 GUI,这是被禁止的。

    • join() 方法不允许事件循环运行导致 GUI 冻结。使用start() 方法。

    • 如果要插入文件,则必须将 rowCount() 传递给它,而不是 rowCount() +1。

    import sys
    from functools import cached_property
    
    from PyQt5.QtCore import QObject, pyqtSignal
    from PyQt5.QtWidgets import (
        QWidget,
        QApplication,
        QTableWidget,
        QTableWidgetItem,
        QVBoxLayout,
    )
    
    from pynput.mouse import Button, Controller
    from pynput.keyboard import Listener, KeyCode
    
    a = KeyCode(char="r")
    
    
    def getSelectedItemData():
        for currentItem in tableWidget.selectedItems():
            print(
                f"ROw : {currentItem.row()} Column : {currentItem.column()} {currentItem.text()}"
            )
    
    
    app = QApplication(sys.argv)
    
    qwidget = QWidget()
    
    qwidget.setWindowTitle("Python GUI Table")
    qwidget.resize(300, 400)
    
    layout = QVBoxLayout()
    
    tableWidget = QTableWidget()
    tableWidget.setColumnCount(3)
    tableWidget.setRowCount(2)
    
    # adding item in table
    tableWidget.setHorizontalHeaderItem(0, QTableWidgetItem("Scores"))
    tableWidget.setHorizontalHeaderItem(1, QTableWidgetItem("Frquency"))
    tableWidget.setHorizontalHeaderItem(2, QTableWidgetItem("FX"))
    tableWidget.setItem(0, 0, QTableWidgetItem(""))
    tableWidget.setItem(0, 1, QTableWidgetItem(""))
    tableWidget.setItem(0, 2, QTableWidgetItem(""))
    
    tableWidget.setItem(1, 0, QTableWidgetItem(""))
    tableWidget.setItem(1, 1, QTableWidgetItem(""))
    tableWidget.setItem(1, 2, QTableWidgetItem(""))
    
    tableWidget.setItem(2, 0, QTableWidgetItem(""))
    tableWidget.setItem(2, 1, QTableWidgetItem(""))
    tableWidget.setItem(2, 2, QTableWidgetItem(""))
    
    tableWidget.setItem(3, 0, QTableWidgetItem(""))
    tableWidget.setItem(3, 1, QTableWidgetItem(""))
    tableWidget.setItem(3, 2, QTableWidgetItem(""))
    
    tableWidget.doubleClicked.connect(getSelectedItemData)
    layout.addWidget(tableWidget)
    qwidget.setLayout(layout)
    qwidget.show()
    
    
    class KeyListener(QObject):
        pressed = pyqtSignal(object)
        released = pyqtSignal(object)
    
        @cached_property
        def listener(self):
            return Listener(on_release=self.on_release, on_press=self.on_press)
    
        def on_press(self, key):
            self.pressed.emit(key)
    
        def on_release(self, key):
            self.released.emit(key)
    
        def start(self):
            return self.listener.start()
    
    
    def handle_pressed(key):
        if key == a:
            tableWidget.insertRow(tableWidget.rowCount())
    
    
    key_listener = KeyListener()
    key_listener.pressed.connect(handle_pressed)
    key_listener.start()
    
    sys.exit(app.exec_())
    

    【讨论】:

    • 谢谢,非常感谢
    猜你喜欢
    • 2018-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-23
    • 1970-01-01
    • 1970-01-01
    • 2021-10-06
    相关资源
    最近更新 更多