Python 为什么';我的QLabel小部件是否显示在此线程中?
因此,我正在使用PyQt5作为UI开发一个消息传递应用程序。但是我有一个问题,我的小部件由于某种原因没有出现。我不知道为什么,尽管我似乎在编写另一个python脚本之前就解决了这个问题。但当我将这个列表应用到它中时,它似乎不起作用 出现问题的代码部分:Python 为什么';我的QLabel小部件是否显示在此线程中?,python,python-3.x,pyqt,pyqt5,Python,Python 3.x,Pyqt,Pyqt5,因此,我正在使用PyQt5作为UI开发一个消息传递应用程序。但是我有一个问题,我的小部件由于某种原因没有出现。我不知道为什么,尽管我似乎在编写另一个python脚本之前就解决了这个问题。但当我将这个列表应用到它中时,它似乎不起作用 出现问题的代码部分: class MainWindow(): def __init__(self,Authenticated,Username): if Authenticated == True: self.App
class MainWindow():
def __init__(self,Authenticated,Username):
if Authenticated == True:
self.App = QtWidgets.QApplication([])
self.LoadedApp = uic.loadUi("Developer hub main window.ui")
self.LoadedApp.UsernameText.setText("Username : " + Username)
self.MessageBoxQWidget = self.LoadedApp.MessageBoxScrollArea.findChild(QWidget,"MessageBoxQWidget")
self.MessageBoxContainer = self.LoadedApp.MessageBoxScrollArea.findChild(QWidget,"MessageBoxQWidget").findChild(QVBoxLayout,"MessageBoxContainer")
self.LoadedApp.SendMessageButton.clicked.connect(self.SendMessage)
self.LoadedApp.DeleteMessageButton.clicked.connect(self.DeleteMessage)
self.MessageBoxQWidget.setLayout(self.MessageBoxContainer)
Thread(target = self.UpdateMessages).start()
self.LoadedApp.MessageBoxScrollArea.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
self.LoadedApp.MessageBoxScrollArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.LoadedApp.MessageBoxScrollArea.setWidget(self.MessageBoxQWidget)
self.LoadedApp.show()
self.App.exec()
def SendMessage(self):
print("Sending message")
DateTimeNow = str(datetime.datetime.now())
DateTimeNow = DateTimeNow[0:16]
global Username
MessageObject = {
"Username" : Username,
"Message" : self.LoadedApp.MessageInput.toPlainText(),
"Time" : DateTimeNow
}
MessageData.insert_one(MessageObject)
print(self.LoadedApp.MessageInput.toPlainText())
self.DeleteMessage()
def DeleteMessage(self):
self.LoadedApp.MessageInput.clear()
def UpdateMessages(self):
while True:
print("Update")
for Index in range(0,self.MessageBoxContainer.count()):
print(Index)
Widget = self.LoadedApp.MessageBoxScrollArea.findChild(QWidget,"MessageBoxQWidget").findChild(QVBoxLayout,"MessageBoxContainer").findChild(QLabel,"Message"+str(Index))
if Widget is not None:
print("Found")
Widget.setParent(None)
FetchedMessages = GetData("Messages",None,None)
MessageIndex = 0
for Message in FetchedMessages:
MessageLabel = QtWidgets.QLabel()
MessageLabel.setFixedSize(511, 31)
MessageLabel.setStyleSheet("color: rgb(0,0,0);background-color: rgb(255, 255, 255);font: 10pt \"Eras Demi ITC\";")
MessageLabel.setText(Message)
MessageLabel.setObjectName("Message"+str(MessageIndex))
self.MessageBoxContainer.addWidget(MessageLabel)
MessageIndex +=1
print(Message)
self.MessageBoxQWidget.setLayout(self.MessageBoxContainer)
self.LoadedApp.show()
time.sleep(5)
有关守则的资料:
此函数位于PyQt5窗口的类中。“FetchedMessages”是一个函数,它返回包含多个循环字符串的列表。然后,QLabel就在这里生成并发送到MessageBoxContainer。“MessageBoxContainer”等于
self.LoadedApp.MessageBoxScrollArea.findChild(QWidget,“MessageBoxQWidget”).findChild(QVBoxLayout,“MessageBoxContainer”)
“MessageBoxQWidget”等于self.loadeApp.MessageBoxScrollArea.findChild(QWidget,“MessageBoxQWidget”)
以下是UI的层次结构:
我在运行程序时没有收到任何错误。只是QLabel根本没有出现。下面是我运行程序时的结果:
但在我的另一个测试脚本中,我得到了:
但是另一个脚本在等待5秒的while-true循环内没有在线程中运行函数。如您所见,这是我为第二个脚本的函数编写的代码:
class MainWindow():
def __init__(self,Authenticated,Username):
if Authenticated == True:
self.App = QtWidgets.QApplication([])
self.LoadedApp = uic.loadUi("Developer hub main window.ui")
self.LoadedApp.UsernameText.setText("Username : " + Username)
MessageBoxQWidget = self.LoadedApp.MessageBoxScrollArea.findChild(QWidget,"MessageBoxQWidget")
MessageBoxContainer = self.LoadedApp.MessageBoxScrollArea.findChild(QWidget,"MessageBoxQWidget").findChild(QVBoxLayout,"MessageBoxContainer")
self.Messages = []
for x in range(1,30):
self.Messages.append("Test [29/9/2019 - 13:50] : Hello"+ str(x))
print(self.Messages)
for Message in self.Messages:
MessageLabel = QtWidgets.QLabel()
MessageLabel.setFixedSize(511, 31)
MessageLabel.setStyleSheet("color: rgb(0,0,0);background-color: rgb(255, 255, 255);font: 10pt \"Eras Demi ITC\";")
MessageLabel.setText(Message)
MessageBoxContainer.addWidget(MessageLabel)
#How to remove a label [Below]
#MessageLabel.setParent(None)
# An attribute of the class is created with setattr()
#setattr(self, "{}_infor_label".format(Message), MessageLabel)
MessageBoxQWidget.setLayout(MessageBoxContainer)
self.LoadedApp.MessageBoxScrollArea.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
self.LoadedApp.MessageBoxScrollArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.LoadedApp.MessageBoxScrollArea.setWidget(MessageBoxQWidget)
self.LoadedApp.SendMessageButton.clicked.connect(self.SendMessage)
self.LoadedApp.DeleteMessageButton.clicked.connect(self.DeleteMessage)
self.LoadedApp.show()
self.App.exec()
def SendMessage(self):
print("Sending message")
print(self.LoadedApp.MessageInput.toPlainText())
self.DeleteMessage()
def DeleteMessage(self):
self.LoadedApp.MessageInput.clear()
有什么帮助吗?如果您需要更多的上下文或更多的信息,请说,我会提供它
[编辑]
下面是简化的代码。我每5秒收到一条消息和一条“更新”打印语句,但QLabel没有出现:
class MainWindow():
def __init__(self,Username):
self.App = QtWidgets.QApplication([])
self.LoadedApp = uic.loadUi("Developer hub main window.ui")
self.MessageBoxQWidget = self.LoadedApp.MessageBoxScrollArea.findChild(QWidget,"MessageBoxQWidget")
self.MessageBoxContainer = self.LoadedApp.MessageBoxScrollArea.findChild(QWidget,"MessageBoxQWidget").findChild(QVBoxLayout,"MessageBoxContainer")
self.MessageBoxQWidget.setLayout(self.MessageBoxContainer)
Thread(target = self.UpdateMessages).start()
self.LoadedApp.MessageBoxScrollArea.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
self.LoadedApp.MessageBoxScrollArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.LoadedApp.MessageBoxScrollArea.setWidget(self.MessageBoxQWidget)
self.LoadedApp.show()
self.App.exec()
def UpdateMessages(self):
while True:
print("Update")
FetchedMessages = ["Message1Example","Message2Example","Message3Example"]
MessageIndex = 0
for Message in FetchedMessages:
MessageLabel = QtWidgets.QLabel()
MessageLabel.setFixedSize(511, 31)
MessageLabel.setStyleSheet("color: rgb(0,0,0);background-color: rgb(255, 255, 255);font: 10pt \"Eras Demi ITC\";")
MessageLabel.setText(Message)
MessageLabel.setObjectName("Message"+str(MessageIndex))
self.MessageBoxContainer.addWidget(MessageLabel)
MessageIndex +=1
print(Message)
time.sleep(5)
这里还有一个用户界面:如果您想执行定期任务,则不必使用带有time.sleep()的线程,因为Qt不允许在另一个线程中创建或修改部分GUI,请改用QTimer
# ..
self.LoadedApp.show()
timer = QtCore.QTimer(interval=5*1000, timeout=self.UpdateMessages)
self.UpdateMessages()
timer.start()
self.App.exec()
def UpdateMessages(self):
FetchedMessages = ["Message1Example","Message2Example","Message3Example"]
for MessageIndex, Message in enumerate(FetchedMessages):
MessageLabel = QtWidgets.QLabel()
MessageLabel.setFixedSize(511, 31)
MessageLabel.setStyleSheet("color: rgb(0,0,0);background-color: rgb(255, 255, 255);font: 10pt \"Eras Demi ITC\";")
MessageLabel.setText(Message)
MessageLabel.setObjectName("Message{}".format(MessageIndex))
self.MessageBoxContainer.addWidget(MessageLabel)
print(Message)
#。。
self.LoadedApp.show()
计时器=QtCore.QTimer(间隔=5*1000,超时=self.UpdateMessages)
self.UpdateMessages()
timer.start()
self.App.exec()
def更新消息(自我):
FetchedMessages=[“Message1Example”、“Message2Example”、“Message3Example”]
对于MessageIndex,枚举中的消息(FetchedMessages):
MessageLabel=qtwidts.QLabel()
MessageLabel.setFixedSize(511,31)
MessageLabel.setStyleSheet(“颜色:rgb(0,0,0);背景色:rgb(255,255,255);字体:10pt\“Eras Demi ITC\”;”)
MessageLabel.setText(消息)
MessageLabel.setObjectName(“Message{}”.format(MessageIndex))
self.MessageBoxContainer.addWidget(MessageLabel)
打印(消息)
提供一个已完成的代码。我添加了一个简化版本的代码。1)共享.ui 2)您是否使用time.sleep()来延迟或为什么要模拟一些耗时的任务?我使用time.sleep(5)来减少每分钟向mongodb发出的请求量。因为所有消息都存储在我的mongodb数据库中。所以我只是想在这个小项目上工作的时候暂时离开它。由于我没有找到/搜索将事件连接到数据库以检查更新的方法。1)因此您没有任何耗费大量时间的任务,但您希望每5秒读取一次数据,对吗?是的,非常感谢!这很有效,但在向MessageBoxContainer添加Qlabel时似乎会导致延迟,是否有加快速度或完全消除延迟的方法?@ambrosedongkara-mmm我不明白你的意思。你指出你想要5秒的延迟,所以我想你不会谈论这个延迟,所以我想知道,你是只使用简化的代码加上我的修改,还是在你的项目中实现了它?如果这是第二次,我将无法帮助您,因为可能是您未显示的部分产生了问题。哦,对不起,我的糟糕,我还有一段时间。当我更改更新功能中的某些内容时,在更新功能中仍有睡眠。除了我想要的5秒更新外,它工作得非常出色,没有任何延迟。非常感谢你,我真的很感激D