Gliederung, Menu ID's

Plattformunabhängige GUIs mit wxWidgets.
tumbili
User
Beiträge: 27
Registriert: Donnerstag 31. Mai 2007, 14:38

Gliederung, Menu ID's

Beitragvon tumbili » Donnerstag 31. Mai 2007, 14:46

Moin Leute :)

Ich bin gerade dabei mein erstes Python Programm zu schreiben :) Da ich nicht gleich am Anfang alles versauen möchte, wollte ich euch mal Fragen ob die Gliederung so in Ordnung ist. Also Ob man das Programm so leicht erweitern kann, oder was ich vielleicht noch verbessern könnte?

Außerdem stören mich die ID's vom wx.Menu irgenwie. Gibt es eine Möglichkeit ein Menü zu programmieren ohne ID's zu definieren. ID's kommen mir nicht wirklich als "schöne" Lösung vor....

Hier mal der Code:

Code: Alles auswählen

# -*- coding: utf-8 -*-

import wx

#---------------------------------------------------------------------------

class MainWindow(wx.Frame):
   def __init__(self, parent, id, title):
      wx.Frame.__init__(self, parent, id, title)

      # Statusbar
      self.CreateStatusBar()

      # Menubar
      menuBar = wx.MenuBar()
      # Datei
      ID_OPEN    = 101
      ID_SAVE    = 102
      ID_SAVE_AS = 103
      ID_EXIT    = 104
      menu1 = wx.Menu()
      menu1.Append(ID_OPEN, u"Ö&ffnen...", u"Öffnen...")
      menu1.Append(ID_SAVE, "&Speichern", "Speichern")
      menu1.Append(ID_SAVE_AS, "&Speichern unter...", "Speichern unter...")
      menu1.AppendSeparator()
      menu1.Append(ID_EXIT, "&Beenden", "Beendet das Programm")
      menuBar.Append(menu1, "&Datei")
      # Hilfe
      ID_ABOUT = 201
      menu2 = wx.Menu()
      menu2.Append(ID_ABOUT, "&About...", "About...")
      menuBar.Append(menu2, "&Hilfe")
      # Menubar hinzufügen
      self.SetMenuBar(menuBar)
      #Menu Bindings
      self.Bind(wx.EVT_MENU, self.MenuExit, id=ID_EXIT)

      #Splitter erzeugen
      MainSplitter(self)

      # Fenster anzeigen
      self.CenterOnScreen()
      self.Show()

   def MenuExit(self, event):
      self.Close()

#------------------------------------------------------------------------------

class MainSplitter(wx.SplitterWindow):
   def __init__(self, parent):
      wx.SplitterWindow.__init__(self, parent, wx.ID_ANY, style=wx.SP_LIVE_UPDATE | wx.SP_BORDER )

      # Tree erzeugen
      self.tree = wx.TreeCtrl(self, wx.ID_ANY)

      root = self.tree.AddRoot("Root")

      for x in range(3):
         child = self.tree.AppendItem(root, "Item %d" % x)

         for y in range(3):
            last = self.tree.AppendItem(child, "item %d-%d" % (x, y))

            for z in range(3):
               item = self.tree.AppendItem(last,  "item %d-%d-%d" % (x, y, z))


      # Notebook erzeugen
      self.notebook = wx.Notebook(self, wx.ID_ANY)
      self.notebook.AddPage(Page1(self.notebook), "Page 1")

      # Splitten
      self.SetMinimumPaneSize(20)
      self.SplitVertically(self.tree, self.notebook, 250)

class Page1(wx.Panel):
   def __init__(self, parent):
      wx.Panel.__init__(self, parent)

      Text = wx.StaticText(self, wx.ID_ANY, "BLA BLA BLA BLA")
      TextControl = wx.TextCtrl(self, wx.ID_ANY, "BLUBB")

      # BoxSizer
      sizer = wx.BoxSizer(wx.VERTICAL)
      sizer.Add(Text, 0, wx.BORDER | wx.ALL, 10)
      sizer.Add(TextControl, 1, wx.EXPAND | wx.BORDER | wx.LEFT | wx.RIGHT | wx.BOTTOM, 5)
      self.SetSizerAndFit(sizer)

