Как обновить контент QWidget? - PullRequest
0 голосов
/ 12 ноября 2018

В главном виджете есть QWidget, который вызывается кнопкой «Пуск».

Показывает некоторый текст, который должен обновляться каждую минуту во время работы QWidget.

Как я могу сделать это обновление бесконечности в этом коде?

class ExampleWidget(QWidget):
    def __init__(self, parent=None):
        super().__init__()
        self.setWindowTitle('Example Widget ScrollArea')
        self.initUi()

    def initUi(self):
        area = QScrollArea(self)
        area.setWidgetResizable(True)
        self.scrollAreaWidgetContents = QLabel(some_text, self) 

        area.setWidget(self.scrollAreaWidgetContents)
        button = QPushButton("Close")
        button.clicked.connect(self.goMainWindow) 

        layoutV = QVBoxLayout() 
        layoutV.addWidget(area)
        layoutV.addWidget(button)
        self.setLayout(layoutV)

    def goMainWindow(self):
        self.hide()

    def sizeHint(self):                                  
        return QSize(400, 200)

class MainWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        start_main_button  = QPushButton('Start', self)
        start_main_button.move(40, 40)
        start_main_button.clicked.connect(self.start)
        self.setGeometry(300, 300, 290, 150)
        self.setWindowTitle('Test')

    def start(self):
        global some_text
        some_text = 'some text'
        self.result_widget = ExampleWidget()
        self.result_widget.show()
if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

Одна из моих попыток:

def start(self):
        global some_text
        some_text = 'some text'
        self.result_widget = ExampleWidget()
        self.result_widget.show()
        i = 0
        while True:
            i+=1
            some_text+=str(i)
            self.result_widget = ExampleWidget()
            self.result_widget.show()

1 Ответ

0 голосов
/ 13 ноября 2018

Забудьте о глобальных переменных, потому что они считаются плохой практикой, с другой стороны, в GUI вы должны избегать циклов, которые занимают много времени, а в вашем случае True блокирует GUI. В Qt, если вы хотите выполнять периодические задачи, вы должны использовать QTimer:

from PyQt5 import QtCore, QtWidgets


class ExampleWidget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super().__init__()
        self.setWindowTitle('Example Widget ScrollArea')
        self.initUi()

    def initUi(self):
        area = QtWidgets.QScrollArea()
        area.setWidgetResizable(True)
        self.scrollAreaWidgetContents = QtWidgets.QLabel("some_text") 

        area.setWidget(self.scrollAreaWidgetContents)
        button = QtWidgets.QPushButton("Close")
        button.clicked.connect(self.hide) 

        layoutV = QtWidgets.QVBoxLayout(self) 
        layoutV.addWidget(area)
        layoutV.addWidget(button)

    def update_text(self, text):
        # update the text 
        self.scrollAreaWidgetContents.setText(text)

    def sizeHint(self):                                  
        return QtCore.QSize(400, 200)

class MainWindow(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        start_main_button  = QtWidgets.QPushButton('Start', self)
        start_main_button.move(40, 40)
        start_main_button.clicked.connect(self.start)

        self.setGeometry(300, 300, 290, 150)
        self.setWindowTitle('Test')
        self.result_widget = ExampleWidget()
        self.timer = QtCore.QTimer(self, interval=60*1000)
        self.timer.timeout.connect(self.on_timeout)
        self.counter = 0
        self.initial_text = "some_text"

    def on_timeout(self):
        # this method will be called every 60 * 1000 ms
        self.initial_text += str(self.counter)
        self.result_widget.update_text(self.initial_text)
        self.counter += 1

    @QtCore.pyqtSlot()
    def start(self):
        self.result_widget.show()
        # start timer
        self.timer.start()

if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())
...