如何在 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 中删除)
我创建了一个有两个框架的主根。
-程序工具栏一框。
-其他框架用于 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 中删除)