Anbindung mehrerer Fenster in tk inter

Fragen zu Tkinter.
Antworten
sushifuchs
User
Beiträge: 5
Registriert: Freitag 22. September 2023, 07:29

Hallo Leute,
ich bin ganz ganz neu im Thema Python bzw. Tkinter!

ich habe einige einzelne Fenster erstellt, teilweise mit Text und Grafiken. Diese einzelnen Fenster möchte ich nun miteinander verbinden. Das jeweils nächste Fenster soll erreichbar sein, in dem ich oben in der Menüleiste auf einen Button bzw Datei klicke. Die Programmierung mit "createNewWindow" etc ist mir bereits bekannt und läuft soweit- allerdings kann ich im zweiten Fenster dann keine grafik mehr anzeigen lassen ?!. Was ist da eine sinnvoll Abfolge ?

Viele Grüße

Dennis
__deets__
User
Beiträge: 14543
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ohne Code kann man dazu nichts definitives sagen, aus dem Bauch raus geraten: du hast mehrere Tk-Instanzen, davon darf es nur eine geben.
sushifuchs
User
Beiträge: 5
Registriert: Freitag 22. September 2023, 07:29

ja so ist es, aber wie umgehe ich das am einfachsten ?
__deets__
User
Beiträge: 14543
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich wiederhole mich: ohne Code kann man dazu nichts definitives sagen. Man darf eben nur eines erstellen, und muss das durch die Gegend reichen.
sushifuchs
User
Beiträge: 5
Registriert: Freitag 22. September 2023, 07:29

Der Umgangston hier scheint besonders zu sein, ich wollte auch nichts definitives, sondern nur einen kleinen Tipp...

Hier der Code:
##### Fenster erstellen #####
app = tk.Tk()
app.title ("Log In")
app.geometry("1910x1500")
app.config(bg='#bedcea')

##### Belegung Button #####
def button_action():
print("Menü öffnen")

##### Menüleiste erstellen // nur für Batch gedacht, damit eine Weiterleitung erfolgen kann #####
menuleiste = Menu(app)

##### Menü Dateityp #####
datei_menu = Menu(menuleiste, tearoff=0)

##### neues Fenster #####
def createNewWindow():
newWindow4 = tk.Toplevel(app)
newWindow4.title("Support")
newWindow4.geometry("1900x1100")
newWindow4.config(bg='#bedcea')

info_text = Label(newWindow4, text = " Hier geht es weiter in der Batchdatei zum Hauptmenü ")
info_text.pack()

##### Datei für Dateityp #####
datei_menu.add_command(label="Neues Fenster Hauptmenü", command=createNewWindow)
datei_menu.add_separator() # Fügt eine Trennlinie hinzu
datei_menu.add_command(label="Exit", command=app.quit)

##### Name für das obige Fenstermenü #####
menuleiste.add_cascade(label="Menü", menu=datei_menu)

##### Menüleiste dem Fenster übergeben #####
app.config(menu=menuleiste)

##### LOGO #####
Grafik = PhotoImage(file='bild.gif', width=950, height=400)
Bild = Label(app,
image=Grafik,
bg='white')
Bild.place (x=500, y=300, width=980, height=400)

##### LOG IN #####
Label(
app,
text='Nutzername',
bg='#bedcea'
).grid(row=0, column=0,sticky='w')

Label(
app,
text='Passwort',
bg='#bedcea'
).grid(row=1, column=0,stick='w')

Entry(app).grid(row=0, column=1)
Entry(app).grid(row=1, column=1)

Button(
app,
text='Login',
command=createNewWindow
).grid(row=2, column=1)


app.mainloop()

In dem zweiten Fenster möchte ich erneut eine Grafik und Menü einbinden- Das Menü klappt, die Grafik nicht
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Naja, eine blumige Beschreibung des Fehlers läßt viel Interpretationsspielraum, der Code ist da eindeutig.
Und wenn man irgendwo neu ist, dann macht man häufig typsiche Fehler (weil auch die Vorlagen, die man so nimmt, voller Fehler sind).

In Deinem Code fehlen die Importe, so ist also das Programm nicht läuffähig. Fehlt das wirklich, oder hast Du nur vergessen, die zu kopieren?
Manche tkinter-Namen referenzierst Du über tk.XY andere direkt. Das läßt befürchten, dass Du neben dem richtigen Import zusätzlich einen *-Import hast. Den solltest Du sofort löschen.

