Anfängerfragen bezüglich GUI

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Aureliusus
User
Beiträge: 9
Registriert: Mittwoch 5. April 2006, 10:23

Hi, mit der Suche habe ich ne Menge Anfängertipps und Beispiele gefunden. jedoch nichts, was mir die Entscheidung abnimmt, mit welchem Tollkit ich am besten anfangen sollte.

Ich habe bisher nur Pythonscripts geschrieben, die von cron angeschoben werden um dann irgendwelche Aufgaben zu eledigen. Das ist soweit auch ganz gut, jedoch möchte ich nun einen Schritt weiter gehen und bin auf viele neue Dinge gestoßen. Am Ende soll irgendwann mal ein kleines Tool kommen, das z.B. jede halbe Stunde von wetter.com für vorher definierte Orte die Temperatur zieht. Das ist ja kein Problem, mit nem Script und cron hab ich sowas auch schonmal realisiert, jedoch ist das ja doof, wenn man zum nach schauen dauernd ne PHP Seite gehen und die Sachen von Hand aktualisieren muß. Ganz übel wird es, wenn es nicht um Wetterdaten sondern um andere Daten wie Börsenkurse handelt, die sich viel öfters aktualisieren und auch ausgewertet werden wollen. Ok, soweit das, wo ich mal hin will :wink: Ich will ja ganz klein anfangen. Grosse frage am Anfang, wxWidgets oder TK Inter. Ich hab gelesen, dass TKInter kein echtes Tabellen Widgeht hat (so Excel mäßig). Auch so tendiere ich mehr zu wxWidgets. Das eizige das mich bei TK hält, ist die Tatsache, dass es bereits bei Python dabei ist.
Wenn ich nun was mit wxWidgets baue, wie geh ich das adnn am besten an? Beispiel, ich will nen Fenster und darin immer die aktuelle Uhrzeit anzeigen, muss ich dann nen extra Thread für das Anzeigen der Uhrzeit bauen, der sich dann quasi immerwieder selbst aufruft oder wie macht man das am dümmsten?

wär nett, wenn mir da jemand ein paar Tipps für den start mit auf den Weg geben könnte.

danke, Aureliusus :)
Benutzeravatar
Mr_Snede
User
Beiträge: 387
Registriert: Sonntag 8. Februar 2004, 16:02
Wohnort: D-Dorf, Bo

Ja, Tkinter kommt an seine Grenzen wenn du ein TabellenWidget brauchst.
Im Moment benutze ich selbst:
http://www.python-forum.de/viewtopic.php?p=32776#32776
bzw:
http://spuddel.sp.funpic.de/dokuwiki2/d ... ontolister
das ist ein Grid aus Labeln auf einem ScrolledFrame aus dem Paket PMW (ist extra zu installieren)

cu Sebastian
tabellar
User
Beiträge: 186
Registriert: Mittwoch 4. September 2002, 15:28

Wenn es um eine generelle Frage bzgl. GUI geht, würde ich mir an Deiner
Stelle auf jedenfall überlegen, ob nicht auch eine browserbasierte Lösung,
sprich die Erstellung der Oberfläche mit HTML und CSS (XHTML), in Frage
kommt. Es kommt vielleicht die eine oder andere technische Hürde hinzu,
dafür hast Du es aber gerade mit dem dynamischen generieren von z.B.
Tabellen deutlich einfacher und Probleme mit dem Drucken hast Du auch
keine :wink:.

Tabellar
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Aureliusus hat geschrieben:Auch so tendiere ich mehr zu wxWidgets.
Hi Aureliusus!

Ich habe mich eine Weile mit Tkinter gespielt und derzeit programmiere ich GUI-Programme noch mit pyGTK. Aber nur deshalb, weil ich noch nicht dazugekommen bin mich in wxPython einzuarbeiten. Tkinter bietet mir zu wenige Möglichkeiten. Ich bin schon nach wenigen Wochen an die Grenzen gestoßen. pyGTK hat eine schöne API und ist nicht schlecht dokumentiert (auf Englisch). Leider bewegt sich pyGTK ziemlich weit unten auf der Stufe der Bequemlichkeit :-) --

Was ich damit sagen will? Ganz einfach. Es gibt kein eingebautes Tabellen-Widget. Einen einfachen Dialog (z.B. eine Inputbox) musst du dir mühsam aufbauen. Aber genau so etwas braucht man doch ziemlich oft. Aber der wichtigste Punkt der mich demnächst zu wxPython bringen wird ist das Thema "Drucken". wxPython bietet sogar eine Druckvorschau, die mit wenigen Zeilen Code aktiviert werden kann. Es gibt fertige Dialogfenster zur Dateiauswahl, zur Druckerauswahl, usw. Es gibt eine Vielzahl von vorgefertigten Widgets, die unter allen unterstützten Betriebssystemen ziemlich gleich aussehen.

