wxPython: wx.ProgressDialog mit Threading, ohne Trennung

Code-Stücke können hier veröffentlicht werden.
Antworten
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hallo!

Code: Alles auswählen

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

# wx.ProgressDialog mit Threading.
# Alles in einem Frame ohne Trennung.

import wx
import time
from thread import start_new_thread

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


class MyFrame(wx.Frame):
    
    def __init__(
        self, parent = None, title = "Example", size = wx.Size(250, 150)
    ):
        wx.Frame.__init__(self, parent, -1, title, size = size)
        
        panel = wx.Panel(self)
        
        vbox_main = wx.BoxSizer(wx.VERTICAL)
        panel.SetSizer(vbox_main)
        
        vbox_main.AddStretchSpacer()
        
        btn_start = wx.Button(panel, label = u"Start")
        vbox_main.Add(btn_start, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALL, 5)
        btn_start.Bind(wx.EVT_BUTTON, self.start_thread)
        
        vbox_main.AddStretchSpacer()
    
    
    def start_thread(self, event = None):
        """
        Startet den neuen Thread
        """
        
        self.progressdialog = wx.ProgressDialog(
            title = u"Demo", message = u"Huiiiiii... Jetzt geht's loooos...", parent = self, 
            style = wx.PD_AUTO_HIDE | wx.PD_APP_MODAL
        )
        self.progressdialog.Show()
        start_new_thread(self.thread_runner, ())
    
    
    def thread_runner(self):
        """
        Hier wird in einem neuen Thread gearbeitet. Deshalb wird alles was die
        GUI beeinflussen könnte über ``wx.CallAfter`` ausgeführt. Wenn man das 
        nicht macht, dann wird dieser Code nicht plattformübergreifend
        funktionieren.
        """
        
        for i in xrange(1, 101):
            wx.CallAfter(self.progressdialog.Update, i)
            time.sleep(0.1)
        
        wx.CallAfter(self.progressdialog.Destroy)


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


if __name__ == "__main__":
    main()
Es gibt nur eine wichtige Aussage in diesem Code:
Verwende ``wx.CallAfter()`` wenn du threadübergreifend auf wx zugreifen willst.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Antworten