Python程序在我使用PyQt 5运行时没有响应



我正在使用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_())  

您有以下错误:

  • 与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_())

相关内容

最新更新