Gliederung, Menu ID's

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

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: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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

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

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

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: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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

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: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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

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