wxPython -- Videos für Anfänger

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

Hi!

Hier findest du ein paar einführende Videos (von Kyran Dale) zu wxPython.

Allerdings möchte ich auf diesem Weg auch darauf aufmerksam machen, dass der Beispielcode in diesen Videos teilweise schöner sein könnte. (Z.B. wird die ID des Frames nicht an wx.Frame.__init__ weitergegeben und man braucht keine extra vorbereiteten IDs zum Definieren von Menüs.)

http://showmedo.com/videos/series?name= ... nersSeries

Trotzdem halte ich die Videos für eine gute Einführung in wxPython und wünsche viel Vergnügen beim Ansehen. :-)
Zuletzt geändert von gerold am Freitag 15. September 2006, 18:43, insgesamt 2-mal geändert.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Quellcode aus dem dem Video "A First wxPython Application"


Original:

Code: Alles auswählen

import wx

class MainWindow(wx.Frame):
    def __init__(self,parent,id,title):
        wx.Frame.__init__(self,parent,wx.ID_ANY,title,size = (400,200), style = wx.DEFAULT_FRAME_STYLE | wx.NO_FULL_REPAINT_ON_RESIZE )
        self.control = wx.TextCtrl(self,1,style = wx.TE_MULTILINE)
        self.Show(True)

app = wx.PySimpleApp()
frame = MainWindow(None,-1,"Small Editor")
app.MainLoop()
Verbessert:

Code: Alles auswählen

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

import wx

class MainWindow(wx.Frame):
    def __init__(self, parent = None, id = -1, title = "Small Editor"):
        wx.Frame.__init__(
            self, parent, id, title, size = (400, 200),
            style = wx.DEFAULT_FRAME_STYLE | wx.NO_FULL_REPAINT_ON_RESIZE
        )
        self.control = wx.TextCtrl(self, -1, style = wx.TE_MULTILINE)
        self.Show(True)

app = wx.PySimpleApp()
frame = MainWindow()
app.MainLoop()
Wie man sieht, habe ich ein paar Änderungen vorgenommen:
1. Shebang (Magic Line) hinzugefügt
2. Coding hinzugefügt
3. Kürzere Zeilen
4. Standardwerte für die Methode __init__ angegeben
5. Die Variable "id" an wx.Frame.__init__ weitergereicht (statt wx.ID_ANY)

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Quellcode aus dem Video "Adding a Menubar to Our Sample Editor"

Original:

Code: Alles auswählen

import wx
ID_ABOUT = 101
ID_EXIT = 110

class MainWindow(wx.Frame):
    def __init__(self,parent,id,title):
        wx.Frame.__init__(self,parent,wx.ID_ANY,title,size = (400,200),
                          style = wx.DEFAULT_FRAME_STYLE | wx.NO_FULL_REPAINT_ON_RESIZE )
        self.control = wx.TextCtrl(self,1,style = wx.TE_MULTILINE)
        #--- START NEW CODE: ---------------------------------------------------
        self.CreateStatusBar()
        #------ Setting up the menu.
        filemenu = wx.Menu()
        filemenu.Append(ID_ABOUT, "&About", "Information about this program")
        filemenu.AppendSeparator()
        filemenu.Append(ID_EXIT, "E&xit", "Terminate the program")
        #------ Creating the menu.
        menubar = wx.MenuBar()
        menubar.Append(filemenu,"&File")
        self.SetMenuBar(menubar)
        #--- END NEW CODE ------------------------------------------------------
        self.Show(True)


app = wx.PySimpleApp()
frame = MainWindow(None,-1,"Small Editor")
app.MainLoop()
Vereinfacht:

Code: Alles auswählen

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

import wx

