Das ist meine erste Frage in einem Forum. Wenn ich mich unklar (oder ungeschickt ausdrücke) gebt mir bitte bescheid .
Ich hoffe ich habe nicht einfach eine mögliche Lösung in einem der anderen Themen übersehen.
Hoffentlich wirkt die Frage auch nicht dumm, wenn man sich besser mit der Funktionsweise von Python auskennt.
Zu meinem Problem:
Ich habe versucht mir in Python und tkinter eine art Arbeitsmappe zu schreiben. Dabei ist jede Seite ein Canvas. Ein kleines "Menü" ermöglicht mir das "blättern" druch diese. Das ganze wird aus der Klasse PageMap (erbt von Frame) heraus "verwaltet". Ich merke mir die aktuell gezeigte Seite durch self.pages[self.current]. Wenn zu einer Seite gewechselt wird, wird das aktuelle Canvas mit pack_forget() aus dem Frame pack entfernt und die neue Seite mit pack eingefügt.
Ist es möglich, dass ich die Methoden direkt an PageMap auffrufe und diese an self.pages[self.current] weiter gegeben werden ohne für jede methode von Canvas eine übergabe Methode bei PageMap zu schreiben. Oder wie sähe ein schönerer Weg aus?
Das soll erstmal ein funktionierender Prototyp werden. Wenn es klappt versuche ich nach bestem Gewissen den Code zu verbessern.
Bitte teilt mir auch unschöne Codestellen mit (sonst lerne ichs ja nicht ).
Code: Alles auswählen
class CanMenu(Canvas):
x = 0
active = 0
def __init__(self, parent, height, *args, **kwargs):
Canvas.__init__(self, parent, height=height, *args, **kwargs)
self.height = height
self.parent = parent
self.add_but()
def add(self, number, name=""):
self.delete("+")
if name == "":
name = "Page " + str(number)
width = max(len(name) * 10 + 4, 30)
rec_name = "rec_" + str(number)
txt_name = "txt_" + str(number)
self.create_rectangle(self.x, 0, self.x + width, self.height + 2, outline="#000000", tag=rec_name)
self.create_text(self.x + width//2, self.height//2 + 1, text=name, tag=txt_name)
self.tag_bind(rec_name, "<1>", lambda event: self.parent.open_page(number))
self.tag_bind(txt_name, "<1>", lambda event: self.parent.open_page(number))
self.x += width
self.activate(number)
self.add_but()
def activate(self, number):
new_tag = "rec_" + str(number)
old_tag = "rec_" + str(self.active)
self.itemconfig(old_tag, fill="#FFFFFF")
self.itemconfig(new_tag, fill="#0040FF")
self.active = number
self.update()
def add_but(self):
self.create_rectangle(self.x, 0, self.x + self.height + 2, self.height + 2, fill="#FFBF00", tag="+")
self.create_text(self.x + (self.height+2)//2, self.height//2 + 1, tag="+", text="+")
self.tag_bind("+", "<1>", lambda event: self.parent.add_page())
Code: Alles auswählen
class PageMap(Frame):
current = 0
pages = []
def __init__(self, parent, *args, **kwargs):
Frame.__init__(self, parent, *args, **kwargs)
self.menu = CanMenu(self, bg="#FFFFFF", height=16)
self.menu.pack(fill=X)
def add_page(self, name=""):
if self.pages != []:
self.pages[self.current].pack_forget()
self.current = len(self.pages)
self.pages.append(Canvas(self, bg="#FFFFFF"))
self.pages[self.current].pack(fill=BOTH)
self.menu.add(self.current, name)
def open_page(self, x):
if x < len(self.pages):
self.pages[self.current].pack_forget()
self.current = x
self.pages[self.current].pack(fill=BOTH)
self.menu.activate(self.current)
def page_number(self):
return self.current
def page(self):
return self.pages[self.current]
def drop_page(self, number):
if len(self.pages) == 1:
self.add_page()
elif number == self.current:
to_open = (number + 1) % (len(self.pages)-1)
self.open_page(to_open)
self.pages.remove(number)
Code: Alles auswählen
if __name__ == "__main__":
def add():
page = map.page()
page.create_rectangle(0, 100, 100, 0, fill="#FF0000")
# hier würde mit funktionierender Lösung "map.create_rectangle(...)" statt die beiden oberen Zeilen stehen
tk = Tk()
tk.geometry("500x500")
map = PageMap(tk)
map.place(relx=0, rely=0, relwidth=1, relheight=0.8)
map.add_page()
but = Button(tk, text="Markierung", command=add)
but.place(relx=0, rely=0.9, relwidth=1)
tk.mainloop()