Seite 1 von 1

Gliederung, Menu ID's

Verfasst: Donnerstag 31. Mai 2007, 14:46
von tumbili
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 :)

Re: Gliederung, Menu ID's

Verfasst: Donnerstag 31. Mai 2007, 15:40
von gerold
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
:-)

Verfasst: Donnerstag 31. Mai 2007, 21:00
von tumbili
okay danke. nur um das zu verstehen: wx.Menu.Append() gibt also einfach die ID zurück?

Verfasst: Donnerstag 31. Mai 2007, 21:18
von gerold
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
:-)

Verfasst: Donnerstag 31. Mai 2007, 21:29
von tumbili
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?

Verfasst: Donnerstag 31. Mai 2007, 22:35
von gerold
tumbili hat geschrieben:das macht also keinen unterschied?
Nein :)

Verfasst: Donnerstag 31. Mai 2007, 22:45
von tumbili
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?

Verfasst: Freitag 1. Juni 2007, 08:13
von gerold
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
:-)

Verfasst: Freitag 1. Juni 2007, 08:33
von tumbili
okay, danke für deine Erklärung :)