【问题标题】:Python Tkinter GUI: Delete canvas objects defined within function at the click of a buttonPython Tkinter GUI:单击按钮删除函数内定义的画布对象
【发布时间】:2020-02-15 21:40:39
【问题描述】:

我在尝试创建的基本 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()

【问题讨论】:

    标签: python user-interface canvas tkinter lambda


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-17
      • 2018-08-12
      • 2020-10-19
      • 2021-02-06
      • 1970-01-01
      • 2023-01-30
      • 1970-01-01
      相关资源
      最近更新 更多