简体   繁体   中英

Python program not responding when I run it, using PyQt 5

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM