Основная проблема заключается в использовании sleep()
.Сон в tkinter заставит весь экземпляр зависнуть и работать не так, как вы ожидаете.Вместо этого вы можете использовать after()
.
Также вы дважды импортируете tkinter.Удалите импорт из tkinter.
Тем не менее, нам нужно добавить новую функцию и изменить пару строк в ваших функциях.
Я добавил функцию с именем normalize_button()
, которая занимает 1аргумент для имени кнопки.Это используется в тандеме с методом after()
для обновления кнопок через 2 секунды.
Чтобы ответить на ваш вопрос в комментариях:
Функция normalize_button()
вызывается методом after()
через 2 секунды.Метод проверяет передаваемую ему строку и обновляет кнопку, основываясь на этой строке.Вы можете фактически сделать то же самое с вашим методом show и иметь только один метод, чтобы обновить все кнопки, если хотите.Это делает вещи немного чище и следует за СУХОЙ (не повторяйте себя) стиль PEP8.
Посмотрите на код ниже.
import tkinter as tk
from random import shuffle
fenetre = tk.Tk()
fenetre['bg']='black'
fenetre.geometry("1152x768")
color = ["red", "green", "yellow"]
shuffle(color)
frameGauche = tk.Frame(width=200, height=600, bg='pink')
frameGauche.grid(row=0, column=0, padx=10, pady=10)
frameDroite = tk.Frame(width=700, height=700, bg='grey')
frameDroite.grid(row=0, column=1, padx=10, pady=10)
portegauche=tk.Frame(frameDroite, width=200,
height=600,bg='white',bd=5,relief='groove')
portegauche.grid(row=0, column=0, padx=5, pady=5)
portemilieu=tk.Frame(frameDroite, width=200,
height=600,bg='white',bd=5,relief='groove')
portemilieu.grid(row=0, column=1, padx=5, pady=5)
portedroite=tk.Frame(frameDroite, width=200,
height=600,bg='white',bd=5,relief='groove')
portedroite.grid(row=0, column=2, padx=5, pady=5)
def normalize_button(btn_name):
print(btn_name)
if btn_name == "b1":
bouton1['state']='normal'
if btn_name == "b2":
bouton2['state']='normal'
if btn_name == "b3":
bouton3['state']='normal'
def show1():
canvas1.grid(row=0, column=1)
bouton2['state']='disabled'
bouton3['state']='disabled'
fenetre.after(2000, normalize_button, "b2")
fenetre.after(2000, normalize_button, "b3")
fenetre.after(2000, canvas1.grid_forget)
def show2():
canvas2.grid(row=0, column=2)
bouton1['state']='disabled'
bouton3['state']='disabled'
fenetre.after(2000, normalize_button, "b1")
fenetre.after(2000, normalize_button, "b3")
fenetre.after(2000, canvas2.grid_forget)
def show3():
canvas3.grid(row=0, column=3)
bouton2['state']='disabled'
bouton1['state']='disabled'
fenetre.after(2000, normalize_button, "b2")
fenetre.after(2000, normalize_button, "b1")
fenetre.after(2000, canvas3.grid_forget)
canvas1 = tk.Canvas(portegauche,width=200, height=600, bg='white')
c1 = canvas1.create_oval((60,280), (140,340), width=1, outline="black", fill=color[0])
canvas1.grid_forget()
canvas2 = tk.Canvas(portemilieu,width=200, height=600, bg='white')
c2 = canvas2.create_oval((60,280), (140,340), width=1, outline="black", fill=color[1])
canvas2.grid_forget()
canvas3 = tk.Canvas(portedroite,width=200, height=600, bg='white')
c3 = canvas3.create_oval((60,280), (140,340), width=1, outline="black", fill=color[2])
canvas3.grid_forget()
def recommencer():
canvas1.grid_remove()
canvas2.grid_remove()
canvas3.grid_remove()
shuffle(color)
canvas1.create_oval((60,280), (140,340), width=1, outline="black", fill=color[0])
canvas2.create_oval((60,280), (140,340), width=1, outline="black", fill=color[1])
canvas3.create_oval((60,280), (140,340), width=1, outline="black", fill=color[2])
bouton1['state']='normal'
bouton2['state']='normal'
bouton3['state']='normal'
boutonR = tk.Button(frameGauche, text='Recommencer',command=recommencer)
boutonR.grid(row=0, column=0, padx=50, pady=50)
bouton1=tk.Button(frameDroite, text= 'Ouvrir',command=show1)
bouton1.grid(row=1, column=0)
bouton2=tk.Button(frameDroite, text= 'Ouvrir',command=show2)
bouton2.grid(row=1, column=1)
bouton3=tk.Button(frameDroite, text= 'Ouvrir',command=show3)
bouton3.grid(row=1, column=2)
fenetre.mainloop()