Selbstzerstörung über Methode?

Fragen zu Tkinter.
Antworten
PythonBoiiii
User
Beiträge: 10
Registriert: Dienstag 19. Februar 2019, 18:09

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()
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Benutzeravatar
__blackjack__
User
Beiträge: 13064
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
PythonBoiiii
User
Beiträge: 10
Registriert: Dienstag 19. Februar 2019, 18:09

__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'
Benutzeravatar
__blackjack__
User
Beiträge: 13064
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
PythonBoiiii
User
Beiträge: 10
Registriert: Dienstag 19. Februar 2019, 18:09

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!
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

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")
Antworten