Seite 1 von 1

Selbstzerstörung über Methode?

Verfasst: Dienstag 19. Februar 2019, 18:16
von PythonBoiiii
Hi zusammen!

Ich habe eine Frage zu GUIs in Python. Ich möchte, dass sich ein TKinter Fenster öffnet, 3 Sekunden da bleibt und anschließend wieder schließt.

Ich bin übrigens neu hier, bin eigentlich Webdesigner, musste jedoch für Analysezwecke Python lernen.
Ich freue mich sehr auf Eure Antworten!

Liebe Grüße.

Code: Alles auswählen

import time

def zerstoeren():
    root.destroy()

from tkinter import *
root = Tk()

def nachricht():
    lab1 = Label(root, text="Hi")
    lab1.pack()
    root.mainloop()
    time.sleep(2)
    zerstoeren()
    
nachricht()

Re: Selbstzerstörung über Methode?

Verfasst: Dienstag 19. Februar 2019, 18:19
von __deets__
time.sleep ist in GUIs ueblicherweise nicht so dolle. Denn dann passiert einfach nichts. GUIs arbeiten ereignis-basiert: Maus, Tasten, Timer loesen Ereignisse aus, und der Mainloop bekommt die und verteilt die. Darum passiert nach dem mainloop auch nix.

Aber Hilfe ist nah: ein simples "root.after(2000, zerstoeren)" VOR dem mainloop startet einen Timer, und sollte dann die Zerstoerung ausloesen.

Re: Selbstzerstörung über Methode?

Verfasst: Dienstag 19. Februar 2019, 18:24
von __blackjack__
Wobei `zerstoeren()` überflüssig ist, denn statt `zerstoeren()` aufzurufen/aufrufen zu lassen, kann man auch `root.destroy()` verwenden. Und `root` sollte nicht auf Modulebene existieren.

Re: Selbstzerstörung über Methode?

Verfasst: Mittwoch 20. Februar 2019, 16:57
von PythonBoiiii
__deets__ hat geschrieben: Dienstag 19. Februar 2019, 18:19 time.sleep ist in GUIs ueblicherweise nicht so dolle. Denn dann passiert einfach nichts. GUIs arbeiten ereignis-basiert: Maus, Tasten, Timer loesen Ereignisse aus, und der Mainloop bekommt die und verteilt die. Darum passiert nach dem mainloop auch nix.

Aber Hilfe ist nah: ein simples "root.after(2000, zerstoeren)" VOR dem mainloop startet einen Timer, und sollte dann die Zerstoerung ausloesen.
Hi, vielen Dank für deine Antwort! Meinst du so?

Code: Alles auswählen

from tkinter import *

def zerstoeren():
    global root
    root.q

root = Tk()

def nachricht():
    lab1 = Label(root, text="Hi")
    lab1.pack()
    root.after(2000, zerstoeren)
    root.mainloop()
    
nachricht()
Denn da kommt folgende Fehlermeldung:

AttributeError: '_tkinter.tkapp' object has no attribute 'q'

Re: Selbstzerstörung über Methode?

Verfasst: Mittwoch 20. Februar 2019, 17:04
von __blackjack__
@PythonBoiiii: Wie kommst Du denn auch auf die Idee das es ein Attribut `q` geben würde? Und was soll das bewirken das einfach zu dereferenzieren ohne irgend etwas damit zu machen?

Und `root` sollte immer noch nicht auf Modulebene existieren. Vergiss zudem ``global`` gleich wieder.

Re: Selbstzerstörung über Methode?

Verfasst: Mittwoch 20. Februar 2019, 18:42
von PythonBoiiii
Hallo,

tut mir leid, ich habe vorhin in der Eile zu oft Strg-z gedrückt, da ich mich vertippt hatte.

Code: Alles auswählen

from tkinter import *
root = Tk()

def nachricht():
    lab1 = Label(root, text="Hi")
    lab1.pack()
    root.after(2000, root.destroy)
    root.mainloop()
    
nachricht()
funktioniert einwandfrei. Vielen Dank!

Re: Selbstzerstörung über Methode?

Verfasst: Mittwoch 20. Februar 2019, 18:54
von Sirius3
Jetzt noch die globalen Variablen loswerden und keinen *-Import:

Code: Alles auswählen

import tkinter as tk

def nachricht(text):
    root = tk.Tk()
    tk.Label(root, text=text).pack()
    root.after(2000, root.destroy)
    root.mainloop()

if __name__ == '__main__':
    nachricht("Hi")