Маркировка в PyQt4 GUI, не обновляющем с каждым циклом ДЛЯ цикла

У меня есть проблема, где я хочу выполнить несколько функций командной строки из программы Python с помощью GUI. Я не знаю, характерна ли моя проблема для PyQt4 или если это имеет отношение к моему плохому использованию кода Python.

То, что я хочу сделать, имеют маркировку на моем изменении GUI его текстовое значение для информирования пользователя, какая команда выполняется. Моя проблема однако, возникает, когда я выполняю несколько команд с помощью для цикла. Я хотел бы, чтобы маркировка обновила себя с каждым циклом, однако, программа не обновляет маркировку GUI с каждым циклом, вместо этого, это только обновляет себя, после того как все для цикла завершается и отображает только последнюю команду, которая выполнялась.

Я использую PyQt4 для своей среды GUI. И я установил, что текстовая переменная для маркировки действительно обновляется с каждым циклом, но, это на самом деле не обнаруживается визуально в GUI.

Существует ли способ для меня вынудить маркировку обновить себя? Я попробовал обновление () и перекрашивание () методы в цикле, но они не имеют никакого значения.

Я был бы очень признателен за любую справку.Спасибо.

Ronny.

Вот код, который я использую:

# -*- coding: utf-8 -*-
import sys, os
from PyQt4 import QtGui, QtCore
Gui = QtGui
Core = QtCore

# ================================================== CREATE WINDOW OBJECT CLASS
class Win(Gui.QWidget):
    def __init__(self, parent = None):
        Gui.QWidget.__init__(self, parent)

        # --------------------------------------------------- SETUP PLAY BUTTON
        self.but1 = Gui.QPushButton("Run Commands",self)
        self.but1.setGeometry(10,10, 200, 100)

        # -------------------------------------------------------- SETUP LABELS
        self.label1 = Gui.QLabel("No Commands running", self)
        self.label1.move(10, 120)

        # ------------------------------------------------------- SETUP ACTIONS
        self.connect(self.but1, Core.SIGNAL("clicked()"), runCommands)


# =======================================================  RUN COMMAND FUNCTION
def runCommands():
    for i in commands:
        win.label1.setText(i)       # Make label display the command being run
        print win.label1.text()     # This shows that the value is actually
                                    # changing with every loop, but its just not
                                    # being reflected in the GUI label
        os.system(i)

# ======================================================================== MAIN

# ------------------------------------------------------  THE TERMINAL COMMANDS
com1 = "espeak 'senntence 1'"
com2 = "espeak 'senntence 2'"
com3 = "espeak 'senntence 3'"
com4 = "espeak 'senntence 4'"
com5 = "espeak 'senntence 5'"
commands = (com1, com2, com3, com4, com5)

# --------------------------------------------------- SETUP THE GUI ENVIRONMENT
app = Gui.QApplication(sys.argv)
win = Win()
win.show()

sys.exit(app.exec_())
8
задан Ronny 20 March 2010 в 09:19
поделиться

2 ответа

Ярлык обновляется нормально, но графический интерфейс отсутствует t перерисовывается до конца вашего цикла.

Вот что вы можете с этим сделать:

  • Переместите ваш длительный цикл во вторичный поток, отрисовка GUI происходит в основном потоке.

  • Вызовите app.processEvents () в своем цикле. Это дает Qt возможность обрабатывать события и перерисовывать графический интерфейс.

  • Разбейте цикл и позвольте ему работать, используя QTimer с таймаутом 0.

Использование потока - лучший вариант, но требует немного больше работы, чем просто вызов processEvents . Делать это с помощью таймера - старомодный способ, который больше не рекомендуется. (см. документацию)

13
ответ дан 5 December 2019 в 11:23
поделиться

Вы не совсем понимаете, как работает такой графический интерфейс. Графический интерфейс Qt должен запускаться в собственном цикле событий. Вместо этого выполняется ваш цикл, и графический интерфейс не может выполнять свою работу между выполнениями вашего цикла. То есть, пока ваш цикл for работает, код графического интерфейса пользователя не получает процессорного времени и не обновляется.

Вы можете установить таймер с событием и выполнять свой код в обработчиках этого события в течение установленного времени - это решит вашу проблему.

2
ответ дан 5 December 2019 в 11:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: