Python 为什么';我的QLabel小部件是否显示在此线程中?

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

因此,我正在使用PyQt5作为UI开发一个消息传递应用程序。但是我有一个问题,我的小部件由于某种原因没有出现。我不知道为什么,尽管我似乎在编写另一个python脚本之前就解决了这个问题。但当我将这个列表应用到它中时,它似乎不起作用

出现问题的代码部分:

 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