@Spedex: Jo, der `Frame` hat halt keine Grösse weil `place()` doof ist. Deswegen nimmt man das nicht. Normale Bedienelemente ordnet man mit `pack()` oder `grid()` an und man gibt keine Fenstergrössen- und positionen vor. Die Fenstergrösse ergibt sich bei `pack()` und `grid()` automatisch aus dem Inhalt, so dass halt alles rein passt, und für die Fensterposition ist die Fensterverwaltung des Systems zuständig, nicht ein Anwendungsentwickler der glaubt es besser zu wissen. Wenn ich als *Anwender* möchte das Dein Programm immer an Position (0, 0) platziert wird, dann sage ich das meiner Fensterverwaltung – und da dann auch auf welchem Bildschirm es dort platziert werden soll.
So etwas wie eine Karte, wo dann wirklich Koordinaten für Objekte gefragt sind, kommt in einen `Canvas`, dem man dann auch Scrollbalken verpassen kann, wenn das insgesamt zu gross werden sollte.
Zugreifen auf Objekte die mit Funktion erstellt wurden
- __blackjack__
- User
- Beiträge: 14051
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Ok, angenommen wie sehen über die Tatsache, dass xxx.place() doof ist, hinweg und über die Tatsache, dass man es mit Canvas machen solle, auch. Es lässt sich wie folgt "schlecht" umsetzten:
Man gibt beim Erstellen des Frames die Argumente width und height mit, dann hat der Frame eine bestimme Größe, die nicht von anderen Elementen wie Buttons oder Labels abhängig ist. Das funktioniert.
Allerdings funktioniert das "Anheben" einesFrames nach vorne, über die anderen Frames, nicht wirklich. Sprich es geht darum, dass man einen Frame ganz nach vorne schiebt, damit er sichtbar wird. Im Internet wird das ganze mit framexyz.tkraise() umgesetzt.
Beispielhaft folgender Code-Auschschnitt:
Doch der Frame frame_main_map wird nicht nach vorne geschoben. Die Funktion wird selbstverständlich aufgerufen, was sich mit print("Funktion wurde aufgerufen") innerhalb der Funktion einfach Testen lässt.
Wie lässt sich denn das Nach-vorne-schieben des Frames umsetzten? (Einfache Lösung > Beste Lösung)
Code: Alles auswählen
frame_warnung = Frame(root, width=1450, height=770)
Allerdings funktioniert das "Anheben" einesFrames nach vorne, über die anderen Frames, nicht wirklich. Sprich es geht darum, dass man einen Frame ganz nach vorne schiebt, damit er sichtbar wird. Im Internet wird das ganze mit framexyz.tkraise() umgesetzt.
Beispielhaft folgender Code-Auschschnitt:
Code: Alles auswählen
root = Tk()
root.geometry("1450x770+0+0")
root.title("Name")
root.resizable(False, False)
root.iconbitmap(BASEPATH / "662218.ico")
frame_warnung = Frame(root, width=1450, height=770)
frame_warnung.pack()
button_warn_verstanden = Button(frame_warnung, text="Verstanden", fg="green", font=20)
button_warn_verstanden.place(x=680, y=380)
#hier steht natürlich noch mehr (Buttons, Labels, etc.)
def call_main_map():
frame_main_map = Frame(root, width=1450, height=770)
frame_main_map.pack()
frame_main_map.tkraise()
#hier steht natürlich noch mehr (Buttons, Labels, etc.)
button_warn_verstanden.configure(command=call_main_map)
root.mainloop()
Wie lässt sich denn das Nach-vorne-schieben des Frames umsetzten? (Einfache Lösung > Beste Lösung)
- __blackjack__
- User
- Beiträge: 14051
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@Spedex: Doch der `Frame` wird nach vorne geholt. Man sieht da bloss keinen Unterschied weil der `Frame` ja nicht hinter (oder vor) irgendeinem anderen Widget ist, sondern mit `pack()` unter, also nicht hinter sondern unter dem anderem Frame angeordnet wird, aber so naturlich nicht sichtbar ist, weil der andere Frame ja bereits das gesamte Fenster ausfüllt und ein Frame der darunter angezeigt wird, natürlich nicht zu sehen ist.
Der übliche Weg ist es die `Frame`\s in einem `grid()` in die selbe Zelle zu stecken. Und wenn die `Frame`\s eine feste Grösse haben, braucht man dem Fenster keine geben wenn man die `Frame`\s mit `pack()` oder `grid()` anordnet, denn dann funktioniert das ja dass das Fenster so gross ist, das alles richtig rein passt.
Und noch mal: `place()` verwendet man nicht. Und selbst wenn man das unbedingt für die Karte verwenden will, dann *nur* da, so lokal begrenzt wie möglich, und nur für die Widgets die das wirklich brauchen, also beispielsweise nicht für eines das bei 0, 0 gesetzt wird und die gesamte Fäche einnehmen soll. *Das* wäre nämlich dann genau das Widget das die Grösse für den Layoutmanager zur Verfügung stellt, damit man selbst keine grössen absolut und hart für `Frame`\s oder Fenster angeben muss.
Der übliche Weg ist es die `Frame`\s in einem `grid()` in die selbe Zelle zu stecken. Und wenn die `Frame`\s eine feste Grösse haben, braucht man dem Fenster keine geben wenn man die `Frame`\s mit `pack()` oder `grid()` anordnet, denn dann funktioniert das ja dass das Fenster so gross ist, das alles richtig rein passt.
Und noch mal: `place()` verwendet man nicht. Und selbst wenn man das unbedingt für die Karte verwenden will, dann *nur* da, so lokal begrenzt wie möglich, und nur für die Widgets die das wirklich brauchen, also beispielsweise nicht für eines das bei 0, 0 gesetzt wird und die gesamte Fäche einnehmen soll. *Das* wäre nämlich dann genau das Widget das die Grösse für den Layoutmanager zur Verfügung stellt, damit man selbst keine grössen absolut und hart für `Frame`\s oder Fenster angeben muss.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari