Countdown + Eingabe

Fragen zu Tkinter.
Antworten
The_Net
User
Beiträge: 9
Registriert: Samstag 17. April 2010, 12:01

Hallo,
Ich beschäftige mich seit geraumer Zeit mit diesem Problem, habe aber bisher keine gute Lösung gefunden. Derzeit sieht die Situation so aus:
Ich habe einen Countdown sowie ein Eingabefeld und einen Button. Gibt man einen Buchstaben in das Textfeld ein und drückt den Button, sollte der Countdown stehenbleiben.

Nun zum Problem: Wegen des Countdowns kann man scheinbar nichts in das Textfeld eingeben, und wenn doch, dann mit erheblicher Verzögerung. Habe auch schon probiert, das ganze mit Threads zu lösen - bisher jedoch ohne Erfolg.

Gibt es eine Lösung zu diesem Problem, bzw. wie muss man den Code abändern, damit der Countdown läuft, und man währenddessen auch den Buchstaben eingeben kann und auf Submit drücken kann?

Code: Alles auswählen

import Tkinter,os,time,sys,thread

main = Tkinter.Tk()
zeit = 15
aus = 0

def zeitupd():
    global zeit,aus
    if aus != 1:
        zeit2 = -1
        if zeit2 != zeit:
            zeit -= 1
            uhrzeit.config(text=zeit)
            time.sleep(1)
            uhrzeit.after(100,zeitupd)
        #if zeit == 10:
        #    aus = 1
        if zeit == 0:
            os.system("otherprocess.exe")
            sys.exit(0)

def ende():
    global aus
    if t1.get() == "h":
       aus = 1

uhrzeit = Tkinter.Label(main,font=('courier',13),text=zeit)
uhrzeit.pack()

t1 = Tkinter.Entry(main)
l2 = Tkinter.Button(main,text="Anhalten",command=ende)

t1.pack()
l2.pack()

thread.start_new_thread(zeitupd,())

main.mainloop()
[/code]
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Das Stichwort heißt after()-Methode.
Such mal danach im Forum oder in der Tkinter-Doku.
The_Net
User
Beiträge: 9
Registriert: Samstag 17. April 2010, 12:01

Soweit - sogut, danke. Der Befehl war ja bereits vorhanden, hat es nur wegen dem time.sleep(1) nicht funktioniert?

Jedenfalls sollte das Programm bei zeit == 0 zuerst das andere Programm aufrufen und sich dann selbst mit sys.exit() beenden. Ich habe if zeit2 != zeit: bereits auf if zeit2 != zeit and zeit != 0: umgeschrieben, nichtsdestotrotz stürzt das Programm beim Start des anderen ab. Wie ist das zu lösen?

mfg[/i]
BlackJack

@The_Net: Nimm mal `thread` raus und arbeite ausschliesslich mit `after()`. GUIs mögen es in der Regel nicht wenn von mehreren Threads aus auf sie zugegriffen wird.
The_Net
User
Beiträge: 9
Registriert: Samstag 17. April 2010, 12:01

Der Thread ist draussen, es funktioniert leider immer noch nicht.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo The_Net

Hier es geht doch::

Code: Alles auswählen

import Tkinter, os, sys

main = Tkinter.Tk()

LOOP_TIME = 200 # Millisekunden
main.zeit = 30
main.aus = False

def zeitupd():

    if not main.aus:
        zeit2 = -1
        if zeit2 != main.zeit:
            main.zeit -= 1
            uhrzeit.config(text=main.zeit)
            uhrzeit.after(LOOP_TIME,zeitupd)

        if main.zeit == 0:
            os.system("otherprocess.exe")
            sys.exit(0)

def ende():

    if t1.get() == "h":
       main.aus = True

uhrzeit = Tkinter.Label(main,font=('courier',13),text=main.zeit)
uhrzeit.pack()

t1 = Tkinter.Entry(main)
l2 = Tkinter.Button(main,text="Anhalten",command=ende)

t1.pack()
l2.pack()

zeitupd()

main.mainloop()
Übrigens:

Code: Alles auswählen

Schade
Ist dann keine Tkinter- bzw. Python-Anweisung!

Gruß wuf :wink:
Take it easy Mates!
Antworten