timer tkinter

0

Moim obecnym projektem, a właściwie jego częścią jest timer. Moje założenie było takie: program pobiera dane od użytkownika, a czas ten który już się odmierza można zatrzymać podając hasło. Sam szkic chociaż nie do końca pełny jest tu:

import tkinter as tk
import time

def count_down():
   setTime = int(input("How much minutes You have: ")) * 60
   for t in range(setTime, -1, -1):
        sf = "{:02d}:{:02d}".format(*divmod(t, 60))
        time_str.set(sf)
        root.update()
        time.sleep(1)

def passwd():
    pwd = ""
    while pwd != "science":
        response = input("It isn\'t valid password. Try again.")
    print("Timer stopped. You can close program now.")
    print("\n\n Press ENTER to close this dialog")

root = tk.Tk()
root.title("Timer")
root.geometry("220x210")
root.resizable(0,0)

tk.Label(root, text="How many minutes You have:").pack()
setTime = tk.Entry(root, bd = 5).pack()

time_str = tk.StringVar()
label_font = ('sans', 40)
tk.Label(root, textvariable=time_str, font=label_font, bg='white',
         fg='blue', relief='raised', bd=3).pack(fill='x', padx=5, pady=5)

tk.Button(root, text="Count Start", command=count_down).pack()

tk.Label(root, text="Unlock").pack()
tk.Entry(root, bd = 5).pack()

root.mainloop()

Właściwie to widać zarys tego co bym chciał, męczę kod już kilka dni i nie potrafię kilku rzeczy. Mianowicie chciałbym obok widżetów Entry postawić buttona (z napisem OK) pobierającego dane wejściowe. W pierwszym przypadku pobiera int w drugim string. Na chwilę obecną podanie czasu do timera 'wyskakuje' z programu do shella, tam się wpisuje i program działa. Trochę naokoło ale póki co dobrze że działa - z tego jestem zadowolony. Czy moglibyście podpowiedzieć gdzie narobiłem błędów? A może mam nieodpowiednie podejście do tematu?

0

Użycie time.sleep w przypadku aplikacji okienkowych to nie jest dobra rzecz. Wywołanie time.sleep blokuje obsługę pętli zdarzeń zatem jeśli w trakcie takiego czekania chciałbyś obsługiwać inne rzeczy wówczas pojawią Ci się problemy.

Dlatego warto w tk zamiast time.sleep użyć: metody after tak jak tutaj: http://stackoverflow.com/a/2401181

Ponadto odnośnie tworzenia GUI w pythonie to biblioteka tk choć jest od zaraz możliwa do użycia po instalacji pythona to jej wygląd i sposób programowania pozostawia wiele do życzenia. Lepiej od razu korzystać z tego co sprawdzone i dobre: PySide lub PyQt4. Jednak wcześniej warto zrozumieć czym są klasy i na czym polega dziedziczenie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1