У меня проблемы с базовым графическим интерфейсом, который я пытаюсь создать. Цель состоит в том, чтобы иметь кнопку, которая генерирует определенное количество плиток на основе числа в поле прокрутки. Я заставил его работать в основном, и нажатие кнопки «Создать» сгенерирует новое количество плиток, если значение спин-бокса будет изменено на большее, как и ожидалось, однако, если я изменю спин-бокс на меньшее число, старыйпоколение плитки можно увидеть за новым. Я ожидаю, что canvas.delete('all')
возьмет из предыдущих объектов холста.
Я пытался решить эту проблему, не переопределяя холст внутри функции, которая, по моим ощущениям, вызывает проблему, но тогда я не могу перерисовать границы холста, чтобы максимальное количество плитокможет быть сгенерирован будет ограничен изначально нарисованным размером холста. Обычно я думаю, что я мог бы вернуть canvas из функции, но поскольку он прикреплен к кнопке с помощью командных функций и лямбда-функции, я не уверен, как это сделать.
import tkinter as tk
def generate_start(window, canvas, num_tiles):
canvas.delete('all')
canvas = tk.Canvas(window, width=40*num_tiles, height=40)
canvas.grid(row=1, columnspan=num_tiles)
for i in range(num_tiles):
tile_width = 40
x1 = i * tile_width
y1 = 0
x2 = (i + 1)*tile_width - 1
y2 = tile_width - 1
canvas.create_rectangle(x1, y1, x2, y2, fill='blue')
window = tk.Tk()
window.title('GUI')
tk.Label(window, text = "Number of starting tiles:").grid(row=0)
default_start_num = 6
var = tk.IntVar(value=default_start_num)
start_num = tk.Spinbox(window, from_=1, to=100,
textvariable=var)
start_num.grid(row=0, column=1)
canvas = tk.Canvas(window, width=40*default_start_num, height=40)
canvas.grid(row=1, columnspan=default_start_num)
generate_btn = tk.Button(window, text='Generate',
command=lambda: generate_start(window, canvas, int(start_num.get())))
generate_btn.grid(row=0, column=2)
window.mainloop()