ich bin noch recht neu im python programmieren und vorallem mit der GUI.
Allso bitte nicht gleich steinigen, wenn die Frage doof ist

Mein Problem ist folgendes:
Ich habe ein Programm, dass aus vielen Spalten mit Buttons besteht. Durch klicken auf einen Button kommt
dann immer eine neue Spalte dazu. Dazu habe ich eine eine Klasse geschrieben, in der die Spalte definiert ist,
bei der ich mittels Konstruktor alle Buttons erzeugen kann. Dabei habe ich das Problem, dass ich irgendwie
das Frame, in dem die Spalte platziert werden muss in der Klasse verfügbar machen muss um es anzugeben.
Meine bisherige Lösung ist hier, dass ich dem Konstruktor das Frame von der main Klasse übergebe und es
dann immer weiterreiche. Funktioniert, ist aber finde ich ziemlich unschön.
Habt ihr eine Idee, wie man das irgendwie besser hinbekommen kann? Gibt es dazu irgendeinen schönen Weg,
oder ist mein Vorgehen an sich schon zu hässlich?
Das Prinzip mit der Klasse, in der alles Buttons gesetzt werden würde ich nur ungerne aufgeben, da die Spalten
als Adjazenzliste verwaltet werden, was es für mich leichter macht.
Das gleiche Problem besteht mit dem canvas, in dem alles Platziert wird. Da sollen Scrollbalken erscheinen, sobald
die Breite der Buttons zu groß wird. Da ich aber nur innerhalb der Klasse Spalten erzeuge bekommt main davon nix mit
und das canvas kann nicht aktualisiert werden. (Hab es erstmal über seqCanvas.after(1000, update_label) alle Sekunde
aktualisiert, was ich ziemlich überflüssig finde...
Schon mal danke für eure Hilfe!
Viele Grüße,
sommer87
Hier ein Minimalbeispiel:
Hauptprogramm in dem die Oberfläche definiert wird (gesamt Anordnung / Scrollbalken etc...)
Code: Alles auswählen
import Tkinter as tk # Abkuerzung fuer Tkinter
from Tkinter import *
import tkMessageBox
# eigene Klassen
from sequenzOptions import SequenzOptions
root = tk.Tk()
seqCanvas = Canvas(root,width=__seqCanvasWidth,height=__seqCanvasHeight,xscrollcommand=seqHscrollbar.set)
seqCanvas.grid(row=0,column=1,stick=N+S+E+W)
seqHscrollbar.config(command=seqCanvas.xview)
root.grid_rowconfigure(0,weight=1)
root.grid_columnconfigure(0,weight=1)
seqFrame = Frame(seqCanvas)
seqFrame.rowconfigure(1,weight=2)
seqFrame.columnconfigure(1,weight=2)
# Zeichne seqCanvas mit Scrolloption
seqCanvas.create_window(0,0,anchor=NW,window=seqFrame)
seqFrame.update_idletasks()
seqCanvas.config(scrollregion=seqCanvas.bbox("all"))
SequenzOptions(1,seqFrame,seqName="Hallo")
root.mainloop()
seqFrame wird übergeben um darin das seqConfFrame (und noch einiges mehr) zu platzieren.
Code: Alles auswählen
import Tkinter as tk # Abkuerzung fuer Tkinter
from Tkinter import *
import tkMessageBox
class SequenzOptions(object):
# Konstruktor
def __init__(self,seqId,seqFrame,prevSeq=None,nextSeq=None,seqName="",seqTime=0):
self.seqId = seqId
self.seqFrame = seqFrame # muss immer uebergeben werden zur Platzierung
self.seqConfFrame = Frame(seqFrame)
self.seqConfFrame.rowconfigure(1,weight=1)
self.seqConfFrame.columnconfigure(1,weight=1)
self.seqConfFrame.grid(row=0,column=self.seqId)
self.seqConfFrame.update_idletasks()