ubuntuusers.de

Python 3; Tkinter: Button Fenster schließen

Status: Gelöst | Ubuntu-Version: Xubuntu 16.04 (Xenial Xerus)
Antworten |

marv98

Anmeldungsdatum:
24. August 2016

Beiträge: 142

Hi, ich verwende Python 3 und möchte ein Dialog mit Tkinter erstellen. Das erste Fenster fragt ab, ob man überhaupt den Dialog starten möchte. Es gibt einen Button (Button1) zum beenden, der den Dialog beendet und einen der das alte Fenster schließt (Button2) und ein weiteres öffnet. Ich habe genau das versucht indem ich in einer anderen Funktion fenster.destroy() verwendet habe, das sah dann so aus:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
import tkinter as tk
from tkinter import *
from tkinter import messagebox
from tkinter import filedialog

def window():
    global frame
    frame = Tk()

    Button1 = tk.Button(frame, text="Nein.", command=frame.quit)
    Button1.pack(anchor=S, fill=X, side=RIGHT)
    Button2 = tk.Button(frame, text="Ja!", fg="dark green", command = func)
    Button2.pack(anchor=S, fill=X, side=LEFT)
    frame.mainloop()

def func():
    frame.destroy()
    messagebox.showinfo("Help",
                        "Hier geht der Dialog weiter.")

window()
# Code nach dem Dialog

Wenn ich Button2 drücke schließt sich das alte Fenster nicht. Es verschwindet lediglich der Inhalt. Ich habe den Code etliche Male umgeschrieben, bekomme es aber nicht hin das das Fenster schließt. Das Problem ist, so lange ein Fenster offen ist läuft der Code nach dm Dialog nicht mehr weiter.

Bearbeitet von rklm:

Syntaxhighlighting. Bitte beachte Forum/Syntax!

marv98

(Themenstarter)

Anmeldungsdatum:
24. August 2016

Beiträge: 142

Habe das Problem gefunden. Eine Massagebox braucht immer ein "main" window, da ich das alte mit "frame.destroy()" geschlossen habe, existiert kein main window (mit mainloop) mehr Tkinter muss sich also mit einem leerem Fenster aushelfen. Man kann stattdessen das Fenster zunächst mit "frame.geometry("0x0")" miniemieren und nach beenden der massagebox mit "frame.destroy()" schließen, dass sieht dann so aus.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import tkinter as tk
from tkinter import *
from tkinter import messagebox

def window():
    global frame
    frame = Tk()

    Button1 = tk.Button(frame, text="Nein.", command=frame.quit)
    Button1.pack(anchor=S, fill=X, side=RIGHT)
    Button2 = tk.Button(frame, text="Ja!", fg="dark green", command=func)
    Button2.pack(anchor=S, fill=X, side=LEFT)
    frame.mainloop()


def func():
    frame.geometry("0x0") #Hier!
    messagebox.showinfo("Help",
                        "Hier geht der Dialog weiter.")
    frame.destroy() #Hier!

window()
# Code nach dem Dialog
print("finish dialog")
Antworten |