[ÇÖZÜLDÜ] Thread ile Tkinter programını hızlandırma

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.

İstek attığınız servisin response süresi uzunsa hiçbir şekilde hızlandıramazsınız. Servisin response süresini ölçün bence

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ı

tkinter çok çok az kullandığımdan tam olarak nasıl yapılacağını bilmiyorum fakat threading ile basit bir request atma şöyle oluyor basitçe

import requests
import threading

response = None
def do_request():
    r = requests.get("https://www.example.com")
    response = r.text

t = threading.Thread(target=do_request)
t.start()

Sanırım sorunu çözdüm. Şöyle;

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