为什么我的 QLabel 小部件没有出现在这个线程中?

安布罗斯·奥东卡拉

所以我正在开发一个使用 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.LoadedApp.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 秒收到一次消息和小的“更新”打印语句,但 QLabels 没有出现:

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)

这也是用户界面:https : //cdn.discordapp.com/attachments/624702116845453315/629719792286433301/Developer_hub_main_window.ui

埃利亚内斯克

如果您想执行周期性任务,则没有必要使用带有 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)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么我的角落小部件没有出现在QTabWidget中?

为什么相关的帖子小部件仅出现在页脚部分,而没有出现在侧边栏中?

为什么方块没有出现在这个 socket.io html 文件中?

为什么这个元素没有出现在 iPhone 的所有浏览器中?

为什么这个动画会出现在这个网页中?

为什么线条在我的SVG元素中没有出现在我的圈子中

为什么我的 vtt 字幕没有出现在我的 html5 视频中?

为什么我的json没有出现在我的参数中?

在R中,为什么变量名称以'。'开头 没有出现在我的环境中?

为什么我在这个div中没有滚动?

为什么我的log4j消息没有出现在日志文件中?

为什么我的vue.app没有出现在部署版本中?

为什么我的视图没有出现在angular-ui-router中?

为什么我的文本没有出现在微调器中的图像视图中?

为什么我的用户名没有出现在 TextView 中?

为什么我的JFrame没有出现在单元测试中?

为什么我的Swift struct属性没有出现在框架中?

为什么我的Laravel Eloquent访问器没有出现在响应中?

为什么我的客户端IP地址没有出现在netstat输出中?

为什么我的图片几乎没有突然出现在浏览器中?

为什么我的按钮没有出现在pygame中?

为什么我的图片没有出现在“更换壁纸”窗口的“图片”部分中?

为什么某些 css 属性没有出现在我的母版页中?

为什么我的图像没有出现在模态中?代码点火器

为什么我的 CSS 边框没有出现在 JavaFX gui 中?

为什么图片没有出现在背景中

我现在没有,为什么我在这个 sql 请求中有错误

为什么数据出现在突变上,但没有出现在查询中?

为什么重建的小部件出现在原始小部件之外而不是替换它?