#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()