2 Prozesse starten

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
StarFighter
User
Beiträge: 4
Registriert: Donnerstag 5. April 2007, 21:52

Freitag 6. April 2007, 10:34

Hallo,
ich steh mal wieder auf dem Schlauch. Es geht daraum, dass ich während
eines Connect-Versuchs auf eine Datenbank eine wx.Gauge ProgressBar
durchlaufen lassen will. Leider funktioniert das ganze nur nicht so wie ich
will, denn entweder er startet erst die ProgressBar (hängt dann dort 1
Min rum) und dann erst das Connecten (und hängt da dann noch mal 1
Min) oder eben anderherum (erst Connecten, dann ProgressBar). Aber
irgendwie muss es doch möglich sein beides gleichzeitig auszuführen,
dachte da an 2 Prozesse oder ähnliches. Ich hoffe ihr könnt mir helfen.
Hier mal der Code:

Code: Alles auswählen

class ProBar(wx.Frame):
    def __init__(self, parent = None, id = -1, tile = "ProgressBar"):
        wx.Frame.__init__(
            self, parent, id, tile, size = (250, 150),
            style = wx.DEFAULT_FRAME_STYLE | wx.NO_FULL_REPAINT_ON_RESIZE
        )
        # Panel
        panel = wx.Panel(self)
        # Bar
        self.Bar = wx.Gauge(panel, -1, 100,wx.Point(50, 50),wx.Size(100, 25), style = wx.GA_SMOOTH)
        # Show
        self.Center()
        self.Show(True)
        
    def Time(self, event):
        for i in range(101):
            self.Bar.SetValue(i)
            time.sleep(0.6)
Aufruf in einer anderen Class:

Code: Alles auswählen

        self.control.AppendText('Connecting to Database "kal_db"...\n')
        progressbar = ProBar()
        progressbar.Time(event)
        con = pymssql.connect(host = host, user = user, password = pw, database = 'kal_db')
        cur = con.cursor()
Greetz Star
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Freitag 6. April 2007, 15:10

Hallo StarFighter!

Hier ist eine von vielen Möglichkeiten. Wahrscheinlich gibt es eine bessere Herangehensweise, aber die ist mir im Moment nicht eingefallen.

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-

import wx
import threading
import time

wx.SetDefaultPyEncoding("iso-8859-1")


class PulseProgressDialog(wx.ProgressDialog, threading.Thread):
    
    def __init__(
        self, title = "Meine pulsierende Progressbar", 
        message = "Bitte warten...", parent = None, style = wx.PD_APP_MODAL
    ):
        
        wx.ProgressDialog.__init__(
            self, title = title, message = message, parent = parent, style = style
        )
        threading.Thread.__init__(self)
        
        self.stop_event = threading.Event()
    
    
    def run(self):
        """
        In dieser Threadprozedur läuft der zusätzliche Thread.
        Alles was von hier aus die GUI ändert, muss über wx.CallAfter laufen.
        """
        
        self.Show()
        
        # Läuft bis das Stop-Event gesetzt wurde
        while not self.stop_event.isSet():
            wx.CallAfter(self.UpdatePulse)
            time.sleep(0.3)
        
        self.Destroy()
    
    
    def stop(self):
        """
        Setzt das Stop-Event
        """
        
        self.stop_event.set()


class MyFrame(wx.Frame):
    
    def __init__(
        self, parent = None, id = -1, title = "Example", size = wx.Size(350, 220)
    ):
        
        wx.Frame.__init__(self, parent, id, title, size = size)
        
        panel = wx.Panel(self)
        
        vbox_main = wx.BoxSizer(wx.VERTICAL)
        panel.SetSizer(vbox_main)
        
        lab_message = wx.StaticText(panel)
        vbox_main.Add(lab_message, 1, wx.EXPAND | wx.ALL, 10)
        self.lab_message = lab_message
        
        btn_start = wx.Button(panel, -1, "Start")
        vbox_main.Add(btn_start, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALL, 10)
        btn_start.Bind(wx.EVT_BUTTON, self.start_counter)
    
    
    def start_counter(self, event = None):
        
        progressdiag = PulseProgressDialog(parent = self)
        progressdiag.start()
        
        # Hier wird gearbeitet.
        # Da allerdings nicht in einem eigenen Thread gearbeitet wird, blockiert
        # diese Prozedur unter Windows, während man den Progressdialog mit der
        # Maus verschiebt.
        for i in range(30):
            print str(i)
            
            self.lab_message.SetLabel("Neuer Wert: %i" % i)
            self.lab_message.Refresh()
            wx.YieldIfNeeded()
            
            time.sleep(0.2)
        
        progressdiag.stop()


def main():
    """Testing"""
    
    app = wx.PySimpleApp()
    f = MyFrame()
    f.Center()
    f.Show()
    app.MainLoop()


if __name__ == "__main__":
    main()
mfg
Gerold
:-)

Stichworte: Progressbar Progressdialog warten Thread unendlich
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Antworten