如何清除tkinter画布的一部分并在按下提交时显示某些内容?

时间:2017-05-13 12:22:22

标签: python tkinter tkinter-canvas

我正在创建一个简单的madlib风格游戏,我遇到了一些问题。我无法清除画布并显示结果。

以下代码将图像放置为画布的背景。然后,它将标签和输入字段放在2列中,以便插入所有单词。页面底部有一个提交按钮。我无法弄清楚如何清除除背景图像之外的所有内容,以便它可以显示故事,并插入用户单词。如果我将它放在callback()中,它会清除背景并保留其他所有内容。我希望相反。

from tkinter import *
from PIL import Image, ImageTk

canvas_width = 360
canvas_height = 525
file = r"C:\Users\kraak\Desktop\PyCharm Community Edition 2017.1.2\borderedpaper.GIF"
master = Tk()
canvas = Canvas(master, width=canvas_width, height=canvas_height)

old_img = PhotoImage(file=file)
new_img = old_img.subsample(3, 3)
canvas.create_image(-11, -10, anchor=NW, image=new_img)
canvas.create_window(0, 0, height=1, width=1, anchor=NW)
canvas.create_text(0, 0, text="Test")

e1 = Entry(canvas)
canvas.create_window(250, 60, window=e1, height=15, width=100)
label = Label(text="Enter an adjective.")
label.place(x=40, y=50)
e1.focus_set()

e2 = Entry(canvas)
canvas.create_window(250, 85, window=e2, height=15, width=100)
label = Label(text="Enter a nationality.")
label.place(x=40, y=75)
e2.focus_set()


def callback():
    print("Pizza was invented by a " + (e1.get()) + " " + (e2.get()))

def answer():
    button = Button(text="Submit.", command=callback)
    button.place(x=150, y=460)

answer()
canvas.pack()


mainloop()

2 个答案:

答案 0 :(得分:1)

正如Bryan Oakley建议您可以存储要在列表中删除的小部件的ID,以便在destroy()函数中更容易callback()所有小部件。这里显示了对您的代码进行的修改 - 请注意带有# ADDED条评论的行。

from tkinter import *
from PIL import Image, ImageTk

canvas_width = 360
canvas_height = 525
file = r"C:\Users\kraak\Desktop\PyCharm Community Edition 2017.1.2\borderedpaper.GIF"
master = Tk()
canvas = Canvas(master, width=canvas_width, height=canvas_height)
canvas_entry_widgets = []  # ADDED

old_img = PhotoImage(file=file)
new_img = old_img.subsample(3, 3)
canvas.create_image(-11, -10, anchor=NW, image=new_img)
canvas.create_window(0, 0, height=1, width=1, anchor=NW)
canvas.create_text(0, 0, text="Test")

e1 = Entry(canvas)
canvas.create_window(250, 60, window=e1, height=15, width=100)
label = Label(text="Enter an adjective.")
label.place(x=40, y=50)
e1.focus_set()
canvas_entry_widgets.append(e1)  # ADDED

e2 = Entry(canvas)
canvas.create_window(250, 85, window=e2, height=15, width=100)
label = Label(text="Enter a nationality.")
label.place(x=40, y=75)
e2.focus_set()
canvas_entry_widgets.append(e2)  # ADDED

def callback():
    print("Pizza was invented by a " + (e1.get()) + " " + (e2.get()))
    # destroy the canvas entry widgets and clear the list  # ADDED
    while canvas_entry_widgets:                            # ADDED
        widget = canvas_entry_widgets.pop()                # ADDED
        widget.destroy()                                   # ADDED

def answer():
    button = Button(text="Submit.", command=callback)
    button.place(x=150, y=460)

answer()
canvas.pack()

mainloop()

答案 1 :(得分:0)

每个小部件都有一个destroy方法,可用于删除小部件。在回调中,您只需为每个小部件调用此方法:

def callback():
    e1.destroy()
    e2.destroy()
    ...

在特定情况下,如果要删除所有标签,则必须为其指定唯一名称。或者,为了使这更容易,您可以存储所有小部件并遍历列表。