#------------------------------------------------------------------------------

app = wx.PySimpleApp()
MainWindow(None, wx.ID_ANY, 'MainWindow')
app.MainLoop()


Ich bedanke mich schonmal für eure Ratschläge :)
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Re: Gliederung, Menu ID's

Beitragvon gerold » Donnerstag 31. Mai 2007, 15:40

tumbili hat geschrieben:Außerdem stören mich die ID's vom wx.Menu irgenwie. Gibt es eine Möglichkeit ein Menü zu programmieren ohne ID's zu definieren. ID's kommen mir nicht wirklich als "schöne" Lösung vor....

Hallo tumbili!

Willkommen im Python-Forum!

Vielleicht kannst du mit diesen Beispielen etwas anfangen: http://www.python-forum.de/post-63852.html

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
tumbili
User
Beiträge: 27
Registriert: Donnerstag 31. Mai 2007, 14:38

Beitragvon tumbili » Donnerstag 31. Mai 2007, 21:00

okay danke. nur um das zu verstehen: wx.Menu.Append() gibt also einfach die ID zurück?
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Donnerstag 31. Mai 2007, 21:18

tumbili hat geschrieben:okay danke. nur um das zu verstehen: wx.Menu.Append() gibt also einfach die ID zurück?

Hallo tumbili!

Nein. Es wird das neue MenuItem zurück gegeben. Also das Objekt und nicht nur eine ID.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs

Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
tumbili
User
Beiträge: 27
Registriert: Donnerstag 31. Mai 2007, 14:38

Beitragvon tumbili » Donnerstag 31. Mai 2007, 21:29

ok, hatte ich eigentlich auch so erwartet.. Aber dann übergebe ich ja das ganze objekt an self.Bind() und nicht die id... das macht also keinen unterschied?
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Donnerstag 31. Mai 2007, 22:35

tumbili hat geschrieben:das macht also keinen unterschied?

Nein :)
http://halvar.at | Kleiner Bascom AVR Kurs

Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
tumbili
User
Beiträge: 27
Registriert: Donnerstag 31. Mai 2007, 14:38

Beitragvon tumbili » Donnerstag 31. Mai 2007, 22:45

ich hab grad mal in die Deklaration von Bind geguckt. da steht folgendes:

Code: Alles auswählen

def Bind(self, event, handler, source=None, id=wx.ID_ANY, id2=wx.ID_ANY):

Wenn man statt dem Objekt eine ID übergibt wird die doch trotzdem an "source" übergeben? Oder entscheidet er je nach typ an welchen parameter (source oder id) es übergeben wird?
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Freitag 1. Juni 2007, 08:13

tumbili hat geschrieben:

Code: Alles auswählen

def Bind(self, event, handler, source=None, id=wx.ID_ANY, id2=wx.ID_ANY):

Hallo tumbili!

Nein, das läuft so:
Wird an "source" eine Zahl übergeben, dann nimmt wxPython an, dass es eine Event-ID ist.
Wird an "source" ein anderes Objekt übergeben, dann versucht wxPython die Methode "GetId" des übergebenen Objektes aufzurufen um zur Objekt-ID zu kommen.
Über die weiteren Parameter "id" und "id2" kann man weitere Objekt-IDs übergeben, die an den Event-Handler gebunden werden sollen.
Jedes Widget in wxPython erbt die Methode "GetId()". Deshalb kann man so schöner programmieren und muss sich nicht mehr um irgendwelche IDs kümmern.
Es gibt zwar noch Ausnahmen, aber normalerweise brauchst du im ganzen Programm keine Rücksicht mehr auf die IDs nehmen.

Ach noch was. Das hätte ich fast vergessen. Den "source"-Parameter brauchst du hauptsächlich bei Menüs.
Die meisten anderen Objekte besitzen selbst eine Bind-Methode. Das Menü gehört intern direkt zum Frame und muss deshalb auch über das Frame an die Event-Handler gebunden werden.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs

Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
tumbili
User
Beiträge: 27
Registriert: Donnerstag 31. Mai 2007, 14:38

Beitragvon tumbili » Freitag 1. Juni 2007, 08:33

okay, danke für deine Erklärung :)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder