【发布时间】:2020-05-16 19:54:53
【问题描述】:
当我尝试更改滚动区域内的文本浏览器的文本时,我收到此 PyQt5 线程错误:
QObject: Cannot create children for a parent that is in a different thread.
(Parent is QTextDocument(0x212e3bb1f50), parent's thread is QThread(0x212e171e220), current thread is QThread(0x212e41dc7e0)
我认为这是因为滚动区域,我无法从我试图更改它的线程访问它,如果我输入相同的代码,它就可以工作......
filepath = "..."
with open(filepath, "r") as f:
contents = f.read()
#print(contents)
self.log_1.setText(contents)
(是的,我知道文件路径是“...”,用于文件安全。) ...在创建滚动区域的线程内,它工作得很好。
我唯一不知道的是如何解决这个问题。我认为您可能能够以某种方式将线程继承到滚动区域,idk。
我的代码,但经过简化:
from PyQt5 import QtCore, QtGui, QtWidgets
from mcstatus import MinecraftServer
import threading
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(1379, 523)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.scrollArea_1 = QtWidgets.QScrollArea(self.S1)
self.scrollArea_1.setGeometry(QtCore.QRect(0, 20, 981, 341))
self.scrollArea_1.setWidgetResizable(True)
self.scrollArea_1.setObjectName("scrollArea_1")
self.scrollAreaWidgetContents_1 = QtWidgets.QWidget()
self.scrollAreaWidgetContents_1.setGeometry(QtCore.QRect(0, 0, 979, 339))
self.scrollAreaWidgetContents_1.setObjectName("scrollAreaWidgetContents_1")
self.log_1 = QtWidgets.QTextBrowser(self.scrollAreaWidgetContents_1)
self.log_1.setGeometry(QtCore.QRect(0, 0, 981, 341))
self.log_1.setMinimumSize(QtCore.QSize(981, 341))
self.log_1.viewport().setProperty("cursor",
QtGui.QCursor(QtCore.Qt.IBeamCursor))
self.log_1.setObjectName("log_1")
self.scrollArea_1.setWidget(self.scrollAreaWidgetContents_1)
def update1(self, MainWindow):
threading.Timer(0.2, self.update1, {MainWindow: MainWindow}).start()
ip = "..."
port = 25565 #Server 1
server = MinecraftServer(ip, port)
try:
filepath = "..."
with open(filepath, "r") as f:
contents = f.read()
#print(contents)
self.log_1.setText(contents)
except IOError as e:
self.StatusL_1.setText(self.translate("MainWindow", "<html><head/><body><p><span style=\" font-size:18pt;\">Status: Off</span></p></body></html>"))
else:
self.StatusL_1.setText(self.translate("MainWindow", "<html><head/><body><p><span style=\" font-size:18pt;\">Status: On</span></p></body></html>"))
【问题讨论】:
-
完成了,希望这就够了。 @eyllanesc
标签: python python-3.x multithreading pyqt pyqt5