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()
Verwende ``wx.CallAfter()`` wenn du threadübergreifend auf wx zugreifen willst.
mfg
Gerold