Fenster schließen, nachdem Button gedrückt wurde

Fragen zu Tkinter.
Antworten
wulf3000
User
Beiträge: 20
Registriert: Montag 31. August 2020, 10:46

Hallo liebe Mitglieder des Python Forums,

Bin gerade am Programmieren eines Prüfplatzes. Das Programm läuft soweit, hat jedoch einige Schwächen.

1. Sobald man auf den Button "Prüfprogramm starten" drückt, öffnet sich das zweite Fenster ordnungsgemäß. Dies geschieht mit einem command Befehl in Button B1. Das Programm springt nach Betätigung des Buttons nach "createNewWindow". Dort erstelle ich ein zweites Fenster. Jedoch weiß ich nicht, wie ich nun das erste Fenster automatisch schließen lasse, wenn das zweite auf geht.

2. Einer der beiden Radiobuttons im zweiten Fenster ist anfangs ohne etwas zu drücken aktiv,obwohl ich die Variable x vorher auf null setze. Verstehe meinen fehler dort nicht.

3.Eine Frage für die Zukunft: Wie programmiere ich folgendes Ereignis: Wenn Radiobutton 1 aktiv und Test starten =1 ---->Programm 1 läuft
Wenn Radiobutton 2 aktiv und Test starten=1------> Programm 2 läuft

Ich bin für jeden Tip oder Lösungsvorschlag dankbar!

from tkinter import *

def createNewWindow():




def Test_läuft():
B1["bg"] = "#00FF00"
return

def Abbruch():
B1["bg"] = "#FF0000"
return
#newWindow = Toplevel(root)

neuerTitel=Tk()
neuerTitel.title("Prüfplatz Laetus")
root = neuerTitel


textfenster=Text(root)
textfenster["width"] = 50
textfenster["bd"] = 3

B1 = Button(root, text="Test starten", command=Test_läuft)
B1["bd"] = 3
B1["width"] = 15
B2 = Button(root, text="Abbrechen", command=Abbruch)
B2["bd"] = 3
B2["width"] = 15

textfenster.grid(row=12,column=0,columnspan=5,sticky="s")
B1.grid(row=1, column=1, sticky="sw")
B2.grid(row=2, column=1, sticky="sw")

lab2 = Label(root, text=" Initialisierung")
lab2["font"] = "Arial 16 "
lab2.grid(row=0, column=0, sticky="w")

lab3 = Label(root, text="Log")
lab3["font"] = "Arial 12 italic"
lab3.grid(row=10, column=0, sticky="w")


x = IntVar()
x.set(0)

RB0 = Radiobutton(root, text="smartspect", variable=x,value=1)
RB1 = Radiobutton(root, text="iCam", variable=x,value=2)

RB0.grid(row=1, column=0, sticky="w")
RB1.grid(row=2, column=0, sticky="w")


#---Hauptprogramm-----

neuerTitel = Tk()
neuerTitel.title("Prüfplatz Laetus")
root = neuerTitel

B0 = Button(root,text="Prüfprogramm starten",command=createNewWindow)
B0["font"] = "Arial 15"
B0["bd"]=3
B0["width"]=30
B0["height"]=2

img1 = PhotoImage(file ="C:/Users/wolf_m/Pictures/Hund.PNG")
img2 = PhotoImage(file ="C:/Users/wolf_m/Pictures/Laetus.PNG")
lab4 = Label(root,image = img1)
lab5 = Label(root,image =img2)




B0.pack(side=TOP)
lab4.pack(side=LEFT)
lab5.pack(side=RIGHT)



root.mainloop()
Benutzeravatar
peterpy
User
Beiträge: 188
Registriert: Donnerstag 7. März 2013, 11:35

