PyQt 4 congela UI

votos
3

A seguir programm deve apenas contar-se e int e exibe seu valor em uma etiqueta. Mas depois de um tempo o GUI pára de funcionar, enquanto o contínuo loop.

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_())   

Qualquer ajuda?

Publicado 20/12/2009 em 21:15
fonte usuário
Em outras línguas...                            


3 respostas

votos
4

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

Você já pensou sobre qualquer saída deste loop infinito? Por exemplo self.running=False.
GUI pode parar de funcionar porque não tem tempo suficiente para executar repaint. Você pode querer adicionar um pouco time.sleepno circuito de esperar para a GUI para repintar.

UPD .: Você deve usar QTimer , não um simples loop while, para o comportamento que você está implementando.

Respondeu 20/12/2009 em 21:21
fonte usuário

votos
2

Você tem que deixar o ciclo de eventos principal executar, algo que você não está fazendo.

Respondeu 20/12/2009 em 21:25
fonte usuário

votos
6

Você não está deixando evento loop de execução do Qt, assim que a GUI não está respondendo. Além disso, repaint()não é necessário, o QLabel.setText()vai pintar o rótulo. Tudo que faz é enfileirar um evento de pintura extra, mas isso nunca é processado.

O que você precisa fazer é substituir self.repaint()com QtGui.QApplication.processEvents(). Isto vai dar o aplicativo a oportunidade de processar quaisquer eventos pendentes (incluindo que repintar, bem como a interação UI), enquanto você está no circuito.

Respondeu 21/12/2009 em 01:49
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more