मैं पाइथन ऐप्स के लिए जीयूआई बनाने के लिए टीकिंटर का उपयोग करने का तरीका सीखने की कोशिश कर रहा हूं। मैं एक पोमोडोरो टाइमर बनाने की कोशिश कर रहा हूं, हालांकि मुझे कुछ मुद्दों का सामना करना पड़ा है।

  1. मैं शेष समय के साथ लेबल को अद्यतन करने के लिए किसी अन्य फ़ंक्शन में while लूप चलाता हूं
  2. लूप में रहते हुए GUI अनुत्तरदायी (यह ठीक है)
  3. मैंने थोड़ा गुगल किया है, कुछ स्टैक ओवरफ्लो प्रश्नों के माध्यम से चला गया है और मैंने पाया है कि यह फ़ंक्शन रनिंग लूप एक अलग थ्रेड में चलाया जा सकता है।

इसने पहला मुद्दा हल किया, लेकिन एक और है

  1. रद्द करें बटन काम करता है, लेकिन मुझे क्लिक एनीमेशन नहीं दिख रहा है।
  2. टाइमर तुरंत नहीं रुकता।

क्या आप कृपया बता सकते हैं कि ऐसा क्यों हो रहा है और मैं अपने जीयूआई की प्रतिक्रिया को बढ़ाने के लिए क्या कर सकता हूं?

import time
import tkinter
import winsound
from tkinter.ttk import Combobox
import threading


def run_thread():
    global stop
    stop = False
    start_timer_btn.grab_release()
    threading.Thread(target=countdown()).start()


def stop_timer():
    global stop
    stop = True


def countdown():
    option = combo.get()
    if option == "25":
        seconds = 1500
    elif option == "15":
        seconds = 900
    # elif option == "2":
    #   countdown(300)
    # elif option == "3":
    #   countdown(1200)
    global stop
    while seconds and not stop:
        seconds -= 1
        print("minutes", seconds // 60, "seconds", seconds % 60)
        timer_label.configure(text=str(seconds // 60) + ":" + str(seconds % 60))
        window.update()
        time.sleep(1)
    winsound.PlaySound("SystemExit", winsound.SND_ALIAS)


stop = False
window = tkinter.Tk()
window.title("POMODORO Timer")
window.geometry("300x250")

combo = tkinter.ttk.Combobox(window)
combo["values"] = [25, 15]
combo.current(1)

timer_label = tkinter.Label(window, text="00:00")
start_timer_btn = tkinter.Button(window, text="Start timer", bg="green", fg="white", command=run_thread)
stop_timer_btn = tkinter.Button(window, text="Stop timer", bg="red", fg="white", command=stop_timer)

combo.grid(row=1, column=0)
start_timer_btn.grid(row=1, column=1)
stop_timer_btn.grid(row=1, column=2)
timer_label.grid(row=0, column=2, columnspan=3)

window.mainloop()
0
Piosipov 18 जून 2020, 21:45

1 उत्तर

सबसे बढ़िया उत्तर

आमतौर पर नींद () का उपयोग करने के लिए हतोत्साहित किया जाता है, खासकर जब मल्टीथ्रेडिंग। नींद कुछ समय 'कम से कम' प्रतीक्षा करती है, लेकिन अन्य प्रक्रियाओं के कारण कोड निष्पादन पुनरारंभ नहीं हो सकता है। दस्तावेज़ीकरण यही कहता है:

दिए गए सेकंड की संख्या के लिए कॉलिंग थ्रेड के निष्पादन को निलंबित करें। अधिक सटीक नींद के समय को इंगित करने के लिए तर्क एक फ़्लोटिंग पॉइंट नंबर हो सकता है। वास्तविक निलंबन समय अनुरोध किए गए समय से कम हो सकता है क्योंकि कोई भी पकड़ा गया संकेत उस सिग्नल के कैचिंग रूटीन के निष्पादन के बाद स्लीप () को समाप्त कर देगा। साथ ही, सिस्टम में अन्य गतिविधि के शेड्यूलिंग के कारण निलंबन का समय एक मनमानी राशि के अनुरोध से अधिक हो सकता है।

संस्करण 3.5 में बदला गया: फ़ंक्शन अब कम से कम सेकेंड सोता है, भले ही सिग्नल द्वारा नींद बाधित हो, सिवाय इसके कि सिग्नल हैंडलर अपवाद उठाता है (तर्क के लिए पीईपी 475 देखें)।

विकल्प .after() विधि का उपयोग करना है। यहां कुछ लिंक दिए गए हैं:

टिंकर और समय। सो जाओ

टिंकर का उपयोग करके टाइमर कैसे बनाएं?

0
Ronald 18 जून 2020, 19:01