Вы изменили свой вопрос с тех пор, как я впервые прокомментировал, так что теперь вам нужно отслеживать все созданные Button
, потому что теперь вы хотите "уничтожить" больше, чем просто нажатие.В приведенном ниже коде они хранятся в новой глобальной переменной list
с именем buttons
.
Один виджет, отображаемый с помощью диспетчера геометрии place()
, может исчезнуть с помощью place_forget()
метод.Объединение этого с новым списком buttons
позволяет также влиять на видимость других в функции обратного вызова события '<Button-1>'
.
Ниже приведен ваш код с изменениями, показывающими, как это сделать.Обратите внимание, что я также оптимизировал несколько других вещей, а также сделал так, чтобы в целом он следовал рекомендациям PEP 8 - Руководство по стилю для кода Python чуть более точно.
import tkinter as tk
import random
window = tk.Tk()
window.title('The Game')
window.geometry('1000x850')
target = random.randint(1,10)
print('target:', target)
words = ["box" + str(j) for j in range(1, 11)]
a = 0
lives = 3
buttons = [] # Remember all Buttons.
for _ in words:
a += 1
def btn_press(event):
global lives
guess = event.widget['text']
lives -= 1
lives_rem.config(text='Lives remaining: ' + str(lives))
if guess == target:
print('you win')
window.destroy()
elif lives == 0:
print('you lose')
window.destroy()
elif guess > target:
# In this case, the button pressed and all of the higher ones
# should be destroyed.
event.widget.place_forget()
print('too high')
for btn in buttons:
if btn['text'] > guess:
btn.place_forget()
elif guess < target:
# In this case, the button pressed and all of the lower ones should
# be destroyed.
event.widget.place_forget() # Added MRM
print('too low')
for btn in buttons:
if btn['text'] < guess:
btn.place_forget()
btn = tk.Button(window, text=a)
btn.config(height=3, width=6)
btn.bind('<Button-1>', btn_press)
btn.place(x=a*70 - 50, y=25)
buttons.append(btn)
lives_rem = tk.Label(window, text="Lives remaining: " + str(lives), fg='red')
lives_rem.place(x=800, y=50)
window.mainloop()