PyQt 4 UI зависает - PullRequest
       40

PyQt 4 UI зависает

3 голосов
/ 20 декабря 2009

Следующая программа должна просто считать и int и отображать ее значение в метке. Но через некоторое время графический интерфейс перестает работать, а цикл непрерывный.

from PyQt4 import QtGui,QtCore
import sys

class main_window(QtGui.QWidget):
    def __init__(self,parent=None):
        #Layout       
        QtGui.QWidget.__init__(self,parent)
        self.bt=QtGui.QPushButton('crash')
        self.lbl=QtGui.QLabel('count')
        ver=QtGui.QHBoxLayout(self)
        ver.addWidget(self.bt)
        ver.addWidget(self.lbl)
        self.cnt=0
        self.running=False
        self.connect(self.bt,QtCore.SIGNAL("clicked()"),self.count)

    def count(self):
        self.running=True
        while self.running:
            self.cnt+=1
            print self.cnt
            self.lbl.setText(str(self.cnt))
            self.repaint()

if __name__ == '__main__':

    app = QtGui.QApplication(sys.argv)
    mw=main_window()
    mw.show()
    sys.exit(app.exec_())   

Любая помощь?

Ответы [ 3 ]

6 голосов
/ 21 декабря 2009

Вы не позволяете циклу обработки событий Qt, поэтому графический интерфейс не отвечает. Кроме того, repaint() не требуется, QLabel.setText() перекрасит метку. Все, что он делает, это ставит в очередь дополнительное событие рисования, но это никогда не обрабатывается.

Вам нужно заменить self.repaint() на QtGui.QApplication.processEvents(). Это даст приложению возможность обрабатывать любые ожидающие события (включая перерисовку, а также взаимодействие с пользовательским интерфейсом), пока вы в цикле.

4 голосов
/ 20 декабря 2009
def count(self):
    self.running=True
    while self.running:
        self.cnt+=1
        print self.cnt
        self.lbl.setText(str(self.cnt))
        self.repaint()

Думали ли вы о каком-нибудь выходе из этого бесконечного цикла? Например. self.running=False.
GUI может перестать работать, потому что у него недостаточно времени для выполнения repaint. Возможно, вы захотите добавить time.sleep в цикл, чтобы дождаться перерисовки графического интерфейса.

Upd.: Вы должны использовать QTimer , а не простой цикл while, для реализуемого поведения.

2 голосов
/ 20 декабря 2009

Вы должны разрешить запуск цикла основного события, чего вы не делаете.

...