I am making a frequency table using PyQt 5 When I run the code, the window pops up, drawing the symbol on the screen but the window then freezes. It then says it is not responding. I do not understand whats happening. Here is the code:
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_())
You have the following errors:
The callbacks associated with a pyinput event are invoked in secondary threads, so in your code you are trying to modify the GUI directly from another thread, which is prohibited.
The join() method does not allow the eventloop to run causing the GUI to freeze. Use the start()
method.
If you want to insert a file you have to pass it the rowCount(), not the 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_())
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.