Hallo wulf3000,
1. Ist das erste Fenster das root Fenster? Wenn ja, dann nicht schliessen, ansonsten gibts die Methode window.destroy. Ob das schliessen des Fensters eine gute Idee ist, kannst nur Du beurteilen, man kann das Fenster auch verstecken
2. Ohne dass Du uns den Code zeigst, kannst nur Du wissen wo der Fehler liegt.
Sorry den Code hab ich übersehen. Bitte den Code zwischen die Codetags </>setzen.
3. Den Radiobuttens ist je ein Wert zuzuweisen, dann weisst Du welcher Radiobutten aktiv ist.
Schau Dir mal die Doku an:https://anzeljg.github.io/rin2/book2/24 ... utton.html
Gruss
Peter
wulf3000
User
Beiträge: 20
Registriert: Montag 31. August 2020, 10:46

Hallo Peter,

Erstmal danke für deine Antwort. Ich habe versucht den Radiobuttons einen Wert zuzuweisen mit value=...
Beispielsweise hat der Button RB0 den value = 1 , wenn er betätigt wurde. Jedoch verstehe ich nicht, wie ich ihn auslese. Mit einer if Abfrage funktioniert das ganze nicht. Versucht hatte ich: if RBO ==1: dann springe zum nächstfolgenden Programm. Leider funktioniert dies nicht.
Benutzeravatar
peterpy
User
Beiträge: 188
Registriert: Donnerstag 7. März 2013, 11:35

Hallo wulf3000,

Bitte den Code zwischen die Codetags </>setzen.
Und keine Sternchen importe, sondern import Tkinter as Tk

mit x.get() bekommst Du den Wert des aktiven Radiobuttons.
Gruss
Peter
wulf3000
User
Beiträge: 20
Registriert: Montag 31. August 2020, 10:46

Code: Alles auswählen

import tkinter as tk

def zweitesFenster():


    def Test_läuft():
        B1["bg"] = "#00FF00"
        neuerTitel = tk.Tk()
        neuerTitel.title("Prüfplatz Laetus")
        root = neuerTitel
        lab0 = tk.Label(root,text = "Bitte DUT montieren und anschließen")
        lab0["font"] = "Arial 20"
        lab0["height"] = 5
        lab0["width"] = 30
        B3 = tk.Button(root,text = "Okay")
        B3["bd"] = 3
        B3["width"] = 15
        B3["height"] = 2
        B3["font"] = "Arial 15"

        lab0.pack(side=TOP)
        B3.pack(side=TOP)
        return

    def Abbruch():
        B1["bg"] = "#FF0000"
        return
    #newWindow = Toplevel(root)

    neuerTitel=tk.Tk()
    neuerTitel.title("Prüfplatz Laetus")
    root = neuerTitel


    textfenster=tk.Text(root)
    textfenster["width"] = 50
    textfenster["bd"] = 3

    B1 = tk.Button(root, text="Test starten", command=Test_läuft)
    B1["bd"] = 3
    B1["width"] = 15
    B2 = tk.Button(root, text="Abbrechen", command=Abbruch)
    B2["bd"] = 3
    B2["width"] = 15

    textfenster.grid(row=12,column=0,columnspan=5,sticky="s")
    B1.grid(row=1, column=1, sticky="sw")
    B2.grid(row=2, column=1, sticky="sw")

    lab2 = tk.Label(root, text=" Initialisierung")
    lab2["font"] = "Arial 16  "
    lab2.grid(row=0, column=0, sticky="w")

    lab3 = tk.Label(root, text="Log")
    lab3["font"] = "Arial 12 italic"
    lab3.grid(row=10, column=0, sticky="w")

    x = tk.IntVar()
    x.set(0)

    RB0 = tk.Radiobutton(root, text="smartspect", variable=x,value=1)
    RB1 = tk.Radiobutton(root, text="iCam", variable=x,value=2)

    z=x.get()
    print(z)

    RB0.grid(row=1, column=0, sticky="w")
    RB1.grid(row=2, column=0, sticky="w")


#---Hauptprogramm-----

neuerTitel = Tk()
neuerTitel.title("Prüfplatz Laetus")
root = neuerTitel

