Seite 1 von 1

Countdown + Eingabe

Verfasst: Samstag 17. April 2010, 16:49
von The_Net
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]

Verfasst: Samstag 17. April 2010, 18:55
von numerix
Das Stichwort heißt after()-Methode.
Such mal danach im Forum oder in der Tkinter-Doku.

Verfasst: Samstag 17. April 2010, 19:25
von The_Net
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]

Verfasst: Samstag 17. April 2010, 19:50
von 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.

Verfasst: Samstag 17. April 2010, 21:49
von The_Net
Der Thread ist draussen, es funktioniert leider immer noch nicht.

Verfasst: Sonntag 18. April 2010, 20:37
von problembär
Schade.

Verfasst: Montag 19. April 2010, 08:38
von wuf
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: