Merhabalar, thread ile Tkinter programımı hızlandırmak istiyorum.
Temel problemim şu;
Bir buton aracılığıyla oluşturduğum frame’in gelmesi biraz uzun sürüyor, uzun sürmesinin sebebi bir web servisine bağlanıyor olmam. Bağlanmasam frame ve araçlar anında oluşuyor
MVC yapısı kullanıyorum ve web servisine controller adında başka bir sınıf üzerinden bağlanıyorum
Kodlar şu şekilde;
Frame içindeki kod
self.product_controller = ProductController()
Bu. da controller yapısı
class ProductController:
def __init__(self):
self.product_service = WebService()
# Arayüzden gelen bilgileri servise gönderiyorum
def add_product(self, *args, **kwargs):
self.product_service.add_product(*args, **kwargs)
Thread konusunda biraz acemiyim, Frame içindeki kodu bir fonksiyon içine alıp thread ile fonksiyonu çalıştırmayı denedim ama önceki gibi arayüzün oluşması için yine web servisine bağlanmayı bekledi.
Servisin bağlanma süresi 2-3 saniye felan. Ancak örneğin ürün ekleme alanımın araçları bu servise bağlı değil. Bildiğiniz text kutuları, dosya seçimi, butonlar felan normal bir arayüzden oluşuyor.
Thread, paralellik, async gibi şeyler kullanmadığımdan program düz mantık sırayla çalışıyor.
Yapmak istediğim, bu arayüzün program web servisine bağlanmadan oluşması. Arka planda web servisine bağlanması
Benim servisleri kullanabilmem için product_controller nesnesine ihtiyacım var.
Önce product_controller nesnesini Thread ile oluşturmak istedim ancak Thread oluştururken uygulanan yöntemle nasıl product_controller nesneği alacağımı bilemedim.
Burda yapmam gereken direkt ProductController sınıfını Thread olarak işlemekmiş. Kodu ise kaba taslak şu şekilde
from threading import Thread
class ProductController(Thread):
def __init__(self):
Thread.__init__(self)
self.product_service = None
# override etmemiz zorunlu, Thread bu fonksiyonla çalışmaya başlar
def run(self):
# servise buradan bağlanıyorum
# eğer __init__ içinde bağlanmaya çalışsaydım
# nesneyi oluştururken yine bir
# bağlanma süresi beklemek zorunda kalırdım
self.product_service = WebService()
Bu sınıfı ise istediğim yerde şu şekilde başlatıyorum
# örneğimi aldım ancak hala servise bağlanmadım
# çünkü run fonksiyonu ile Thread oluşuyor
product_controller = ProductController()
# run fonksiyonunu harekete geçirmek yani
# Thread'i başlatmak için
product_controller.start()
Bu işlemleri uyguladıktan sonra arayüzüm anında oluştu ve paralel bir şekilde web servisine bağlantım gerçekleşti