B0 = Button(root,text="Prüfprogramm starten",command=zweitesFenster)
B0["font"] = "Arial 15"
B0["bd"]=3
B0["width"]=30
B0["height"]=2

img1 = tk.PhotoImage(file ="C:/Users/wolf_m/Pictures/Hund.PNG")
img2 = tk.PhotoImage(file ="C:/Users/wolf_m/Pictures/Laetus.PNG")
lab4 = tk.Label(root,image = img1)
lab5 = tk.Label(root,image =img2)






B0.pack(side=TOP)
lab4.pack(side=LEFT)
lab5.pack(side=RIGHT)



root.mainloop()
wulf3000
User
Beiträge: 20
Registriert: Montag 31. August 2020, 10:46

Hi Peter. Habe dir den Code jetzt mal beigefügt und umgewandelt in import tkinter as tk...

Die x.get() Funktion gibt mir dennoch immer 0 aus. Egal ob ein Radiobutton angeklickt ist oder nicht.

Vielleicht kannst du mir helfen und deinen Vorschlag mal online stellen. LG!
Sirius3
User
Beiträge: 18289
Registriert: Sonntag 21. Oktober 2012, 17:20

Es darf nur ein Exemplar von tk.Tk im gesamten Programm geben. Weitere Fenster macht man mit tk.TopLevel.

Variablennamen sollen aussagekräftig sein, wenn Namen Nummern angehängt haben, dann sind diese nicht aussagekräftig.
neuerTitel ist ein sehr schlechter Name für ein Fenster. Warum nennst Du das dann erst später in root um?

Bei GUIs hat man keinen sequenzellen Ablauf. Du fragst x.get gleich nach dem Erzeugen ab, so dass niemand eine Chance hat, das zu ändern.

Benutze keine Verschachtelten Funktionen und keine globalen Variablen. Jedes nicht-triviale GUI-Programm braucht Klassendefinitionen.
wulf3000
User
Beiträge: 20
Registriert: Montag 31. August 2020, 10:46

Hi Sirius. Okay, danke für die Antworten. Jedoch hilft mir das nicht wirklich weiter. Das daran was falsch ist wusste ich schon und das Arbeiten mit Klassen habe ich vermieden weil ich Neuling im python programmieren bin.

Lösungshinweise wie ich die Buttons auslese würden mir eher helfen.

LG
wulf3000
User
Beiträge: 20
Registriert: Montag 31. August 2020, 10:46

Versuche das ganze gerade mal mit Klassen aufzubauen und sende den neuen Code dann mal hier rein
Kanaax
User
Beiträge: 17
Registriert: Mittwoch 5. August 2020, 09:15

Code: Alles auswählen

def button_abbruch():
    result = tk.messagebox.askyesno("Warnung!",
        "Soll das Programm wirklich geschlossen werden?")
    if result:
        root.destroy()
So habe ich das geregelt. Ich muss aber auch dazu sagen das ich ebenfalls Neuling bin was tkinter/Python angeht und wir haben vieles falsch gelernt was ich jetzt erstmal neu lernen darf :/ .
Ich habe auch erst versucht den Button Wert und "True" zu bekommen um damit dann so zu arbeiten, aber ich habe mich dran errinert das man unter Windows wegen alles 100 mal gefragt wird und daher habe ich es jetzt so gelöst.

Vielleicht kannst du meinen Code ja so umschreiben das wenn sich das Fenster schliesst ein neues auf geht. Du darfst aber nicht das "root" Fenster killen, da sonst das ganze programm geschlossen wird.
ine Frage für die Zukunft: Wie programmiere ich folgendes Ereignis: Wenn Radiobutton 1 aktiv und Test starten =1 ---->Programm 1 läuft
Wenn Radiobutton 2 aktiv und Test starten=1------> Programm 2 läuft
Ich würde es denke ich mal mit einer if schleife machen
Antworten