Python3 Tkinter Zamanlayıcı, Geri Sayım Uygulaması Yapmak, Countdown App, Timer: time, threading, tkinter

Python 3'te girdiğimiz saniye kadar geri sayan ve saydığı sırada bunu her bir saniyede bir defa ekrana yazan bir program yazacağız. Ve nesne yönelimli programlama stilini kullanacağız.


Gerekli Kütüphaneleri Projeye Dahil etmek

Time, Threading ve Tkinter

from tkinter import *
import time
import threading

Sınıfımızı Oluşturalım

import time
import threading
from tkinter import *
class Main:
    def __init__(self, master):
        self.master = master
        master.title('Zamanlayıcı')

        self.secondL = Label(master, text='saniye:')
        self.secondL.grid(row = 0, column= 0, pady=10, padx=10)
        self.secondE = Entry(master)
        self.secondE.grid(row = 0, column=1, padx=10)

        self.startButton = Button(master, text='başlat', command=self.threadStartTimer)
        self.startButton.grid(row=1, column=1, sticky = EW, padx=10)

        self.stopButton = Button(master, text='durdur', command=self.threadStopTimer)
        self.stopButton.grid(row=2, column=1, sticky = EW, padx=10)
        self.stopButton['state'] = 'disabled'

Burada uygulamamıza Tkinter kullanarak arayüz ekledik. Bir labelimiz, bir entrymiz, iki tane de butonumuz var. Butonlarımızdan bir tanesi geri sayımı başlatmak, bir tanesi de geri sayımı durdurmak için var oldular. Yalnız durdur butonumuzu başlangıçta kullanışsız hale getiriyoruz. Onu sadece geri sayım sırasında aktifleştireceğiz.

Method: Başlama

    def threadStartTimer(self):
        self.startedThread = threading.Thread(target=self.startTimer)
        self.startedThread.start()

    def startTimer(self):
        self.deadCounting = False
        second = int(self.secondE.get())
        now = time.time()
        future = now + second
        while time.time() <= future and not self.deadCounting:
            self.startButton['state'] = 'disabled'
            self.stopButton['state'] = 'active'
            self.secondE.delete(0, END)
            self.secondE.insert(0, int(future - time.time()))
            if int(future - time.time()) == 0:
                self.startButton['state'] = 'active'
                self.stopButton['state'] = 'disabled'
            time.sleep(.1)

Thread kullanmamızın asıl amacı ikinci methodda yazdığımız while döngüsü çalışırken bir yandan da Tkinter penceremizin güncellenmesi. Eğer Thread kullanmazsak Tkinter penceremez while döngüsü bitene kadar yenilenmeyecek çünkü sırasıyla yaptırıyor olacaktık. İkinci metodda self.deadCounting boolean'ı, geri sayımı durdurmak için orada.

Method: Durdurma

    def threadStopTimer(self):
        self.deadCounting = True
        self.stopButton['state'] = 'disabled'
        self.startButton['state'] = 'active'

self.deadCounting'i True yaparak Thread'da çalışan while döngüsünü kırdık. Geri sayımı bitirdiğimizden dolayı durdurma butonumuzu deaktif, başlat butonunu da aktif hale getiriyoruz. 

Kodun Son Hali

import time
import threading
from tkinter import *
class Main:
    def __init__(self, master):
        self.master = master
        master.title('Zamanlayıcı')

        self.secondL = Label(master, text='saniye:')
        self.secondL.grid(row = 0, column= 0, pady=10, padx=10)
        self.secondE = Entry(master)
        self.secondE.grid(row = 0, column=1, padx=10)

        self.startButton = Button(master, text='başlat', command=self.threadStartTimer)
        self.startButton.grid(row=1, column=1, sticky = EW, padx=10)

        self.stopButton = Button(master, text='durdur', command=self.threadStopTimer)
        self.stopButton.grid(row=2, column=1, sticky = EW, padx=10)
        self.stopButton['state'] = 'disabled'

        self.adButton = Button(master, text='kodlardan bir blog')
        self.adButton.grid(row=3, column=1, sticky= EW, padx=10,pady=10)

    def threadStartTimer(self):
        self.startedThread = threading.Thread(target=self.startTimer)
        self.startedThread.start()

    def startTimer(self):
        self.deadCounting = False
        second = int(self.secondE.get())
        now = time.time()
        future = now + second
        while time.time() <= future and not self.deadCounting:
            self.startButton['state'] = 'disabled'
            self.stopButton['state'] = 'active'
            self.secondE.delete(0, END)
            self.secondE.insert(0, int(future - time.time()))
            if int(future - time.time()) == 0:
                self.startButton['state'] = 'active'
                self.stopButton['state'] = 'disabled'
            time.sleep(.1)

    def threadStopTimer(self):
        self.deadCounting = True
        self.stopButton['state'] = 'disabled'
        self.startButton['state'] = 'active'

root = Tk()
main = Main(root)
root.mainloop()


Yorum Gönder

0 Yorumlar