如何在 Tkinter 中安装在 canvas 上的框架上显示小部件?

How to display widgets on a frame that is mounted on canvas in Tkinter?

我创建了一个有两个框架的主根。

-程序工具栏一框。

-其他框架用于 canvas,其中将显示数据和滚动条小部件。

-canvas 内部是第三个较小的框架,将用于滚动槽数据。

但是,当我尝试定义新的小部件并将它们放在第三个较小的框架上时,没有任何反应。我在按钮命令的函数调用中定义新的小部件。我也尝试过将所有内容声明为全局变量,但没有成功。

提示:我尝试将代码从函数放置到代码的顶层并且它起作用了。此外,如果我尝试将这些小部件安装在工具栏框架上,它也可以工作。似乎我唯一不能做的就是将这些新小部件安装在 canvas.

内部的小框架上

我使用了一个简单的 for 循环来创建仅用于测试的标签。

谁能告诉我哪里做错了?

from tkinter import *
from tkinter import ttk



#Creating main window
root = Tk()
root.resizable(width=False, height=False)



#Defining Background

toolbar = Frame(root, width=613, height=114)
toolbar.grid(row=0, column=0)

background_frame = Frame(root, width=615, height=560)
background_frame.grid(row=1, column=0)

background = Canvas(background_frame, width=615, height=560)
background.pack(side=LEFT, fill=BOTH, expand=1)

scroll_bar = ttk.Scrollbar(background_frame, orient=VERTICAL, command=background.yview)
scroll_bar.pack(side=RIGHT, fill=Y)

background.configure(yscrollcommand=scroll_bar.set)
background.bind('<Configure>', lambda e:background.configure(scrollregion = background.bbox('all')))

second_frame = Frame(background)
background.create_window(150,100, window=second_frame, anchor='nw')


def confirm1():
    
    
    for x in range(100): 
        Label(second_frame, text = x ).grid(row=x, column=1)




show_labels = Button(toolbar, text= "Show labels", fg="black", command=confirm1)
show_labels.grid(row=0, column=2)

root.mainloop()

Picture of the app so far

我肯定无法用您当前的代码重现该问题,但查看之前的编辑很清楚您的问题所在。

(取自您之前的编辑)

def confirm1():
    
    global background_image1

    background.delete('all')  # <--- this line of code
 
    for x in range(100): 
        Label(second_frame, text = x ).grid(row=x, column=1)

在这里,您从 canvas:

中删除所有项目
background.delete('all') 

因此没有项目出现。

您应该通过将 id 或标签传递给 delete 方法来仅删除那些您想要删除的项目。您可以通过提供相同的标签一次删除多个项目。

另一种选择是使用 create_window 在 canvas 上重新创建框架项目(请注意:您的框架不是 deleted/destroyed,它只是从 canvas 中删除)