QDialog schließen nachdem Thread fertig ist.

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
yaem
User
Beiträge: 8
Registriert: Sonntag 19. Juni 2011, 21:52

Ich möcht einfach gesagt einen QDialog haben der bestimmte Vorgänge ausführt und den Fortschritt in einer QProgressBar visualisiert.
Damit der Dialog aber weiter ánsprechbar bleibt(z.B. über 'Abbrechen') kommen die Berechnungen in einen eigenen Thread. Das ganze sieht dann ungefähr so aus:

Code: Alles auswählen

import _thread
import time

from PyQt4 import uic
from PyQt4.QtCore import *
from PyQt4.QtGui import *


(Ui_TestExec, QDialog) = uic.loadUiType('testexec.ui')

class TestExec(QDialog):

  def __init__ (self, parent):
    QDialog.__init__(self, parent)
    self.ui = Ui_TestExec()
    self.ui.setupUi(self)
    
  
  def exec(self):
    QDialog.open(self)
    
    _thread.start_new_thread(self.copy, (None,))    
    
    
  def copy(self, args):   
    for v in range(0, 101):
      time.sleep(0.01)
      self.ui.bar.setValue(v)
      
    self.close()
Der Dialog schließt sich auch bei Erfolg, allerdings mit einer Fehlermeldung:
QObject::killTimer: timers cannot be stopped from another thread
Wie realisiere ich das am besten richtig?
BlackJack

@yaem: Als allererstes solltest Du die Finger vom `_thread`-Modul lassen. Per Konvention sind führende Unterstriche ein Zeichen für interne Objekte, die nicht von aussen benutzt werden sollen. Für Threads in ”normalem” Python ist das `threading`-Modul als Schnittstelle vorgesehen.

Da Du aber ein Qt-Programm schreibst, solltest Du einen Blick in die dortigen Klassen werfen. QThread emittiert zum Beispiel ein Signal wenn der Thread fertig ist.
yaem
User
Beiträge: 8
Registriert: Sonntag 19. Juni 2011, 21:52

Hey, danke! Funktioniert wunderbar! :)
Antworten