Grundverstaendnisfrage: Eventhandling ohne Event!?

Plattformunabhängige GUIs mit wxWidgets.
Antworten
shakebox
User
Beiträge: 175
Registriert: Montag 31. März 2008, 17:01

Tach, ich schon wieder :)

Nachdem ich Euch ja gestern mit meinem Watchfolder-Skript genervt habe (http://www.python-forum.de/topic-14214.html) bin ich heute nen Schritt weiter :) Ich moechte parallel zu der Entwicklung des Skripts auch versuchen, diesem eine kleine Oberflaeche zu verpassen. Also moechte ich nebenher auch wxpython mit lernen.

Nach dem Durchlesen einiger Tutorials und Anschauen von Tutorialvideos hab ich zumindest einen Teil des Grundkonzeptes leidlich verstanden. Es tauchen fuer mich bei meinem konkreten Fall aber 2 Fragen auf, die ich grad aus den Sachen nicht so richtig rauslesen kann. Denn die Tutorials sind eigentlich erstmal alle so dass ne GUI aufgebaut wird und dann mit "normalen" Eventhandlern wie Mausbewegung, Klick, usw. eine Handlung ausgefuehrt wird. Das kann ich nachvollziehen. Bei mir soll aber ein wenig was anderes passieren. Hier mal ein vereinfachtes Beispiel:

Ich hab erstens folgendes Miniskript:

Code: Alles auswählen

import os.path

checkfile = 'V:/.busy.iridas'
    while True:
    if os.path.exists(checkfile):
        statustext = 'Pausing work, FC is playing'
        bgcolor = 'Red'
    else:
        statustext = 'Working'
        bgcolor = 'Green'
Ich teste also nur, ob ein bestimmtes File erzeugt wird (angelegt wird das durch ein anderes Programm dynamisch).

Desweiteren hab ich eine Mini-GUI wie diese hier:

Code: Alles auswählen

import wx

class MainWindow(wx.Frame):
    def __init__(self, parent = None, id = -1, title = 'GUI_Test'):
        wx.Frame.__init__(
            self, parent, id, title, size = (400, 100),
            style = wx.DEFAULT_FRAME_STYLE | wx.NO_FULL_REPAINT_ON_RESIZE
        )
        panel = wx.Panel(self, -1)
        # FC_status
        statustext = 'Pausing work, FC is playing'
        bgcolor = 'Red'
        self.text = wx.StaticText(panel, -1, statustext, (20,20), (360,20), wx.ALIGN_CENTER).SetBackgroundColour(bgcolor)
        self.Show(True)
            
app = wx.PySimpleApp()
frame = MainWindow()
app.MainLoop()
Was jetzt passieren soll ist, dass sich die Variable 'statustext' und die hinterlegte Farbe aendern, je nachdem ob das File auf der Platte existiert oder nicht.

Ich kapier jetzt nur 2 Grundprinzipe nicht:
1. wo muss denn der Skriptteil innerhalb des GUI-Codes platziert werden? Ist dann ganz unten nach dem MainLoop oder passiert das alles innerhalb der MainWindow-Klasse?
2. Ich kann ja ganz einfach die Variable 'statustext' aendern in Abhaengigkeit von der for-Abfrage. Aber da passiert ja dann kein Event sondern das ist etwas was im Hintergrund ohne Useraction passiert. Wie funktioniert das jetzt dass das trotzdem einen Refresh der GUI ausloest. Muss ich da selbst einen Event "erzwingen" in irgendeiner Form oder wie geht das?

Danke und sorry fuer diese vielleicht arge Basic-Frage. Das Buch "wxpython in Action" ist bestellt und ich werd das dann auch systematisch durcharbeiten. Nur mach ich das alles momentan hier im Job und da kann ich nicht erst alles komplett systematisch lernen und dann erst anfangen, was Produktives zu entwickeln. Mir stellen sich halt jeden Tag kleine Aufgaben, fuer die ich so Stueck fuer Stueck auch Mini-Loesungen haben moechte, die ich dann im Laufe der Zeit verbessern und optimieren kann, wenn ich parallel die Grundlagen besser und besser verstehe.
shakebox
User
Beiträge: 175
Registriert: Montag 31. März 2008, 17:01

ok, ich glaub ich hab selbst einen ersten Schritt gefunden. Das mit der while-Schleife klappt ja gar nicht "normal", sondern muss in einen eigenen Thread. Das schau ich mir mal naeher an und meld mich dann gegebenenfalls nochmal.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Richte Dir doch einen Timer ein, der z.B. jede Sekunde eine Routine aufruft, die das Vorhandensein des Files überprüft und die entsprechenden Änderungen vornimmt. Sieh Dir hierzu mal die wxPython-Demo für wx.Timer an.
MfG
HWK
Antworten