Tkinter Donma Sorunu

iyi günler pythona yeni başladım ama iqum yetmedi sleep time süresini arttırınca buton donuyo
yardımcı olabilir misiniz?

    var1 = tk.IntVar()
    def aa():

            if (var1.get() == 1):
                  pyauto.press('a')

                  time.sleep(10)
            
                  t1 = threading.Thread(target=aa)  #döngü
                  t1.start()
           elif (var1.get() ==0):
               time.sleep(0.1)


    btn = tk.Checkbutton(text='123', variable=var1 , onvalue=1, offvalue=0, command = aa)
    btn.pack()

hacı koddan hiç bişey anlamadım valla biraz sade yazarsan hata daha rahat anlaşılabilr. buton donuyo demişsin de buton yok ki ortada check button tik koyma için değil mi ? ayrıca donuyo dan kastın ne ? sorunu ve ne yapmak istediğini daha açık anlatırsan anlaşılır olur belkide sorun bende ben anlamadım vesselam.

Dediğim gibi yeni başladım o yüzden kod karışık olabilir mantığını anlamaya çalışıyorum.
hedefim butona bastığımda sonsuz döngüde 1 sn de bir ‘a’ harfine basan script yazmaktı yazdım da ama atıyorum time.sleep i 300 sn ye cıkardığım zaman buton donuyo uygulama yanıt vermiyo hatası alıyorrum.

check button kullanma nedenim butonun secili olup olmadığını görebilmekti. check button yüzünden oldu galiba

Tkinter da butona basıldığında bir kilitlenme oluyorsa muhtemelen sonsuz bir döngüye giriliyor ve döngü kırılmıyor demektir. Threading bilmediğim bir konu ama döngü kırılması gereken yerde kırılırsa sorununuz çözülür hocam. ‘Break’ komutu kullanılabilirse dene derim

1 Beğeni

Evet doğru. Çünkü sizin belirlediğiniz süre kadar yazdığınız yerde bir time.sleep() komutu varsa program buraya kadar okuyup 10 sn(belirlediğiniz süre) boyunca burada bekliyor. Daha sonra kaldığı yerden kodlar işlemeye devam ediyor. Donması da gayet doğal.

1 Beğeni
    from tkinter import *
    import time
    import pyautogui
    import threading

    p = Tk()
    def a():
    while True:
        time.sleep(3)
        pyautogui.press("a")

    def b():
        t1 = threading.Thread(target=a)
        t1.start()

    button = Checkbutton(p, command=b).pack()

    p.mainloop()
1 Beğeni

böle bişey mi istiyosun

@nickelangelo @Arif_RYG @BandoLero
vakit ayırıp cevap verdiğiniz çok teşekkürler.
@BandoLero yazdığı kod işe yaradı threading için 2 ayrı def kullanmak gerekiyormuş ben aynı zamanda döngü olarak kullandığım için ilk tıklamada time.sleep süresi kadar bekleyip yanıt vermiyor hatası alıyordum.
import tkinter as tk
import time
import pyautogui
import threading

root = tk.Tk()
var1 = tk.IntVar()
root.wm_attributes("-topmost", 1) 


def a():
    while True:
        if (var1.get() == 1):

        
            time.sleep(1)
            pyautogui.press("a")
        elif (var1.get() ==0):
               time.sleep(0.1)
               break
def b():
        t1 = threading.Thread(target=a)
        t1.start()

button = tk.Checkbutton(variable=var1,onvalue=1, offvalue=0,command=b).pack()

root.mainloop()

Tabi araya break komutu da eklemek lazımmış
Tekrar teşekkürler.

1 Beğeni

Çözüldü dedik ama ufak bir problem var. komutu durduramıyorum…
buton işaretli 30 sn sonra ‘a’ harfini yazdıracak işareti kaldırsam bile daha önceden tıkladığı için harfi yazdırmaya devam ediyor bunu after kullanarak iptal edebilir miyim?

thread dan dolayı durduramıyosun galiba :smiley: açıkcası thread nası duruyo bilmiyom ama şöle yapabilrsin.

from tkinter import *
import time
import pyautogui
import threading

p = Tk()
def a():
while True:
    time.sleep(3)
    pyautogui.press("a")
    if stop == 1:
        break

def b():
    global stop 0
    stop = 0
    t1 = threading.Thread(target=a)
    t1.start()

button = Checkbutton(p, command=b).pack()

def dur():
    global stop 1
    stop = 1
    
dur_button = Button(p, command=dur).pack()

p.mainloop()

after lada durduramazsın geciktirirsin sadece de thread nası duruyo bilen varsa yazsın :smiley:

En son baktığımda standart kütüphanede thread’ları dışarıdan durdurmanın genel ve kolay bir yolu yoktu.

1 Beğeni

Üstte yazdığım kod ile durması gerekiyo denemeden attım hata varsa düzeltirsin.

O kod çalışıyordur büyük ihtimalle, ben thread’ları dışarıdan kapatma hakkında konuşmuştum. Sizin kodunuz içeriden kapatıyor.

Hala yok :smiley:

Genel olarak yok. En “managed” sistemlerde bile goremedim. Olsa da ya deprecated, ya da bin tane warning’le beraber geliyor. Thread’i icerden kapatmak en mantiklisi.


Bir takim sistemler:
Java: Java Thread Primitive Deprecation
.NET: https://docs.microsoft.com/en-us/dotnet/api/system.threading.thread.abort
POSIX: pthread_setcancelstate(3) - Linux man page

3 Beğeni