如何让 addItem() 添加的文本立即出现在 QDialog window 上?
How do I make text added by addItem() appear on QDialog window immediately?
最近我写了这个程序,其中有一个带有按钮的 QMainWindow 和一个在按下按钮时打开的 QDialog。
我还有一个 [text](它写在 infoWindow class 上方),我希望它逐字出现在 QDialog 上,但现在它在我的程序完成工作时一起出现。
我搜索了很多但找不到我正在搜索的内容 for.So 如果你能告诉我一些让我的 [文本] 逐字显示的方法那就太棒了:)))
这是我的代码
import time , sys
from PyQt5 import QtWidgets
from PyQt5 import uic
from PyQt5.QtWidgets import QTextBrowser
text = ["Lorem ", "Ipsum", " is ", "simply", " dummy", " text", " of the printing", " and", " typesetting", " industry"]
class infoWindow(QtWidgets.QDialog):
def __init__(self):
super(infoWindow, self).__init__()
uic.loadUi(r"window_design\info_window.ui", self)
self.setFixedSize(850, 500)
def textAdd(self):
self.show()
for word in text:
self.infoList.addItem(word)
time.sleep(0.2)
class main(QtWidgets.QMainWindow):
def __init__(self):
super(main, self).__init__()
uic.loadUi(r"window_design\main.ui", self)
self.info_window = infoWindow()
self.setFixedSize(850, 500)
self.pushButton.clicked.connect(self.info_window.textAdd)
if __name__ == '__main__':
my_app = QtWidgets.QApplication(sys.argv)
window = main()
window.show()
sys.exit(my_app.exec())
GUI 系统是 事件驱动的 ,这意味着控制 必须 始终 return 应用程序主线程尽快以允许适当的 UI 更新和用户交互。使用阻塞函数,如 for 循环和 sleep
,将阻止所有这些,因此结果是界面仅在函数 returns 时更新:不仅你必须等到所有睡眠都已过期,但您也只会看到 最终 结果(所有项目同时显示)。
解决方案是使用 QTimer,它确保控制被正确地 returned 到应用程序,并且在需要时执行功能而不会阻塞任何东西。
在这种情况下,您可以复制 列表并定期从中弹出元素,直到列表为空:
class infoWindow(QtWidgets.QDialog):
def __init__(self):
super(infoWindow, self).__init__()
uic.loadUi(r"window_design\info_window.ui", self)
self.setFixedSize(850, 500)
self.wordList = text[:]
def textAdd(self):
self.show()
self.nextWord()
def nextWord(self):
if not self.wordList:
return
self.infoList.addItem(self.wordList.pop(0))
QtCore.QTimer.singleShot(200, self.nextWord)
最近我写了这个程序,其中有一个带有按钮的 QMainWindow 和一个在按下按钮时打开的 QDialog。 我还有一个 [text](它写在 infoWindow class 上方),我希望它逐字出现在 QDialog 上,但现在它在我的程序完成工作时一起出现。 我搜索了很多但找不到我正在搜索的内容 for.So 如果你能告诉我一些让我的 [文本] 逐字显示的方法那就太棒了:)))
这是我的代码
import time , sys
from PyQt5 import QtWidgets
from PyQt5 import uic
from PyQt5.QtWidgets import QTextBrowser
text = ["Lorem ", "Ipsum", " is ", "simply", " dummy", " text", " of the printing", " and", " typesetting", " industry"]
class infoWindow(QtWidgets.QDialog):
def __init__(self):
super(infoWindow, self).__init__()
uic.loadUi(r"window_design\info_window.ui", self)
self.setFixedSize(850, 500)
def textAdd(self):
self.show()
for word in text:
self.infoList.addItem(word)
time.sleep(0.2)
class main(QtWidgets.QMainWindow):
def __init__(self):
super(main, self).__init__()
uic.loadUi(r"window_design\main.ui", self)
self.info_window = infoWindow()
self.setFixedSize(850, 500)
self.pushButton.clicked.connect(self.info_window.textAdd)
if __name__ == '__main__':
my_app = QtWidgets.QApplication(sys.argv)
window = main()
window.show()
sys.exit(my_app.exec())
GUI 系统是 事件驱动的 ,这意味着控制 必须 始终 return 应用程序主线程尽快以允许适当的 UI 更新和用户交互。使用阻塞函数,如 for 循环和 sleep
,将阻止所有这些,因此结果是界面仅在函数 returns 时更新:不仅你必须等到所有睡眠都已过期,但您也只会看到 最终 结果(所有项目同时显示)。
解决方案是使用 QTimer,它确保控制被正确地 returned 到应用程序,并且在需要时执行功能而不会阻塞任何东西。
在这种情况下,您可以复制 列表并定期从中弹出元素,直到列表为空:
class infoWindow(QtWidgets.QDialog):
def __init__(self):
super(infoWindow, self).__init__()
uic.loadUi(r"window_design\info_window.ui", self)
self.setFixedSize(850, 500)
self.wordList = text[:]
def textAdd(self):
self.show()
self.nextWord()
def nextWord(self):
if not self.wordList:
return
self.infoList.addItem(self.wordList.pop(0))
QtCore.QTimer.singleShot(200, self.nextWord)