Programm und GUI Teil trennen

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

Hi

Ich würde gerne den GUI Teil und den eigentlichen Programm Teil trennen. Aber ich weiß noch nicht so genau wie ich das machen kann :(

Also ich habe z.B. MyTree, eine von wx.TreeCtrl abgeleitete Klasse geschrieben. In dieser Klasse habe ich ein Popupmenü erzeugt. Man soll später über dieses Menü Elemente an den Tree anhängen, löschen, verschieben, etc können.
Im Moment steht in MyTree folgendes:

Code: Alles auswählen

p_menu_item = self.popupmenu.Append(wx.ID_ANY, u"löschen")
self.Bind(wx.EVT_MENU, self.OnDelete, p_menu_item)
Allerdings soll in der onDelete Methode nicht nur das Element aus dem Baum gelöscht werden sondern auch das Element aus der Datenstruktur im Programmteil entfernt werden. Aber da der Programmteil ja den GUI-Teil aufruft weiß ich nicht so genau wie ich vom GUI-Teil auf die funktion delete im Programmteil zugreifen kann...

versteht ihr was ich meine? wie soll man da am besten vorgehen?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

tumbili hat geschrieben:versteht ihr was ich meine? wie soll man da am besten vorgehen?
Erst Datenlogik schreiben, dann GUI, in einem separaten Modul. Aus dieser GUI kannst du dann auf die Datenlogik zugreifen.
Da hatten wir letztens einen Thread, schau mal diesen Post.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

tumbili hat geschrieben:Ich würde gerne den GUI Teil und den eigentlichen Programm Teil trennen. Aber ich weiß noch nicht so genau wie ich das machen kann :(
Hallo tumbili!

So z.B.: http://www.python-forum.de/post-69027.html#69027

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.. irgendwie hatte ich da wohl einen denkfehler ;)
tumbili
User
Beiträge: 27
Registriert: Donnerstag 31. Mai 2007, 14:38

ah, eine sache ist mir noch eingefallen..

Ich möchte eine Buch-ähnliche Struktur speichern und auch in einem TreeCtrl darstellen.
Die Struktur speicher ich in mehreren Objekten, etwa so (vereinfacht):

Code: Alles auswählen

class Book:
	def __init__(self, name):
		self.name = name
		self.chapters = []

	def add_chapter(self, name):
		chapter = Chapter(name)
		self.chapters.append(chapter)
		return chapter

class Chapter:
	def __init__(self, name):
		self.name = name
		self.chapters = []
		self.conditions = []

	def add_chapter(self, name):
		chapter = Chapter(name)
		self.chapters.append(chapter)
		return chapter

	def add_condition(self, name, text):
		condition = Condition(name, text)
		self.conditions.append(condition)
		return condition

class Condition:
	def __init__(self, name, text):
		self.name = name
		self.text = text
Die Daten im TreeCtrl darzustellen ist kein Problem. Aber wie kann ich wenn ein Element im TreeCtrl ausgewählt ist, wieder das passende Objekt in der Datenstruktur finden? Muss man wirklich rekrusiv alle chapters durchgehen bis man das passende Objekt gefunden hat? (Es dürfen keine 2 gleichnamigen chapters exisitieren (auf einer ebene))

Oder gibt es da irgendwelche Tricks? Ich hoffe ihr versteht mein Problem
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

du kannst in der TreeCtrl ein zusätzliche Column hinzufügen (heisst irgend wie setPyData(column id, object)), dann kannst du mit getPyData(column id) die Daten zurückholen. In dieses Feld kann man das ganze objekt, oder nur die ID speichern :) also musst du nicht suchen hehe...

http://www.wxpython.org/docs/api/wx.TreeCtrl-class.html
tumbili
User
Beiträge: 27
Registriert: Donnerstag 31. Mai 2007, 14:38

danke, dass is genau das was ich gesucht habe! Wenn ich das ganze Objekt speicher wird ja eh nur ein Zeiger auf das Objekt gespeichert wenn ich das richtig verstanden habe... Also auch keine große zusätzliche Speicherbelastung :)
tumbili
User
Beiträge: 27
Registriert: Donnerstag 31. Mai 2007, 14:38

hm.. ein Problem mit der Organisation habe ich noch....

Also, vereinfacht habe ich folgende Klassen(jeweils in einer Datei):

Code: Alles auswählen

         MainWindow(wx.Frame)
                  |
                  |
         MainSplitter(wx.Splitter)
              /           \
             /             \
            /               \
   tree(wx.TreeCtrl)    MyPanel(wx.Panel)
Nun möchte ich im tree auf EVT_TREE_SEL_CHANGED reagieren. In der Methode sollen mehrere Eingabefelder auf dem Panel verändert werden.
Wie kann ich von dort auf das Panel zugreifen?

self.parent.panel finde ich nicht gerade ideal, falls z.b. mal zwischen Splitter und tree zb noch ein Notebook kommen sollte...

Also wie würdet ihr das lösen?

Muss man die Event-Methode im MainSplitter definieren?
oder allgemein gesagt: auf der Ebene von der man alle anderen "erreichen" kann, auf die man zugreifen möchte?

danke schonmal :)
Antworten