所以我正在开发一个使用 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")
运行我的程序时没有错误。只是 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] 删除。
我来说两句