Auch ein wichtiger Punkt, wie mir scheint, wxPython-Programme sind unter Windows viel schneller offen als pyGTK-Programme. Das ist sehr wichtig, wenn man Python für einfache Dialoge braucht, die von einem anderen Programm aus aufgerufen werden. Ich möchte zum Beispiel ein vorhandenes Visual Basic Programm mit Python um einige Funktionen erweitern. Das macht aber keinen Spaß, wenn jedesmal, wenn man im VB-Programm einen Knopf druckt, man ein paar Sekunden warten muss, bis sich das pyGTK-Programm dazu bereit erklärt zu erscheinen. Diese Zeit scheint mir bei wxPython-Programmen kürzer zu sein.

Demnächst kommt ein Buch heraus, leider noch auf Englisch, das in die wxPython-programmierung einführt. Mein Tipp: Kaufe es und arbeite dich in wxPython ein. Noch ein Tipp: Schau dir mal die Beispiele an, die du hier http://wxpython.org/download.php herunterladen kannst. Dann hast du einen Überblick, was man alles so mit wxPython machen kann. Vergleiche die Beispiele mit pyGTK und Tkinter. Dann entscheide.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

gerold hat geschrieben: Demnächst kommt ein Buch heraus ...
Möchte gerne unterstreichen, was Gerold schrieb. Aber ein kleiner Nachtrag sei gestattet: Das Buch ista bereits erschienen, nennt sich "WxPython in Action" und ist bei Manning Publications erschienen - leider nicht ganz billig. Also besser vorher mal die wxPython-Beispiele anschauen.

Gruß,
Christian

PS Meines ist heute angekommen. Bin schon ganz neugierig ...
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

CM hat geschrieben:Das Buch ista bereits erschienen
Hi Christian!

Danke für den Hinweis. Habe es soeben bestellt. Hoffentlich reicht mein Englisch für dieses Buch. :-)

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
Mr_Snede
User
Beiträge: 387
Registriert: Sonntag 8. Februar 2004, 16:02
Wohnort: D-Dorf, Bo

Ich habe mich entschlossen einfach mal alle Gui Toolkits auszuprobieren und mir dann eines auszusuchen.

Im Moment bin ich dabei mir Tkinter anzuschauen.
Tkinter finde ich für kleine Tools genau richtig und charmant hässlich :-)

Auch WxWidgets werde ich mir anschauen, allerdings bin ich von denen nicht besonders überzeugt. Auf meinem debian System ist PyWx schrecklich langsam und meinen Tests zu Folge auch instabil, was aber auch an den Programmen selber liegen kann.

Ich freue mich auf meine Versuche mit pyQT. Widgets sind zu genüge vorhanden, Doku scheint auch brauchbar.
Bis ich bei qt ausprobiert habe, gibt es auch eine kostenlose Windowsversion (mit qt4)
Buell
User
Beiträge: 90
Registriert: Samstag 29. Oktober 2005, 14:17

Hallo,

also ich benutze ausschließlich wxPython und bin (bis jetzt) an noch keine Grenzen gestoßen. Jedem der mit wxPy arbeiten will (und noch nicht viel Erfahrung damit hat) empfehle ich 2 Dinge:

a) unbedingt das Demo-Toolkit auf der offiziellen wx Seite laden

b) für schreibfaule wie mich VisaulWX installieren, damit bekommt man das Grundgerüst in null-komma-nix zusammen
Aureliusus
User
Beiträge: 9
Registriert: Mittwoch 5. April 2006, 10:23

Danke für all eure Antworten :)

Nach all den Empfehlungen werde ich wohl bei den wxDemos anfangen und die eingehend Studieren. Wie es dann mit der Stabilität ausschaut werd ich ja dann sehen.

Wegen dem Uhrzeit Beispiel was ich oben mal angesprochen habe, ist das da das richtige herangehen mit den Threads oder ist das dann mehr wie mit Kanonen auf Spatzen schießen? Ich bin mir noch nicht ganz im Klagen darüber wie das mit den GUI Toolkits funktioniert. Das sind ja keine Scripts die einmal durchlaufen und dann beendet sind. Und wenn ich das aktualisieren der Uhrzeit in der "Hauptschleife" mit time.sleep() aufhalte, dann bremse ich ja auch den Rest von meinem Programm aus.

