Как я могу создать интерактивную метку с помощью Tkinter в Python

#python-3.x #tkinter

#python-3.x #tkinter

Вопрос:

Я пытаюсь создать idlegame с помощью Tkinter, но я не знаю, как сохранить метку, которая показывает количество денег, обновляющееся.

Я попытался обновить метку с помощью цикла while, но программа не загрузила окно без mainloop () должным образом. Я поместил w.mainloop() в цикл, но теперь он больше не повторяется. (w= Tk())

 def money():
    File=open('./assets/save/money.txt','r')
    moneynow=File.read()
    File.close()
    try:
        if int(moneynow) >> 0 or int(moneynow) == 0:
            do='nothing'
    except:
        File=open('./assets/save/money.txt','w')
        File.write('0')
        File.close()
        w.destroy()

text1=Label(w,text='You currently have',bg='#CEE3F6',font=('arial black',10),fg='#820038')
text1.place(x=250,y=5)
text2=Label(w,text='$',bg='#CEE3F6',font=('arial black',10),fg='#820038')
text2.place(x=298,y=70)


#Interactive GUI
while True:
    money()
    File=open('./assets/save/money.txt','r')
    moneyamount=File.read()
    File.close()
    moneydisplay=Label(w,text=moneyamount,bg='#CEE3F6',font=('impact',40),fg='#FFCA4F',pady=-3)
    moneydisplay.place(x=289,y=25,height=45)
    w.mainloop()
  

Ожидаемый результат: цикл продолжается.

Фактический результат: цикл не повторяется, поскольку компилятор останавливается после w.mainloop().

Комментарии:

1. mainloop — это цикл, и он выполняется все время, пока вы не закроете окно. Вы можете использовать w.after(time_in_ms, function_name) to run function_name()` через time_in_ms миллисекунды, и она может обновить метку и снова запустить after(...)

2. >> это битовая операция, а не сравнение. Вам нужно >= вместо > и ==

3. В вашем случае простой способ — изменить w.mainloop() на w.update_idletasks() . Другое предложение заключается в создании moneydisplay один раз в цикле while.

Ответ №1:

mainloop это цикл, который выполняется все время, пока вы не закроете окно. Вы должны использовать after(time, function_name) для отправки его в mainloop , и он запустит его после выбранного времени — таким образом, он будет повторять функцию, как в собственном цикле.

 from tkinter import *

def update_money():
    with open('./assets/save/money.txt') as f:
        moneynow = f.read()

    try:
        if int(moneynow) < 0:
            with open('./assets/save/money.txt', 'w') as f:
                f.write('0')
        w.destroy()
    except:
        print('Cant convert')
        w.destroy()


    moneydisplay['text'] = moneynowe    
    w.after(1000, update_money) # run again after 1000ms (1s)

# --- main --  

w = Tk()

text1 = Label(w, text='You currently have')
text1.pack()

text2 = Label(w, text='$')
text2.pack()

moneydisplay = Label(w, text="") # empty label, I will put text later
moneydisplay.pack()

update_money() # put text first time

w.mainloop()