Seite 1 von 1

Anbindung mehrerer Fenster in tk inter

Verfasst: Freitag 22. September 2023, 07:40
von sushifuchs
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

Re: Anbindung mehrerer Fenster in tk inter

Verfasst: Freitag 22. September 2023, 08:37
von __deets__
Ohne Code kann man dazu nichts definitives sagen, aus dem Bauch raus geraten: du hast mehrere Tk-Instanzen, davon darf es nur eine geben.

Re: Anbindung mehrerer Fenster in tk inter

Verfasst: Freitag 22. September 2023, 08:39
von sushifuchs
ja so ist es, aber wie umgehe ich das am einfachsten ?

Re: Anbindung mehrerer Fenster in tk inter

Verfasst: Freitag 22. September 2023, 08:44
von __deets__
Ich wiederhole mich: ohne Code kann man dazu nichts definitives sagen. Man darf eben nur eines erstellen, und muss das durch die Gegend reichen.

Re: Anbindung mehrerer Fenster in tk inter

Verfasst: Freitag 22. September 2023, 08:53
von sushifuchs
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

Re: Anbindung mehrerer Fenster in tk inter

Verfasst: Freitag 22. September 2023, 09:18
von Sirius3
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.

Re: Anbindung mehrerer Fenster in tk inter

Verfasst: Freitag 22. September 2023, 09:27
von sushifuchs
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

Re: Anbindung mehrerer Fenster in tk inter

Verfasst: Freitag 22. September 2023, 11:18
von __blackjack__
@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.

Re: Anbindung mehrerer Fenster in tk inter

Verfasst: Freitag 22. September 2023, 11:35
von sushifuchs
__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.

Re: Anbindung mehrerer Fenster in tk inter

Verfasst: Freitag 22. September 2023, 12:33
von __blackjack__
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.