У меня возникла проблема, когда я хочу запустить несколько функций командной строки из программы python с использованием графического интерфейса. Я не знаю, относится ли моя проблема к PyQt4 или она связана с моим неправильным использованием кода Python.
Я хочу, чтобы метка в моем графическом интерфейсе изменила свое текстовое значение, чтобы сообщить пользователю, какая команда выполняется. Моя проблема, однако, возникает, когда я запускаю несколько команд, используя цикл for. Я хотел бы, чтобы метка обновлялась при каждом цикле, однако программа не обновляет метку графического интерфейса при каждом цикле, вместо этого она обновляет себя только один раз полностью для цикл завершается и отображает только последнюю выполненную команду.
Я использую PyQt4 для своей среды с графическим интерфейсом. И я установил, что текстовая переменная для метки действительно обновляется с каждым циклом, но на самом деле она не отображается визуально в графическом интерфейсе.
Есть ли способ заставить метку обновляться? Я пробовал методы update() и repaint() внутри цикла, но они не имеют никакого значения.
Буду очень признателен за любую помощь. Спасибо.
Ронни.
Вот код, который я использую:
# -*- 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_())