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
