Seite 1 von 1

2 Prozesse starten

Verfasst: Freitag 6. April 2007, 10:34
von StarFighter
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

Verfasst: Freitag 6. April 2007, 15:10
von gerold
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