after() "сломался" (питон)
Писал игру с помощью ткинтер, когда начал делать улучшения столкнулся с проблемой, что второе улучшение должно приносить 1 монету в секунду, но если немножко покликать, то там гораздо больше чем 1 монетка в секунду.
Никак не могу решить эту проблему
from tkinter import *
# глобальные переменные
apg = 1 # сколько монет приносит один клик (зависит от апгрейдов)
apg1 = False # куплен ли первый апгрейд
apg2 = False # куплен ли второй апгрейд
clicks = 0 # клики (монеты)
# окно магазина
def open_shop():
# покупка апгрейда 1
def kt1():
global clicks
global apg1
if(clicks >= 100 and apg1 == False):
clicks -= 100
apg1 = True
money1['text'] = f'Монет: {clicks}'
elif(clicks < 100 and apg1 == False):
messagebox.showerror(title='Ошибка', message='У вас не хватает денег')
else:
messagebox.showerror(title='Ошибка', message='Вы уже купили этот апгрейд')
bt1['text'] = 'Куплено'
# покупка апгрейда 2
def kt2():
global clicks
global apg2
if(clicks >= 350 and apg2 == False):
clicks -= 350
apg2 = True
money1['text'] = f'Монет: {clicks}'
elif(clicks < 350 and apg2 == False):
messagebox.showerror(title='Ошибка', message='У вас не хватает денег')
else:
messagebox.showerror(title='Ошибка', message='Вы уже купили этот апгрейд')
bt2['text'] = 'Куплено'
# делаем второе окно
shop = Toplevel(root)
shop.title('Магазин')
shop.iconbitmap('Shopping-bag-blue-icon.ico')
shop.geometry('450x200+370+350')
shop.resizable(False, False)
shop['bg'] = '#696969'
money2 = Label(shop, text=f'Монет: {clicks}',
bg='#949399', fg='#1e2120'
)
# товары в магазине
t1 = Label(shop, text='клик = 2 монеты',
bg='#696969', fg='#ebebeb'
)
t2 = Label(shop, text='1сек = 1 монета',
bg='#696969', fg='#ebebeb'
)
# кнопки покупки товаров
bt1 = Button(shop, text='купить за 100 м.',
bg='#949399', fg='#1e2120',
activebackground='#949399', activeforeground='#1e2120',
command=kt1
)
bt2 = Button(shop, text='купить за 350 м.',
bg='#949399', fg='#1e2120',
activebackground='#949399', activeforeground='#1e2120',
command=kt2
)
# располагаем элементы на втором окне
t1.place(x=10, y=50)
t2.place(x=130, y=50)
bt1.place(x=10, y=70)
bt2.place(x=130, y=70)
money2.place(x=10, y=10)
# команда для кликов
def click():
global money
global clicks
click_prov()
clicks += apg
money1['text'] = f'Монет: {clicks}'
# апгрейд 2
def auto_click():
global clicks, money1
if(apg2 == True):
clicks += 1
money1['text'] = f'Монет: {clicks}'
root.after(1000, auto_click)
# апгрейд 1
def click_prov():
global apg
if(apg1 == True):
apg = 2
else:
apg = 1
if(apg2 == True):
auto_click()
# команда для чита
def cheat():
global clicks
clicks += 1000
# сновное окно
root = Tk()
root.geometry('500x400+345+250')
root['bg'] = '#9C9C9C'
root.title('Кликер')
root.iconbitmap('Apps-Mouse-icon.ico')
root.resizable(False, False)
# кнопка открытия магазина
shopb = Button(text='Maгазин',
command=open_shop,
bg='#b4b3ba', fg='#1e2120',
activebackground='#b4b3ba', activeforeground='#1e2120',
)
# кнопка для кликов
click = Button(text='кликни',
command=click,
width=10, height=2,
bg='white', fg='#1e2120',
activebackground='white', activeforeground='#1e2120',
font='Times 13'
)
# выводим сколько у пользователя монет
money1 = Label(root, text=f'Монет: {clicks}',
bg='#b4b3ba', fg='#1e2120'
)
# чит
cheat = Button(root, text='клик1000',
command=cheat
)
# распологаем все на экране
money1.place(x=10, y=10)
shopb.place(x=440, y=10)
click.place(x=197, y=165)
cheat.pack()
mainloop()
Ответы (1 шт):
Автор решения: Сергей Кох
→ Ссылка
У вас при включении функции auto_click(), она вызывается с помощью таймера и по клику, поэтому происходит сбой. Надо, чтоб после запуска таймера она работала только от него. Я сделал это так
# апгрейд 2
def auto_click():
global clicks, money1
# if (apg2 == True):
clicks += 1
money1['text'] = f'Монет: {clicks}'
root.after(1000, auto_click)
# апгрейд 1
def click_prov():
global apg, apg2
if (apg1 == True):
apg = 2
else:
apg = 1
if (apg2 == True):
auto_click()
apg2 = False