Tkinter Combobox İle Sonsuz Döngü Başlatma Durdurma

Merhaba,

Konuyu şu şekilde özetleyebilirim:

Kodunu aşağıda ilettiğim yapı ile Combox’tan bir seçimi yapınca her saniye random sayı üreterek text olarak yazdırıyorum yalnız combobox üzerinden mevcuttaki seçim tekrar seçilirse bişey yapmamasını yerine başka bir seçim yapınca ise önce mevcut döngüyü sonlandırmasını sonra ise bu yeni seçimin döngüsünü başlatmasını istiyorum after_cancel ile yapıyı durduruyorum ama combobox’ın event’i <> ile durdurduğum bu yapıyı yeniden başlatamadım ve mevcut seçim ise bişey yapma kısmını henüz eklemediğim kod aşağıdadır.
Teşekkürler şimdiden yardımınız için.Kod kolay anlaşılır olması için örnek amaçlı bu şekilde paylaşıldı asıl kullanım alanında işlevsel bir özelliğe sahip olacak saçma görünmesine aldırış etmeyin lütfen:)

import tkinter as tk
from tkinter import ttk
import time
import random


class model(tk.Tk):
    def __init__(self):
        super().__init__()
        self.title('Yeni Pencere')
        self.resizable(0, 0)
        self.geometry('500x200')
        self['bg'] = 'black'
        self.style = ttk.Style(self)
        self.style.configure(
            'TLabel',
            background='white',
            foreground='red')

        # label
        self.label = ttk.Label(
            self,
            text="0",
            font=('Digital-7', 40))
        self.label.pack(expand=True)
      
        # Combobox creation
        self.n = tk.StringVar()
        self.monthchoosen = ttk.Combobox(self, width = 27, textvariable = self.n)
  
        # Adding combobox drop down list
        self.monthchoosen['values'] = (' January', ' February',' March',' April',' May',' June')
        self.monthchoosen.pack()
        self.monthchoosen.bind("<<ComboboxSelected>>",self.start_func)

    def start_func(self):
        # schedule an update every 1 second
        self.monthchoosen.after(1000, self.update)

    def random_func(self):
        return random.randint(-20,5000)
      
    def update(self):
          """ update the label every 1 second """

          self.label.configure(text=self.random_func())
          self.monthchoosen.after(1000, self.update)

if __name__ == "__main__":
    deneme = model()
    deneme.mainloop()

def start_func(self):

fonksiyonu 1 tane daha parametre almalı olayın aktarıldığı parametre atıyorum o parametrenin adı event olsun.

def start_func(self,event):

Böyle bir şey yaptık şimdi event.widget.get() diyerek seçilen ögenin adını bulabiliriz bunu da değişkenine atalım ki öncekiyle aynı mı değil mi diye kontrol edebilelim. Değişkenin adını ben secilen koyacağım siz istediğinizi koyabilirsiniz.
initin içine bunu yazdım.

        self.secilen = ""

Önceki seçilenle bu seçilen aynı mı karşılaştıralım.

    def start_func(self,event):
        if self.secilen == event.widget.get():
            return None
        self.monthchoosen.after(1000, self.update)
        self.secilen = event.widget.get()

Eğer öncekiyle aynıysa return None fonksiyonu sonlandırıyor değilse yeniden after çalışıyor.

Bu arada tkintera uzağım o yüzden pek bilmiyorum bu afterı tekrar başlatırsak önceki zaten durmuş olmuyor mu?

1 Beğeni

Verdiğiniz yanıt için öncelikle çok teşekkür ederim.

Bu arada tkintera uzağım o yüzden pek bilmiyorum bu afterı tekrar başlatırsak önceki zaten durmuş olmuyor mu?

Bu sorunuza yanıt olarak after_cancel yapmadığınız zaman arka planda eski döngü çalışmaya devam ediyor ve yeni döngü ile eğer GUI üzerinde konumlandırma aynı yapıldı ise üzerine denk geldiği için arka plandaki eski döngüyü maskelemiş oluyor ki pekte istenecek birşey değil bu durum diye düşünüyorum.

Tekrardan teşekkürler.