Python pyqt5冻结问题

Python pyqt5冻结问题,python,multithreading,pyqt5,qtimer,Python,Multithreading,Pyqt5,Qtimer,示例.py # -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'example.ui' # # Created by: PyQt5 UI code generator 5.15.4 # # WARNING: Any manual changes made to this file will be lost when pyuic5 is # run again. Do not edit th

示例.py

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'example.ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
        self.gridLayout.setObjectName("gridLayout")
        self.player_list_table = QtWidgets.QTableWidget(self.centralwidget)
        self.player_list_table.setObjectName("player_list_table")
        self.player_list_table.setColumnCount(5)
        self.player_list_table.setRowCount(0)
        item = QtWidgets.QTableWidgetItem()
        self.player_list_table.setHorizontalHeaderItem(0, item)
        item = QtWidgets.QTableWidgetItem()
        self.player_list_table.setHorizontalHeaderItem(1, item)
        item = QtWidgets.QTableWidgetItem()
        self.player_list_table.setHorizontalHeaderItem(2, item)
        item = QtWidgets.QTableWidgetItem()
        self.player_list_table.setHorizontalHeaderItem(3, item)
        item = QtWidgets.QTableWidgetItem()
        self.player_list_table.setHorizontalHeaderItem(4, item)
        self.gridLayout.addWidget(self.player_list_table, 2, 0, 1, 1)
        self.timeline = QtWidgets.QSlider(self.centralwidget)
        self.timeline.setMaximum(100)
        self.timeline.setPageStep(1)
        self.timeline.setOrientation(QtCore.Qt.Horizontal)
        self.timeline.setObjectName("timeline")
        self.gridLayout.addWidget(self.timeline, 0, 0, 1, 1)
        self.refresh_table = QtWidgets.QPushButton(self.centralwidget)
        self.refresh_table.setObjectName("refresh_table")
        self.gridLayout.addWidget(self.refresh_table, 1, 0, 1, 1)
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        item = self.player_list_table.horizontalHeaderItem(0)
        item.setText(_translate("MainWindow", "1"))
        item = self.player_list_table.horizontalHeaderItem(1)
        item.setText(_translate("MainWindow", "2"))
        item = self.player_list_table.horizontalHeaderItem(2)
        item.setText(_translate("MainWindow", "3"))
        item = self.player_list_table.horizontalHeaderItem(3)
        item.setText(_translate("MainWindow", "4"))
        item = self.player_list_table.horizontalHeaderItem(4)
        item.setText(_translate("MainWindow", "5"))
        self.refresh_table.setText(_translate("MainWindow", "Refresh table"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())
示例_code.py

from PyQt5 import QtCore, QtGui, QtWidgets
from example import *
from PyQt5.QtCore import QTimer
from PyQt5.QtGui import QPixmap,QBrush
from PyQt5.QtGui import QPalette
from PyQt5.QtCore import Qt
import sys

class Example_Code:
    def __init__(self):
        self.app = QtWidgets.QApplication(sys.argv)     
        self.app.addLibraryPath(r"C:/Python/Lib/site-packages/qt5_applications/Qt/plugins/imageformats")
        self.app.setStyle("Fusion")
        self.mainWindow = QtWidgets.QMainWindow()
        self.main_ui = Ui_MainWindow()
        self.main_ui.setupUi(self.mainWindow)
        self.mainWindow.showMaximized()
        
        #A QTimer which set value to QSlider
        self.slider_position = 0
        self.timer=QTimer()
        self.timer.timeout.connect(self.move_slider)
        self.timer.start(125)
        
        #display table contents
        self.display_table()
        
        #on button press refresh table
        self.main_ui.refresh_table.clicked.connect(self.display_table)
        
        
        sys.exit(self.app.exec_())
        
    def move_slider(self):
        self.slider_position +=1
        self.main_ui.timeline.setValue(self.slider_position)
        if(self.slider_position>100):
            self.slider_position = 0
            
    def display_table(self):
        palette = self.main_ui.player_list_table.palette()
        palette.setBrush(QPalette.Highlight,QBrush(Qt.white))
        palette.setBrush(QPalette.HighlightedText,QBrush(Qt.black))
        
        row = 0
        
        self.main_ui.player_list_table.setWordWrap(True)
        self.main_ui.player_list_table.verticalHeader().setSectionResizeMode(QtWidgets.QHeaderView.ResizeToContents)
        
        self.player_list_data_length = 100
        self.main_ui.player_list_table.setRowCount(0)
        for player_list_row in range(0,100):
            self.main_ui.player_list_table.insertRow(player_list_row)
            for j in range(0,5):
                self.frame = QtWidgets.QFrame()
                self.frame.setGeometry(QtCore.QRect(50, 60, 355, 231))
                self.frame.setStyleSheet("QFrame{\nborder:none;\n}")
                self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
                self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
                self.gridLayout_2 = QtWidgets.QGridLayout(self.frame)
                self.gridLayout_2.setObjectName("gridLayout_2")
                self.image_title = QtWidgets.QLabel(self.frame)
                sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
                sizePolicy.setHorizontalStretch(0)
                sizePolicy.setVerticalStretch(0)
                sizePolicy.setHeightForWidth(self.image_title.sizePolicy().hasHeightForWidth())
                self.image_title.setSizePolicy(sizePolicy)
                self.image_title.setAlignment(QtCore.Qt.AlignCenter)
                self.image_title.setWordWrap(True)
                self.image_title.setStyleSheet("QLabel{\nborder:none;\n}")
                self.gridLayout_2.addWidget(self.image_title, 1, 0, 1, 3)
                self.image = QtWidgets.QLabel(self.frame)
                sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
                sizePolicy.setHorizontalStretch(0)
                sizePolicy.setVerticalStretch(0)
                sizePolicy.setHeightForWidth(self.image.sizePolicy().hasHeightForWidth())
                self.image.setSizePolicy(sizePolicy)
                self.image.setMinimumSize(QtCore.QSize(150, 150))
                self.image.setMaximumSize(QtCore.QSize(150, 150))
                self.image.setText("")
                self.image.setScaledContents(True)
                self.image.setObjectName("image")
                self.gridLayout_2.addWidget(self.image, 0, 1, 1, 1)
                spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
                self.gridLayout_2.addItem(spacerItem, 0, 2, 1, 1)
                spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
                self.gridLayout_2.addItem(spacerItem1, 0, 0, 1, 1)
                
                pixmap = QPixmap("test.png").scaledToHeight(150)
                self.image.setPixmap(pixmap)
                self.image.setScaledContents(True)
                self.image.resize(150, 150)
                
                self.image_title.setText("\n\n test.png")
                self.frame.update()
                self.main_ui.player_list_table.setCellWidget(player_list_row,j,self.frame)
                
        header = self.main_ui.player_list_table.horizontalHeader()
        header.setDefaultAlignment(QtCore.Qt.AlignHCenter | QtCore.Qt.Alignment(QtCore.Qt.TextWordWrap))
        for i in range(0,5):
            header.setSectionResizeMode(i, QtWidgets.QHeaderView.ResizeToContents)      
        
        self.main_ui.player_list_table.setStyleSheet("QTableWidget::item {border: 0px;padding: 10px 10px 10px 10px; }")
    
        self.main_ui.player_list_table.setPalette(palette)
        self.main_ui.player_list_table.setFocusPolicy(Qt.NoFocus)
    
        self.main_ui.player_list_table.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustToContents)
        self.main_ui.player_list_table.resizeColumnsToContents()
        
        print("Table updated")
            
            