class MainWindow(wx.Frame):
    def __init__(self, parent = None, id = -1, title = "Small Editor"):
        wx.Frame.__init__(
            self, parent, id ,title, size = (400,200),
            style = wx.DEFAULT_FRAME_STYLE | wx.NO_FULL_REPAINT_ON_RESIZE
        )
        self.control = wx.TextCtrl(self, -1, style = wx.TE_MULTILINE)
        #--- START NEW CODE: ---------------------------------------------------
        self.CreateStatusBar()
        #------ Setting up the menu.
        filemenu = wx.Menu()
        filemenu.Append(-1, "&About", "Information about this program")
        filemenu.AppendSeparator()
        filemenu.Append(-1, "E&xit", "Terminate the program")
        #------ Creating the menu.
        menubar = wx.MenuBar()
        menubar.Append(filemenu, "&File")
        self.SetMenuBar(menubar)
        #--- END NEW CODE ------------------------------------------------------
        self.Show(True)

app = wx.PySimpleApp()
frame = MainWindow()
app.MainLoop()
Wichtigste Änderung: Es sind keine speziellen IDs für die Menüeinträge nötig. Die Zahl -1 bestimmt, dass die ID automatisch generiert werden soll.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Quellcode aus dem Video "An Introduction to Event-handling"

Original:

Code: Alles auswählen

import wx
ID_ABOUT = 101
ID_EXIT = 110

class MainWindow(wx.Frame):
    def __init__(self,parent,id,title):
        wx.Frame.__init__(self,parent,wx.ID_ANY,title,size = (400,200),
                          style = wx.DEFAULT_FRAME_STYLE | wx.NO_FULL_REPAINT_ON_RESIZE )
        self.control = wx.TextCtrl(self,1,style = wx.TE_MULTILINE)
        self.CreateStatusBar()
        #------ Setting up the menu.
        filemenu = wx.Menu()
        filemenu.Append(ID_ABOUT, "&About", "Information about this program")
        filemenu.AppendSeparator()
        filemenu.Append(ID_EXIT, "E&xit", "Terminate the program")
        #------ Creating the menu.
        menubar = wx.MenuBar()
        menubar.Append(filemenu,"&File")
        self.SetMenuBar(menubar)
        #--- START NEW CODE: ------------------------------------------------------
        #------ Setting menu event handlers
        wx.EVT_MENU(self, ID_ABOUT, self.OnAbout )
        wx.EVT_MENU(self, ID_EXIT, self.OnExit )
        #--- END NEW CODE
        self.Show(True)

    #--- START EVENT HANDLERS ------------------------------------------------------
    def OnAbout(self,event):
        d = wx.MessageDialog( self, " A sample editor \n in wxPython "
                              ,"About Sample Editor", wx.OK)
                              # Create a message dialog box
        d.ShowModal() # Shows it
        d.Destroy() # finally destroy it when finished.
    def OnExit(self,event):
        self.Close(True)  # Close the frame.
    #--- END EVENT HANDLERS ------------------------------------------------------

app = wx.PySimpleApp()
frame = MainWindow(None,-1,"Small Editor")
app.MainLoop()
Verändert:

Code: Alles auswählen

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

import wx

class MainWindow(wx.Frame):

    def __init__(self, parent = None, id = -1, title = "Small Editor"):
        # Init
        wx.Frame.__init__(
            self, parent, id, title, size = (400,200),
            style = wx.DEFAULT_FRAME_STYLE | wx.NO_FULL_REPAINT_ON_RESIZE
        )

        # TextCtrl
        self.control = wx.TextCtrl(self, -1, style = wx.TE_MULTILINE)

        # StatusBar
        self.CreateStatusBar()

        # Filemenu
        filemenu = wx.Menu()

        # Filemenu - About
        menuitem = filemenu.Append(-1, "&About", "Information about this program")
        self.Bind(wx.EVT_MENU, self.OnAbout, menuitem) # Hier wird der Event-Handler angegeben

        # Filemenu - Separator
        filemenu.AppendSeparator()

        # Filemenu - Exit
        menuitem = filemenu.Append(-1, "E&xit", "Terminate the program")
        self.Bind(wx.EVT_MENU, self.OnExit, menuitem) # Hier wird der Event-Handler angegeben

        # Menubar
        menubar = wx.MenuBar()
        menubar.Append(filemenu,"&File")
        self.SetMenuBar(menubar)

        # Show
        self.Show(True)


    def OnAbout(self,event):
        message = "A sample editor\n in wxPython"
        caption = "About Sample Editor"
        wx.MessageBox(message, caption, wx.OK)


    def OnExit(self,event):
        self.Close(True)  # Close the frame.


