首页 > 解决方案 > Python Tkinter GUI:单击按钮删除函数内定义的画布对象

问题描述

我在尝试创建的基本 GUI 时遇到了一些问题。目标是有一个按钮,可以根据旋转框中的数字生成一定数量的图块。我已经让它大部分工作,如果旋转框值更改为更大的数字,单击“生成”按钮将生成新数量的图块,如预期的那样,但是如果我将旋转框更改为较小的数字,旧的瓷砖一代的背后可见新的。我希望能够canvas.delete('all')采用以前的画布对象。

我试图通过不重新定义我感觉导致问题的函数内部的画布来解决这个问题,但是我无法重新绘制画布边界,因此可以生成的最大图块数量将受到限制由最初绘制的画布大小。通常我会认为我可以从函数返回画布,但由于它通过命令功能和 lambda 函数附加到按钮,我不知道如何去做。

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()

标签: pythonuser-interfacecanvastkinterlambda

解决方案


每次单击按钮时,您都在创建一个新画布。因此,当您调用 时canvas.delete('all'),您将从旧画布中删除它们,然后创建一个新画布。

您需要创建一次画布。那,或者在创建新画布之前删除旧画布。


推荐阅读