Зависание интерфейса

Когда запускаю программу накапливаю клики и нажимаю авто клики программа намертво зависает.
Причём в консоли результат пишется.

Как я понял ей не понравился цикл while.

Можно это как-то исправить?

from tkinter import *
import time
import math

tk = Tk()

tk['bg'] = 'orange'
tk.title('кликер')
tk.geometry('800x600')

tk.resizable(width=False, height=False)

clicks = 0

def click():
    global clicks
    clicks += 1
    print(clicks)

def c100():
    global clicks
    if clicks >= 5:
        clicks -= 5
        while 1:
            clicks += 0.3
            print(round(clicks,1))
            time.sleep(1)
    elif clicks < 5:
        print("мало кликов")

canvas = Canvas(tk, height=300, width=250   )
canvas.pack()

frame = Frame(tk, bg='red')
frame.place(relx=0.06, rely=0.06, width=700, height=500)

title = Label(frame, text='кликер', bg='yellow', font=('Comic Sans MS', 40))
title.pack()
btn = Button(frame, text='клик', bg='blue', font=('Comic Sans MS', 20), width=30, height=1, command=click, activebackground='dark blue', activeforeground='white')
btn.pack()
title1.place(x=5, y=10)
btn2 = Button(frame, text='Авто клики\nЦена:5', bg='lime', font=('Comic Sans MS', 15), command=c100)
btn2.place(x=30, y=160)



tk.mainloop()

Ответы (1 шт):

Автор решения: S. Nick

Я не понимаю логику вашей функции c100().

Но вам надо запомнить что:

  • while 1: - блокирует интерфейс;
  • time.sleep(1) - блокирует интерфейс;
  • вам надо использовать метод after().

from tkinter import *
import time
import math


tk = Tk()

tk['bg'] = 'orange'
tk.title('кликер')
tk.geometry('800x600')

tk.resizable(width=False, height=False)

clicks = 0

def click():
    global clicks
    clicks += 1
    print(f'clicks = {clicks}')

def c100(fl=1):
    global clicks
    #print(f'def c100(): {clicks}') #
    
    '''   попробуйие так
    if fl:
    
        if clicks >= 5:
            clicks -= 5
            canvas.after(1000, lambda: c100(0))            
        elif clicks < 5:
            print("мало кликов")    
    else:
        clicks += 0.3
        print(round(clicks, 1))
        canvas.after(1000, lambda: c100(0)) 
        
    '''    

# мне показалось ято так:    
    if clicks >= 5 and fl:
        clicks -= 5 if fl else 0
#        while 1:
        clicks += 0.3
        print(round(clicks, 1))

#            time.sleep(1)
        canvas.after(1000, lambda: c100(0))
    if not fl:
        clicks += 0.3
        print(round(clicks, 1))
        canvas.after(1000, lambda: c100(0))    
            
    elif clicks < 5:
        print("мало кликов")    
    
    
    
    '''     попробуйие так
    if clicks >= 5:
        clicks -= 5
#        while 1:
        clicks += 0.3
        print(round(clicks, 1))

#            time.sleep(1)
        canvas.after(1000, c100)
            
    elif clicks < 5:
        print("мало кликов")
    '''

canvas = Canvas(tk, height=300, width=250)
canvas.pack()

frame = Frame(tk, bg='red')
frame.place(relx=0.06, rely=0.06, width=700, height=500)

title = Label(frame, text='кликер', bg='yellow', font=('Comic Sans MS', 40))
title.pack()

btn = Button(
    frame, 
    text='клик', 
    bg='blue', font=('Comic Sans MS', 20), 
    width=30, height=1, 
    command=click, 
    activebackground='dark blue', activeforeground='white'
)
btn.pack()

#title1.place(x=5, y=10)

btn2 = Button(frame, text='Авто клики\nЦена:5', bg='lime', font=('Comic Sans MS', 15), command=c100)
btn2.place(x=30, y=160)

tk.mainloop()

введите сюда описание изображения

→ Ссылка