app = wx.PySimpleApp()
frame = MainWindow()
app.MainLoop()

# Zerstören der Objekte, damit dieses Beispiel
# im IDLE nicht nur einmal funktioniert.
del frame
del app
Ich habe das veränderte Beispiel mit mehreren Kommentaren versehen, damit man besser erkennt, was wo passiert.

Die wichtigsten Änderungen zum Original:
1. Man kann Event-Handler mit der Methode **Bind()** an ein Objekt und ein dazugehöriges Event binden. Das hat den großen Vorteil, dass man sich nicht mehr mit irgendwelchen Event-IDs herumschlagen muss. Im Beispiel sind es ja nur zwei IDs, aber in einem ausgewachsenen Programm ist es ein Vielfaches. Die Events werden sofort nach dem Erstellen der Menüeinträge an die entsprechenden Event-Handler gebunden.
2. Statt wx.MessageDialog() verwendete ich wx.MessageBox(). Das erspart das umständlichere Handling des Dialogs. Allerdings ist man damit aber auch nicht mehr so flexibel. Aber darauf kann man meistens verzichten.

lg
Gerold
:-)
Zuletzt geändert von gerold am Sonntag 4. Januar 2009, 22:21, insgesamt 1-mal geändert.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
rolgal_reloaded
User
Beiträge: 312
Registriert: Dienstag 24. Oktober 2006, 19:31

Hallo Gerold,

klasse wie du das gemacht hast. :D

Ich beginne mich gerade für wxPython zu interessieren, habe ebenfalls die Videos gesehen.....
Bisher habe ich nur mit Tkinter gearbeitet, eine andere Welt.
Wofür braucht es die id überhaupt? Und wenn sie automatisch generiert wird, kann man, und ist es überhaupt sinnvoll, darauf zugreifen ?

parent = None heisst wohl einfach, dass es an keinen anderen Frame gebunden bzw. eingegliedert wird, oder?

wx.PySimpleApp() ist mir auch noch etwas strange. Was gäbe es da sonst für Möglichkeiten?

Liebe Grüße

rolgal_reloaded
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Code: Alles auswählen

parent = None heisst wohl einfach, dass es an keinen anderen Frame gebunden bzw. eingegliedert wird, oder?
Jepp, so habe ich es auch damals verstanden. 'MainWindow' ist praktisch das Hauptfenster und braucht kein Parent.

Code: Alles auswählen

wx.PySimpleApp() ist mir auch noch etwas strange. Was gäbe es da sonst für Möglichkeiten?
'wx.PySimpleApp()' ist sowas wie der "Starter" der Applikation.

Man kann es auch so starten:
http://paste.pocoo.org/show/241/

Das benutze ich in Moment. Aber wie ich in einem post von gerold in nem Thread erfahren habe, ist das 'class App'`mit der Methode 'OnInit' schon längst überholt und braucht man nicht mehr. Auch das 'self.SetTopWindow(self.main)' das ich auskommentiert habe braucht man nicht mehr, weil bei neueren Versionen der erste Frame
(in dem Beispiel MainWindow) zum Top-Window gemacht wird. Hab gerolds variante noch nicht gestestet gehabt aber ich denke das dürfte vom Ergebnis her nicht anders sein wie die alte Variante.
aton
User
Beiträge: 1
Registriert: Sonntag 4. Januar 2009, 17:08

danke für die mühe gerold!
Antworten