Im ganzen Code hast Du nur ein Bild. Das funktioniert auch. Das andere Bild ist in Deinem Code nicht, läßt aber vermuten, dass Du das nur als lokale Variable anlegst, und das wird mit dem Ende der Funktion auch wieder abgeräumt, so dass das Bild verschwindet.
Für GUIs braucht man zwangsläufig Klassen, um genau solche Variablen als Attribute auch nach dem Ende der Funktion im Speicher behalten zu können.

Der ganze Code ist sehr wirr, es werden Funktionen mitten drin definiert und es fehlt eine main-Funktion.
Alles was Funktionen brauchen, müssen sie über ihre Argumente bekommen, es darf keine globalen Variablen geben.
Variablennamen schreibt man generell komplett klein.
Du benutzt place. Ersetze das durch grid, weil Du alle anderen Elemente auch per grid plazierst.
sushifuchs
User
Beiträge: 5
Registriert: Freitag 22. September 2023, 07:29

Sirius3 hat geschrieben: Freitag 22. September 2023, 09:18 Naja, eine blumige Beschreibung des Fehlers läßt viel Interpretationsspielraum, der Code ist da eindeutig.
Und wenn man irgendwo neu ist, dann macht man häufig typsiche Fehler (weil auch die Vorlagen, die man so nimmt, voller Fehler sind).

In Deinem Code fehlen die Importe, so ist also das Programm nicht läuffähig. Fehlt das wirklich, oder hast Du nur vergessen, die zu kopieren?
Manche tkinter-Namen referenzierst Du über tk.XY andere direkt. Das läßt befürchten, dass Du neben dem richtigen Import zusätzlich einen *-Import hast. Den solltest Du sofort löschen.

Im ganzen Code hast Du nur ein Bild. Das funktioniert auch. Das andere Bild ist in Deinem Code nicht, läßt aber vermuten, dass Du das nur als lokale Variable anlegst, und das wird mit dem Ende der Funktion auch wieder abgeräumt, so dass das Bild verschwindet.
Für GUIs braucht man zwangsläufig Klassen, um genau solche Variablen als Attribute auch nach dem Ende der Funktion im Speicher behalten zu können.

Der ganze Code ist sehr wirr, es werden Funktionen mitten drin definiert und es fehlt eine main-Funktion.
Alles was Funktionen brauchen, müssen sie über ihre Argumente bekommen, es darf keine globalen Variablen geben.
Variablennamen schreibt man generell komplett klein.
Du benutzt place. Ersetze das durch grid, weil Du alle anderen Elemente auch per grid plazierst.

Die Importe habe ich vergessen, sorry!
Der Code ist wirr, war und ist aber für mich bis dahin verständlich. Klar kann es besser gehen.

Das zweite Bild habe ich aus dem neuen Fenster gelöscht, weil es nicht funktioniert hat bis dahin.

hier die Importe:

from tkinter import *
import tkinter as tk
import tkinter.font as tkFont
from tkinter import RIDGE, Label, PhotoImage, Tk
from tkinter import Frame, Menu, Label, messagebox
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@sushifuchs: Das kann nicht nur besser gehen, das *muss* besser gehen. Das mit den Namenskonventionen ist einfach anzupassen, ebenso die Inkonsistenzen bei den Importen, und das es keine globalen Variablen geben sollte ist essentiell. Es macht keinen Sinn irgendwas anderes weiter zu machen, solange das nicht umgesetzt ist.

Das Du einen Namen mit einer sinnlosen 4 angehängt, innerhalb von einer Funktion definierst, deutet darauf hin, dass die Grundlagen noch nicht sitzen. Funktionen muss man verstanden haben um Klassen und Methoden zu verstehen. Und Klassen braucht man für die GUI-Programmierung. Wenn man mit GUI-Programmierung anfängt, muss man im Grund auf einen Schlag *alles* lernen, statt die aufeinander aufbauenden Teilbereiche der Reihe nach durchzugehen.

Der Quelltext muss nicht nur für Dich jetzt verständlich sein, sondern wenn Du ihn öffentlich zeigst, auch für die Leute die helfen sollen. Und auch für Dich in der Zukunft. Vieles was direkt beim schreiben sonnenklar ist, kann den Autor selber nach ein paar Monaten vor Rätsel stellen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
sushifuchs
User
Beiträge: 5
Registriert: Freitag 22. September 2023, 07:29

