Python pyqt5冻结问题
示例.pyPython 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
# -*- 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()
self.app.addLibraryPath(r“C:/Python/Lib/site packages/qt5_applications/Qt/plugins/imageformats”)
为正确(这用于打开任何图像格式)
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()
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选项卡