DatenMetzgerX hat geschrieben:... Und das sollte auch in die GUI, und darum brauche ich das andere....
Und die GZ archive werden einfach extrem gross

Hi DatenMetzgerX!
Ich will dich nicht davon abhalten, RAR zu benutzen...
Hier wieder ein kleines Beispiel. Allerdings mit UNIX-Pfaden. Die Pfade musst du selber an Windows anpassen, da ich gerade KDE kompiliere und nicht zwischendurch mal Windows booten kann.
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-
import wx
import threading
import time
import os
# NewMessageEvent
EVT_NEWMESSAGE_ID = wx.NewId()
class NewMessageEvent(wx.PyEvent):
"""
Simple event
"""
def __init__(self, message):
"""
Init Event.
"""
wx.PyEvent.__init__(self)
self.SetEventType(EVT_NEWMESSAGE_ID)
self.message = message
# StopEvent
EVT_STOP_ID = wx.NewId()
class StopEvent(wx.PyEvent):
"""
Simple event
"""
def __init__(self):
"""
Init Event.
"""
wx.PyEvent.__init__(self)
self.SetEventType(EVT_STOP_ID)
class MyFrame(wx.Frame):
"""
Hauptframe
"""
def __init__(
self, parent = None, title = "Hauptframe"
):
# Frame initialisieren
wx.Frame.__init__(self, parent, -1, title)
# Ein Panel als Grundlage
panel = wx.Panel(self)
# Ein vertikaler Boxsizer zum Anordnen
vb = wx.BoxSizer(wx.VERTICAL)
panel.SetSizer(vb)
# Ein Textfeld für die Ausgabe der Statusmeldungen (read only)
self.messages = wx.TextCtrl(
panel, -1,
style = wx.TE_AUTO_SCROLL | wx.TE_LINEWRAP |
wx.TE_MULTILINE | wx.TE_READONLY
)
font = self.messages.GetFont()
font.SetFamily(wx.FONTFAMILY_SCRIPT)
self.messages.SetFont(font)
vb.Add(self.messages, 1, wx.ALL | wx.EXPAND, 5)
# Buttonleiste
hb = wx.BoxSizer(wx.HORIZONTAL)
vb.Add(hb, 0, wx.EXPAND)
# Start
self.start_btn = wx.Button(panel, -1, "Start")
hb.Add(self.start_btn, 1, wx.ALIGN_CENTER_HORIZONTAL| wx.ALL, 5)
self.start_btn.Bind(wx.EVT_BUTTON, self.start_thread)
self.start_btn.SetDefault()
# Thread-Variablen vorbereiten
self.myworkerthread = None
self.thread_started = False
# NewMessage-Event und Stop-Event binden
self.Connect(-1, -1, EVT_NEWMESSAGE_ID, self.add_message)
self.Connect(-1, -1, EVT_STOP_ID, self.stop_signal_empfangen)
def add_message(self, event = None, message = None):
"""
Fügt an den Text eine neue Zeile mit der neuen Nachricht an.
"""
if event:
message = str(event.message)
if len(self.messages.GetValue()) > 0:
message = "\n" + message
self.messages.AppendText(message)
self.messages.ScrollLines(10)
def start_thread(self, event = None):
"""
Startet den Thread
"""
# Prüfen ob der Thread schon läuft
if self.thread_started:
self.add_message(message = u"Der Thread läuft bereits...")
return
# Log-Feld leeren und Button deaktivieren
self.messages.Clear()
self.start_btn.Enable(False)
# Thread initialisieren
self.myworkerthread = MyWorkerThread(self)
# Thread starten
self.myworkerthread.start()
# Variable setzen und Nachricht ausgeben
self.thread_started = True
self.add_message(message = u"Der Thread wurde soeben gestartet...")
def stop_signal_empfangen(self, event = None):
"""
Zeigt an, dass er fertig ist.
"""
self.thread_started = False
self.add_message(message = "Fertig...")
wx.MessageBox(u"Fertig!", "Fertig", wx.OK | wx.CENTER, self)
self.start_btn.Enable(True)
class MyWorkerThread(threading.Thread):
"""
Diese Klasse soll Arbeit erledigen, aber nichts anzeigen.
"""
def __init__(self, notify_window):
"""
Initialisiert die Klasse und
übernimmt das Objekt, an das später die Events geschickt werden.
"""
threading.Thread.__init__(self)
self._notify_window = notify_window
def run(self):
"""
Thread-Hauptprozedur
"""
out = os.popen("rar a -idp hallo.rar /bin", "r", 0)
for line in out:
# Event an den Frame schicken
wx.PostEvent(
self._notify_window, NewMessageEvent(line.strip())
)
# Event zum Stoppen an Frame schicken
wx.PostEvent(self._notify_window, StopEvent())
def main():
"""
Hauptprozedur
"""
app = wx.PySimpleApp()
frame = MyFrame()
frame.SetSize((600, 500))
frame.Show()
frame.Center()
app.MainLoop()
if __name__ == "__main__":
main()
lg
Gerold
