Seite 1 von 1

Programm und GUI Teil trennen

Verfasst: Freitag 1. Juni 2007, 12:36
von tumbili
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?

Re: Programm und GUI Teil trennen

Verfasst: Freitag 1. Juni 2007, 13:57
von Leonidas
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.

Re: Programm und GUI Teil trennen

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

Verfasst: Sonntag 3. Juni 2007, 14:41
von tumbili
ok.. irgendwie hatte ich da wohl einen denkfehler ;)

Verfasst: Sonntag 3. Juni 2007, 14:58
von tumbili
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

Verfasst: Sonntag 3. Juni 2007, 21:34
von DatenMetzgerX
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

Verfasst: Sonntag 3. Juni 2007, 21:45
von tumbili
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 :)

Verfasst: Donnerstag 7. Juni 2007, 14:17
von tumbili
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 :)