program = Example_Code()
  • 将文件名为test.png的png图像放入项目目录

  • 更改行:
    self.app.addLibraryPath(r“C:/Python/Lib/site packages/qt5_applications/Qt/plugins/imageformats”)
    为正确(这用于打开任何图像格式)

  • 使用“python example\u code.py”运行应用程序

    from PyQt5 import QtCore, QtGui, QtWidgets
    from example import *
    from PyQt5.QtCore import QTimer
    from PyQt5.QtGui import QPixmap,QBrush
    from PyQt5.QtGui import QPalette
    from PyQt5.QtCore import Qt
    import sys
    
    class Example_Code:
        def __init__(self):
            self.app = QtWidgets.QApplication(sys.argv)     
            self.app.addLibraryPath(r"C:/Python/Lib/site-packages/qt5_applications/Qt/plugins/imageformats")
            self.app.setStyle("Fusion")
            self.mainWindow = QtWidgets.QMainWindow()
            self.main_ui = Ui_MainWindow()
            self.main_ui.setupUi(self.mainWindow)
            self.mainWindow.showMaximized()
            
            #A QTimer which set value to QSlider
            self.slider_position = 0
            self.timer=QTimer()
            self.timer.timeout.connect(self.move_slider)
            self.timer.start(125)
            
            #display table contents
            self.display_table()
            
            #on button press refresh table
            self.main_ui.refresh_table.clicked.connect(self.display_table)
            
            
            sys.exit(self.app.exec_())
            
        def move_slider(self):
            self.slider_position +=1
            self.main_ui.timeline.setValue(self.slider_position)
            if(self.slider_position>100):
                self.slider_position = 0
                
        def display_table(self):
            palette = self.main_ui.player_list_table.palette()
            palette.setBrush(QPalette.Highlight,QBrush(Qt.white))
            palette.setBrush(QPalette.HighlightedText,QBrush(Qt.black))
            
            row = 0
            
            self.main_ui.player_list_table.setWordWrap(True)
            self.main_ui.player_list_table.verticalHeader().setSectionResizeMode(QtWidgets.QHeaderView.ResizeToContents)
            
            self.player_list_data_length = 100
            self.main_ui.player_list_table.setRowCount(0)
            for player_list_row in range(0,100):
                self.main_ui.player_list_table.insertRow(player_list_row)
                for j in range(0,5):
                    self.frame = QtWidgets.QFrame()
                    self.frame.setGeometry(QtCore.QRect(50, 60, 355, 231))
                    self.frame.setStyleSheet("QFrame{\nborder:none;\n}")
                    self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
                    self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
                    self.gridLayout_2 = QtWidgets.QGridLayout(self.frame)
                    self.gridLayout_2.setObjectName("gridLayout_2")
                    self.image_title = QtWidgets.QLabel(self.frame)
                    sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
                    sizePolicy.setHorizontalStretch(0)
                    sizePolicy.setVerticalStretch(0)
                    sizePolicy.setHeightForWidth(self.image_title.sizePolicy().hasHeightForWidth())
                    self.image_title.setSizePolicy(sizePolicy)
                    self.image_title.setAlignment(QtCore.Qt.AlignCenter)
                    self.image_title.setWordWrap(True)
                    self.image_title.setStyleSheet("QLabel{\nborder:none;\n}")
                    self.gridLayout_2.addWidget(self.image_title, 1, 0, 1, 3)
                    self.image = QtWidgets.QLabel(self.frame)
                    sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
                    sizePolicy.setHorizontalStretch(0)
                    sizePolicy.setVerticalStretch(0)
                    sizePolicy.setHeightForWidth(self.image.sizePolicy().hasHeightForWidth())
                    self.image.setSizePolicy(sizePolicy)
                    self.image.setMinimumSize(QtCore.QSize(150, 150))
                    self.image.setMaximumSize(QtCore.QSize(150, 150))
                    self.image.setText("")
                    self.image.setScaledContents(True)
                    self.image.setObjectName("image")
                    self.gridLayout_2.addWidget(self.image, 0, 1, 1, 1)
                    spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
                    self.gridLayout_2.addItem(spacerItem, 0, 2, 1, 1)
                    spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
                    self.gridLayout_2.addItem(spacerItem1, 0, 0, 1, 1)
                    
                    pixmap = QPixmap("test.png").scaledToHeight(150)
                    self.image.setPixmap(pixmap)
                    self.image.setScaledContents(True)
                    self.image.resize(150, 150)
                    
                    self.image_title.setText("\n\n test.png")
                    self.frame.update()
                    self.main_ui.player_list_table.setCellWidget(player_list_row,j,self.frame)
                    
            header = self.main_ui.player_list_table.horizontalHeader()
            header.setDefaultAlignment(QtCore.Qt.AlignHCenter | QtCore.Qt.Alignment(QtCore.Qt.TextWordWrap))
            for i in range(0,5):
                header.setSectionResizeMode(i, QtWidgets.QHeaderView.ResizeToContents)      
            
            self.main_ui.player_list_table.setStyleSheet("QTableWidget::item {border: 0px;padding: 10px 10px 10px 10px; }")
        
            self.main_ui.player_list_table.setPalette(palette)
            self.main_ui.player_list_table.setFocusPolicy(Qt.NoFocus)
        
            self.main_ui.player_list_table.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustToContents)
            self.main_ui.player_list_table.resizeColumnsToContents()
            
            print("Table updated")
                
                
    program = Example_Code()
    
  • 按下刷新表格按钮

  • 按下此按钮时,QSlider动画将冻结几秒钟

  • 编辑:

    我尝试使用QThread,但不起作用(打开100*5=500个新窗口,因为

    QObject::setParent: Cannot set parent, new parent is in a different thread
    QObject::installEventFilter(): Cannot filter events for objects in a different t
    hread.
    
    )

    文件:example_code.py(已更新但不起作用)

    从PyQt5导入QtCore、QtGui、QtWidgets 从示例导入* 从PyQt5.QtCore导入QTimer 从PyQt5.QtGui导入QPixmap、QBrush 从PyQt5.QtGui导入qpalete 从PyQt5.QtCore导入Qt 从PyQt5.QtCore导入QObject、QThread、pyqtSignal 导入系统 导入时间 #步骤1:创建工人类 班级工作人员(QObject): 设置行计数=pyqtSignal(int) 插入行=pyqtSignal(int) cell_ready=pyqtSignal(int,int,qtwidts.QFrame) 表_ready=pyqtSignal() def运行(自): 行=0 self.set\u row\u count.emit(0) 对于范围(0100)中的玩家列表行: self.insert\u row.emit(播放器列表\u row) 对于范围(0,5)内的j: self.frame=qtwidts.QFrame() self.frame.setGeometry(QtCore.QRect(50,60355231)) self.frame.setStyleSheet(“QFrame{\n顺序:无;\n}”) self.frame.setFrameShape(qtwidts.QFrame.StyledPanel) self.frame.setFrameShadow(qtwidts.QFrame.Raised) self.gridLayout_2=qtwidts.QGridLayout(self.frame) self.gridLayout_2.setObjectName(“gridLayout_2”) self.image_title=qtwidts.QLabel(self.frame) sizePolicy=qtwidts.QSizePolicy(qtwidts.QSizePolicy.expansing,qtwidts.QSizePolicy.expansing) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.image\u title.sizePolicy().hasHeightForWidth()) self.image_title.setSizePolicy(sizePolicy) self.image\u title.setAlignment(QtCore.Qt.AlignCenter) self.image\u title.setWordWrap(True) self.image\u title.setStyleSheet(“QLabel{\n顺序:无;\n}”) self.gridLayout_2.addWidget(self.image_title,1,0,1,3) self.image=qtwidts.QLabel(self.frame) sizePolicy=qtwidts.QSizePolicy(qtwidts.QSizePolicy.expansing,qtwidts.QSizePolicy.expansing) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.image.sizePolicy().hasHeightForWidth()) self.image.setSizePolicy(sizePolicy) self.image.setMinimumSize(QtCore.QSize(150150)) self.image.setMaximumSize(QtCore.QSize(150150)) self.image.setText(“”) self.image.setScaledContents(True) self.image.setObjectName(“图像”) self.gridLayout_2.addWidget(self.image,0,1,1) SpaceItem=qtwidts.QSpacerItem(40,20,qtwidts.QSizePolicy.expansing,qtwidts.QSizePolicy.Minimum) self.gridLayout_2.addItem(间隔项,0,2,1,1) SpaceItem1=qtwidts.QSpacerItem(40,20,qtwidts.QSizePolicy.expansing,qtwidts.QSizePolicy.Minimum) self.gridLayout_2.addItem(间隔项1,0,0,1,1) pixmap=QPixmap(“test.png”)。缩放到最大高度(150) self.image.setPixmap(pixmap) self.image.setScaledContents(True) self.image.resize(150150) self.image\u title.setText(“\n\n test.png”) self.frame.update() self.cell\u ready.emit(player\u list\u row,j,self.frame) 时间。睡眠(1) #如果删除上行,则存在分段错误 self.table_ready.emit() 类示例\u代码: 定义初始化(自): self.app=qtwidts.QApplication(sys.argv) self.app.addLibraryPath(r“C:/Python/Lib/site packages/qt5_applications/Qt/plugins/imageformats”) self.app.setStyle(“Fusion”) self.mainWindow=qtwidts.QMainWindow() self.main\u ui=ui\u主窗口() self.main\u ui.setupUi(self.main窗口) self.mainWindow.showMaximized() #将值设置为QSlider的QTimer self.slider\u位置=0 self.timer=QTimer() self.timer.timeout.connect(self.move\u滑块) 自动定时器启动(125) #显示表格内容 self.display_table() #按按钮刷新表格 self.main\u ui.refresh\u table.clicked.connect(self.refresh\u table\u方法) sys.exit(self.app.exec) def刷新_表_方法(自): self.thread=QThread() self.worker=worker() self.worker.moveToThread(self.thread) self.thread.started.connect(self.worker.run) self.worker.table_ready.connect(self.thread.quit) self.worker.table_ready.connect(self.worker.deleteLater) self.thread.finished.connect(self.thread.deleteLater) self.thread.start() self.worker.set\u row\u count.connect(self.set\u row\u count\u方法) self.worker.insert\u row.connect(self.insert\u new\u row) self.worker.cell\u ready.connect(self.display\u cell) self.worker.table\u就绪。连接(self.refresh\u完成) def set_row_count_方法(自身,行): self.main\u ui.player\u list\u table.setRowCount(行) def插入新行(自身,行): self.main\u ui.player\u list\u选项卡