python tkinter içindeki text'e while döngüsü yazı yazdırmak

from tkinter import *
import tkinter as tk
import time
#1
pencere = tk.Tk()
pencere.geometry('1920x1080')
pencere.title("Latin")
pencere['bg']='black'
#2
yazi = Text(pencere)
yazi.pack()
yazi.config(bg="black",fg="green",font=("COURIER",20))
yazi.place(x=450,y=0 , width = 1080, height = 680)
#3
def yukle():
    while True:
            time.sleep(0.2)

            nokta = """."""
            yazi.insert(tk.END, nokta)
#4
buton2=Button(pencere,text="{Yükle} ..", command=yukle)
buton2.pack()
buton2.config(bg="black",fg="red" ,font=("COURIER",20))                  
buton2.place(x=450,y=700)
#5
pencere.mainloop()

bu kodları kullandığım dosyamda “buton2” adı altında tanımlanmış butonumun kullanımından sonra ;

{yazi=Text(pencere)} tanımlısında 0.2 sn’de birer
{nokta = “.”} görmek isterken

birkaç sn beklemenin sonucu olarak “yanıt vermiyor” cevabını alınıyorum.

belirttiğim gibi , while döngüsü ile buton2’nin 0.2sn’de bir yazi text’ime “.” eklemesini istiyorum.

yukle fonksiyonu çağrılınca sonsuz bir döngü oluşuyor, bu nedenle tkinter’de herhangi bir işlem yapılamıyor. Tıpkı aşağıdaki örnekte olduğu gibi:

import tkinter as tk


def f():
    n = 0
    while True:
        print(n)
        n += 1


root = tk.Tk()

button = tk.Button(
    master=root, 
    text="Click Me", 
    command=f
)
button.pack()

root.mainloop()

Birbirini engellemeyen işlemler oluşturmak için farklı yollar izleyebilirsiniz:

  1. threading kullanabilirsiniz:
import threading
import tkinter as tk


def f():
    n = 0
    while True:
        print(n)
        n += 1


root = tk.Tk()

button = tk.Button(
    master=root, 
    text="Click Me", 
    command=threading.Thread(target=f, daemon=True).start
)
button.pack()

root.mainloop()
  1. asyncio kullanabilirsiniz:
import asyncio
import tkinter as tk


async def mainloop(root):
    while True:
        try:
            root.update()
            await asyncio.sleep(0)
        except tk.TclError:
            return


async def f():
    n = 0
    while True:
        print(n)
        n += 1
        await asyncio.sleep(0)


root = tk.Tk()

button = tk.Button(
    master=root,
    text="Click Me",
    command=lambda: asyncio.create_task(f())
)
button.pack()

asyncio.run(mainloop(root))
1 Beğeni