Python Tkinter GUI: удаление объектов холста, определенных в функции, одним нажатием кнопки - PullRequest
0 голосов
/ 19 октября 2019

У меня проблемы с базовым графическим интерфейсом, который я пытаюсь создать. Цель состоит в том, чтобы иметь кнопку, которая генерирует определенное количество плиток на основе числа в поле прокрутки. Я заставил его работать в основном, и нажатие кнопки «Создать» сгенерирует новое количество плиток, если значение спин-бокса будет изменено на большее, как и ожидалось, однако, если я изменю спин-бокс на меньшее число, старыйпоколение плитки можно увидеть за новым. Я ожидаю, что 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()

1 Ответ

0 голосов
/ 19 октября 2019

Каждый раз, когда вы нажимаете кнопку, вы создаете новый холст. Таким образом, когда вы вызываете canvas.delete('all'), вы удаляете их со старого холста, а затем создаете новый холст.

Вам необходимо создать холст один раз. Или удалите старый холст перед созданием нового холста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...