Python Threading Modülü

mertkaplandar

Hectopat
Katılım
26 Aralık 2019
Mesajlar
343
Çözümler
2
Daha fazla  
Cinsiyet
Erkek
Arkadaşlar merhaba!
Python Tkinter ile bir uygulama geliştirmekteyim. Uygulamanın hem arayüzü hem de içerisindeki fonksiyonların çalışması için Threading modülünü kullanmaya karar verdim.
Öncelikle arayüz için bir fonksiyon oluşturarak başlangıç işlemlerini içerisine attım ve threading ile thread oluşturdum.
Diğer fonksiyonları da thread oluşturarak kaydettim fakat çalışmıyor.
Başlangıçta uygulama açılıyor fakat bir butona basınca çalışan fonksiyon arayüz fonksiyonunu engelliyor.
Acaba sorun nerede?
 
Fonkisyonlar için bir daha tanımlaman lazım diye biliyorum. Örneğin A ve B fonksiyonu var. Sen eğer gidip A fonksiyonunun içine arayüzün elementlerini, B fonksiyonları içine elementlerin görevlerini tanımlarsan çalışmaz çünkü diğer fonksiyonlardan ayrık çalışıyor. Bir de hata çıktılarını atar mısın?
 
Örnek kod:

Python:
from tkinter import *
import threading

def process():
    while True:
        print("Hello World")
processThread = threading.Thread(target=process)

def main():
    mainWindow = Tk()
    mainWindow.resizable(FALSE, FALSE)

    mainWindow.title("Text")
    mainWindow.geometry("500x250")

    recButton=Button(mainWindow)
    recButton.config(text="Button 1", font=("Arial", "13"), bg="red",fg="white", width="15", command=processThread.run)
    recButton.place(x=15,y=10)

    stopButton=Button(mainWindow)
    stopButton.config(text="Button 2", font=("Calibri", "13"), bg="orange",fg="white", width="15", command="")
    stopButton.place(x=15,y=55)

    mainWindow.mainloop()

mainThread = threading.Thread(target=main)
mainThread.start()

Bu kodu çalıştırıp Button1 isimli butona basındığınızda Hello World ekrana yazdırılıyor fakat bu sefer Button2 basılamaz hale gelerek ve uygulama yanıt vermiyor.
Benim istediğim Hello World ekrana yazdırılırken yani bir işlem yapılırken diğer işlemlerinde kullanıma açık olması.
 
Tamam sorunu anladım. Şöyle, process Thread'i kendini tek sefer çalıştırıp durduruyor. Hatta şöyle deneyebilirsin, iki kere çalıştırmayı dene Process'i. Hata alacaksın. Bu durumu aşmak için process Thread'ini tamamen öldürmen lazım.
 
Threading hakkında çok bir bilgim yok. Demek istediğim şu. 2 tane threadiniz var. Biri "main" biri "process". "main" Thread'i loopta olduğu için çökmeyecek. Düz loopta olan bir kod gibi. Ama main fonksiyonu loopta değil. Threading kütüphanesi bir Thread'i bir kere çalıştırır sonra bırakır. Yani siz "print("hello world")" yazdığınız zaman konsola "hello world" yazar ve program kapanır. Ama threading kütüphanesi konsola "hello world" yazdırıp programı kapatmıyor. Sizin yapmanız gereken programı yani o "main" threadini bir kere çalıştıktan sonra kapatmak.
@Linuxginar
 

Geri
Yukarı