Selenium + Tkinter + Stop Button

Selamlar, forumda yeniyim pythonda öğrenmek istediğim bir şey var.

Tkinter ile start butonu yaptım ve ve bu botumu çalıştırıyor ve bu botumun yaptığı işlem 20 dakika srüyor.
Fakat ben bunu stop button ile durdurmak istiyorum. overflow da bir kaç örnek buldum fakat bunlar fonksiyonu döngü sonunda kontrol ediyor. Benim döngüm 20 dakikada bitiyor.
Selenium botumu fonksiyon olarak tanımladım. Stop buttona basıgımda bu düngüyü durdurması veya return etmesi mümkünmüdür ?

Evet mümkün. Mesela bir tane değişken tanımlarsınız. stop düğmesi bu değişkenin değerini değiştirir ve döngü de bu değişkenin değişmesi durumunda sonlanabilir.

1 Beğeni

örnek bir kod atar mısınız rica etsem. @dildeolupbiten

Tabi, aşağıdaki kodlara bakın.

import tkinter as tk

degisken = True


def start(master, t):
    global degisken
    if degisken:
        print("Çalışıyor")
        master.after(t * 1000, lambda: start(master, t))
    else:
        degisken = True
        
        
def stop():
    global degisken
    degisken = False
    print("Durdu")
    
    
def main():
    root = tk.Tk()
    start_button = tk.Button(
        master=root, text="Start", command=lambda: start(root, 1)
    )
    start_button.pack()
    stop_button = tk.Button(master=root, text="Stop", command=stop)
    stop_button.pack()
    root.mainloop()
    
    
main()

Merhaba.

O zaman bu bot threading mi kullanıyor?

Hayır bir buton command ile farklı bir fonksiyonu cagırıyor.

burada start fonksiyonunun altına bir selenium işlemi yapınca o buton donuyor. Threading ile o işlemi yaptırıca da durdur fonksiyonu işlev görmüyor.

after metodunu kullanıyor musunuz? Kullanıyorsanız, ilk parametresi 0 değil mi yoksa?

import tkinter as tk

degisken = True


def start(master, t):
    global degisken
    if degisken:
        master.after(t * 1000, lambda: start(master, t))
        from selenium import webdriver
        chrome = webdriver.Chrome()
        chrome.get("https://yazbel.com")
        import time
        time.sleep(20)
    else:
        degisken = True


def stop():
    global degisken
    degisken = False
    print("Durdu")


def main():
    root = tk.Tk()
    start_button = tk.Button(
        master=root, text="Start", command=lambda: start(root, 1)
    )
    start_button.pack()
    stop_button = tk.Button(master=root, text="Stop", command=stop)
    stop_button.pack()
    root.mainloop()


main()

böyle kullanıyorum acaba yanlışmı düzenledim.

master.after'ın ilk parametresini 0 yapın.

1 Beğeni

yaptım fakat tekrar basarısız oldu.

Normal, arayüz hiç update edilmiyor. Bu yüzden threading veya multiprocessing kullanmanız lazım diye düşünüyorum.


Sizin selenium ile alakalı fonksiyonunuzu görebilir miyiz?

Bu arada kodlarınızı aşağıdaki gibi değiştirmeniz, start fonksiyonuna tekrar tekrar basıldığı zaman bir kaç defa çalışmasını önleyecektir.

import tkinter as tk

degisken = False


def process(master, t):
    if degisken:
        print("Çalışıyor")
        master.after(1 * 1000, lambda: process(master, t))


def start(master, t, start_button):
    global degisken
    if not degisken:
        start_button.configure(command=lambda: None)
        print("Başladı")
        degisken = True
        process(master, t)
        
        
def stop(master, t, start_button):
    global degisken
    if degisken:
        start_button.configure(
            command=lambda: start(master, t, start_button)
        )
        print("Durdu")
        degisken = False   
        process(master, t)
        
    
def main():
    root = tk.Tk()
    start_button = tk.Button(
        master=root, 
        text="Start", 
        command=lambda: start(root, 1, start_button)
    )
    start_button.pack()
    stop_button = tk.Button(
        master=root, 
        text="Stop", 
        command=lambda: stop(root, 1, start_button)
    )
    stop_button.pack()
    root.mainloop()
    
    
main()

Butona tıkladığınızda döngüden çıkmak isterseniz break kodunu fonksiyona ekleyebilirsiniz