Threadler ile ilgili bir sorunum var

from ttkbootstrap.constants import *
import tkinter as tk
import ttkbootstrap as ttk
import threading
import time
import random

sure = 10
can = 3
puan = 0
soru = ""
banka = [range(2,21),"*+/-","<>"]
kosul = True

def trt():
    trt = threading.Thread(target=zamanlama)
    trt.start()

def yeni_soru():
    global soru,zaman
    trt()
    soru = "{} {} {} {} {} {} {}".format(random.choice(banka[0]),random.choice(banka[1]),random.choice(banka[0]),
                                         random.choice(banka[2]),random.choice(banka[0]),random.choice(banka[1]),random.choice(banka[0]))
    zaman["subtext"] = soru 

def dogrula():
    global can,puan
    if eval(soru) is True:
        puan += 10
    else:
        can -= 1
    can_lbl["text"] = can
    yeni_soru()

def yanlisla():
    global can,puan,sure
    if eval(soru) is False:
        puan += 10
    else:
        can -= 1
    can_lbl["text"] = can
    yeni_soru()

def zamanlama():
    sure = 10
    while sure > 0:
        sure -= 1
        yuzde = sure * 10
        print(sure)
        zaman["amountused"] = yuzde
        time.sleep(1)
    can -= 1
    can_lbl["text"] = can
    
        
pencere = tk.Tk()
stil = ttk.Style("vapor")
pencere.geometry("600x350")
kucuk_btn = ttk.Button(text="Yanlış",bootstyle=(DANGER,OUTLINE),command=yanlisla)
kucuk_btn.place(x=300,y=300)
zaman = ttk.Meter(metersize=180,bootstyle=DANGER)
zaman.pack(side=(TOP),pady=10)
can_lbl = ttk.Label(text="Can:",bootstyle=(INFO))
can_lbl.pack(side=LEFT)
buyuk_btn = ttk.Button(text="Doğru",bootstyle=(SUCCESS,OUTLINE),command=dogrula)
buyuk_btn.place(x=200,y=300)
yeni_soru()
pencere.resizable(0,0)
pencere.mainloop()

Yukarıdaki kodda doğru ya da yanlış butonuna bastığımda bir thread bitmeden diğeri başlıyor. Bu da zamanlayıcının erkenden bitmesine sebep oluyor. Bir threadi başlatırken öncekini bitirmenin bir yolu var mıdır? Veya daha kolay bir çözüm yolu geliyor mu aklınıza? Teşekkürler.

Merhaba,

Birden fazla yolu var gibi görünüyor. Thread lock konusuna bir bakabilirsin.

Ya da Python thread’deki Timer class’ını kullanabilirsin.

Bu arada bir şey daha eklemek istiyorum. Ben zamanlama fonksiyonunun algoritma tasarımını pek beğenmedim açıkçası. Yerine şöyle bir mekanizma koyulabilir belki.

def loop:
    while 1:
        if not iptal_edildi_mi():
            continue
        if not soru_cevaplandi_mi():
            continue
        if not zaman_bitti_mi():
            continue
        sonraki_soru()

Belki benim pseudo kod da berbat olabilir. (while canımı sıkmakta.)

İyi günler dilerim

1 Beğeni
1 Beğeni