Najoa, vielleicht wird mir das ja auch gleich in den wx Beispielen erklärt, ich schau mir die jetzt besser erstmal an. :D
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Aureliusus hat geschrieben:Wegen dem Uhrzeit Beispiel was ich oben mal angesprochen habe, ist das da das richtige herangehen mit den Threads oder ist das dann mehr wie mit Kanonen auf Spatzen schießen?
Hi Aureliusus!

Wer sich an grafische Anwendungen herantrauen will, der muss früher oder später mit Threads arbeiten. Aber Threads sind gar nicht so schlimm wie viele annehmen. Folgender einfache Timer ist ja auch schon ein eigenständiger Thread. Man muss nur wissen: Wenn irgendetwas die GUI blockiert, dann muss es in einen anderen Thread ausgelagert werden. Fertig.

Code: Alles auswählen

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

import wx
import time
from threading import Timer


class MainWindow(wx.Frame):

    def set_clock(self):
        try:
            self.lab_clock.SetLabel(time.asctime())
            Timer(1, self.set_clock).start() # Jede Sekunde neu aufrufen
        except:
            pass

    def __init__(self):
        wx.Frame.__init__(
            self, 
            None, 
            wx.ID_ANY, 
            "Hallo Welt", 
            size=(200,100),
            style = wx.DEFAULT_FRAME_STYLE | wx.NO_FULL_REPAINT_ON_RESIZE
        )
        
        self.lab_clock = wx.StaticText(self, -1, "[Uhrzeit]")
        self.set_clock()
        
        self.Show(True)

app = wx.PySimpleApp()
frame = MainWindow()
app.MainLoop()
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Buell
User
Beiträge: 90
Registriert: Samstag 29. Oktober 2005, 14:17

Aureliusus hat geschrieben: Und wenn ich das aktualisieren der Uhrzeit in der "Hauptschleife" mit time.sleep() aufhalte, dann bremse ich ja auch den Rest von meinem Programm aus.
... vollkommen richtig, wirst du an einem Thread nicht vorbei kommen.



@gerold:

schönes Beispiel mit dem Timer, die Methode kannte ich noch gar nicht, hab ich auch direkt mal ne frage zu:

wird durch den Aufruf aus einem Thread heraus die Methode set_clock auch im selbigen ausgeführt oder im Haupt-Thread? Im ersten Fall würde das nämlich unendlich viele Threads öffnen - aber kann ich mir eigentlich nicht vorstellen.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Buell hat geschrieben:wird durch den Aufruf aus einem Thread heraus die Methode set_clock auch im selbigen ausgeführt oder im Haupt-Thread? Im ersten Fall würde das nämlich unendlich viele Threads öffnen - aber kann ich mir eigentlich nicht vorstellen.
Hi Buell!

Das glaube ich nicht, da die Funktion ja nicht aufgehalten wird. Sie beendet sich direkt nach dem Starten des neuen Threads und nicht erst, wenn der gestartete Thread abgearbeitet ist.

Nichtsdestotrotz (schweres Wort) bin ich drauf gekommen, dass mein Beispiel nicht unter Linux mit wxPython 2.6.1 funktioniert. Deshalb habe ich es so umgeschrieben, wie es, wie ich glaube, von den Entwicklern von wxPython vorgesehen wurde.

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import wx
import time


class MainWindow(wx.Frame):

    def on_timer(self, event):
        self.lab_clock.SetLabel(time.asctime())

    def __init__(self):
        wx.Frame.__init__(
            self,
            None,
            wx.ID_ANY,
            "Hallo Welt",
            size=(200,100),
            style = wx.DEFAULT_FRAME_STYLE | wx.NO_FULL_REPAINT_ON_RESIZE
        )

        self.lab_clock = wx.StaticText(self, -1, "[Uhrzeit]")
        
        # Timer erstellen, Event an Funktion binden und Timer starten
        self.timer = wx.Timer(self)
        self.Bind(wx.EVT_TIMER, self.on_timer, self.timer)
        self.timer.Start(1000)
       
        self.Show(True)


app = wx.PySimpleApp()
frame = MainWindow()
app.MainLoop()
lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Aureliusus
User
Beiträge: 9
Registriert: Mittwoch 5. April 2006, 10:23

Ich hab mich noch garnicht für das tolle Beispiel bedankt. :) Vielen Dank für die Mühe, das script hat mir wirklich weiter geholfen :D
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Aureliusus hat geschrieben:Vielen Dank für die Mühe, das script hat mir wirklich weiter geholfen
Das freut mich. :-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Antworten