如何在画布中嵌入框架内使用它?

时间:2016-11-09 20:41:20

标签: python tkinter label scrollbar

我正在使用标签来显示数据。但是我有很多标签位于彼此之下,我不能将它们全部放在同一个窗口上。我希望使用滚动条滚动标签。但是,正如我所读到的,这并不是那么简单。据我了解,我最好的选择是使用一个框架来收集我的所有标签,然后将框架插入画布,然后可以与滚动条平行使用,尽管我很难这样做。 我用来创建标签的功能是

def Tab(root, y):
    #Print the team
    playerTeam = Label(root, bg = "white", text = "Hello")
    playerTeam.config(height = 1, width = 13)
    playerTeam.place(x=20,y=y) 

我试图将以下代码与我的函数

一起添加
def onFrameConfigure(canvas):
    '''Reset the scroll region to encompass the inner frame'''
    canvas.configure(scrollregion=canvas.bbox("all"))

root = tk.Tk()
root.geometry("400x400")
canvas = tk.Canvas(root, borderwidth=0, background="#ffffff")
frame = tk.Frame(canvas, background="#ffffff")
vsb = tk.Scrollbar(root, orient="vertical", command=canvas.yview)
canvas.configure(yscrollcommand=vsb.set)

vsb.pack(side="right", fill="y")
canvas.pack(side="left", fill="both", expand=True)
canvas.create_window((4,4), window=frame, anchor="nw")

frame.bind("<Configure>", lambda event, canvas=canvas: onFrameConfigure(canvas))

Tab(frame, 20)

运行时,会生成一个空白窗口。 但是,当使用.grid而不是.place时,在Tab()中它正常工作,并且标签显示在窗口上。虽然,当我多次调用Tab()时,标签会离开窗口,并且无法向下滚动。

如何让.place函数正常工作。 其次,如何让滚动条正常工作。 感谢

1 个答案:

答案 0 :(得分:0)

问题是frame.configure(width=100, height=100, background="bisque") 不像其他几何管理器那样工作 - 它不会改变其父级的大小。因此,即使您在框架中放置了一个大的(ish)标签,该框架仍然保持其默认大小为一个像素宽和一个像素高。它在那里,你只是看不到它。

您可以通过为框架指定明确的宽度和高度来验证这一点(并添加独特的颜色也有助于将其可视化):

place

来自official documentation for place

  

与许多其他几何管理器(例如打包器)不同   不会尝试操纵主数据的几何   窗口或从属窗口的父母(即它没有设置他们的   要求的尺寸)。要控制这些窗口的大小,请制作它们   窗口,如框架和画布,提供配置选项   为了这个目的。

我强烈建议您使用pack。 Tkinter的gridplace几何管理器在布局小部件方面非常出色。如果你使用NOT ax inc ax ,你必须自己做很多数学运算,结果可能无法正确调整大小或承受分辨率或字体大小的变化而无需大量工作。