__blackjack__ hat geschrieben: Freitag 22. September 2023, 11:18 @sushifuchs: Das kann nicht nur besser gehen, das *muss* besser gehen. Das mit den Namenskonventionen ist einfach anzupassen, ebenso die Inkonsistenzen bei den Importen, und das es keine globalen Variablen geben sollte ist essentiell. Es macht keinen Sinn irgendwas anderes weiter zu machen, solange das nicht umgesetzt ist.

Das Du einen Namen mit einer sinnlosen 4 angehängt, innerhalb von einer Funktion definierst, deutet darauf hin, dass die Grundlagen noch nicht sitzen. Funktionen muss man verstanden haben um Klassen und Methoden zu verstehen. Und Klassen braucht man für die GUI-Programmierung. Wenn man mit GUI-Programmierung anfängt, muss man im Grund auf einen Schlag *alles* lernen, statt die aufeinander aufbauenden Teilbereiche der Reihe nach durchzugehen.

Der Quelltext muss nicht nur für Dich jetzt verständlich sein, sondern wenn Du ihn öffentlich zeigst, auch für die Leute die helfen sollen. Und auch für Dich in der Zukunft. Vieles was direkt beim schreiben sonnenklar ist, kann den Autor selber nach ein paar Monaten vor Rätsel stellen.
hallo Blackjack,
vielen Dank für deine Antwort. Im Grunde kann ich deine Argumente verstehen, weil ich es immer bei meinen Azubis sehe, denen ich seit rund 20 Jahren SPS Programmierung beibringe. Dennoch möchte ich erwähnen, dass ich erstens kein Pythonprofi werden möchte, von daher wollte ich eine einfache Abfolge haben, wie man im "zweiten Fenster" noch eine Grafik einfügen kann, mehr nicht. Wenn es nicht geht, auch in Ordnung. Wenn mir jemand eine Frage stellt bzgl der einzelnen Abfolgen einer SPS versuche ich immer die Sachen so zu erklären, dass es auch Branchenfremde oder Neulinge verstehen, vielleicht habe ich einfach zu viel erwartet, ist im Internet ja häufiger mal schwierig ;). Die 4 im Dateinamen ist keine sinnlose Zahl, sondern die Nummer einer Abfolge, die in der SPS vorkommt, es sollte nur veranschaulichen. Der Quelltext sollte und soll in erster Linie für mich verständlich sein, immerhin wusste ich bis heute nicht, dass ich ihn öffentlich zeige, das kann man ruhig schonmal berücksichtigen. Aber dennoch, vielen Dank für deine Zeit und Ausführung.
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ich denke immer alles so zu erklären, dass es auch Branchenfremde verstehen, macht hier keinen Sinn. Grundsätzlich gehe ich davon aus, dass jeder der sich mit einer Programmiersprache beschäftigt, selbstständig ein Grundlagentutorial durcharbeitet. Bei Python beispielsweise das in der Python-Dokumentation. Es macht ja keinen Sinn in einem Forum immer wieder Dinge zu erklären, die an anderer Stelle schon genau dafür aufbereitet wurden. Ich kann das in der Regel nicht besser formulieren, was da seit mehr als einem Jahrzehnt gepflegt und verbessert wurde.

Also so wie es da steht ist die 4 dann aber am falschen Platz wenn das eigentlich eine Information ist die zu der *Funktion* gehört, und es fehlt etwas erklärendes zur Bedeutung. Also beispielsweise so:

Code: Alles auswählen

import tkinter as tk

BACKGROUND_COLOUR = "#bedcea"


def create_step_4_window(master):
    window = tk.Toplevel(master, bg=BACKGROUND_COLOUR)
    window.title("Support")
    #
    # `geometry()` habe ich hier nicht gesetzt, weil sich die Grösse von
    # Fenstern aus ihrem Inhalt ergibt.
    #
    tk.Label(
        window, text=" Hier geht es weiter in der Batchdatei zum Hauptmenü "
    ).pack()
Ist immer noch nicht schön, weil eigentlich ja nicht interessiert, dass das der vierte Schritt ist, sondern was dieser vierte Schritt bedeutet. Wenn das mal überarbeitet wird und Schritte eingefügt werden oder wegfallen, dann will man ja weder falsche, irreführende Namen im Programm haben, noch anfangen Namen ”umzunummerieren”.

Um `master` in die Funktion zu bekommen braucht man dann mindestens `functools.partial()` oder eben objektorientierte Programmierung (OOP), also eine Klasse.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten