2016-11-09 64 views
2

我正在使用标签来显示数据。然而,我有这么多的标签放置在彼此之下,我不能让他们都在同一个窗口。我希望使用滚动条滚动标签。不过,据我所知,这并不是那么简单。据我所知,我最好的选择是使用框架来收集我的所有标签,然后将框架插入到画布中,然后可以与滚动条平行使用,尽管我在这方面遇到了麻烦。 ,我使用创建我的标签功能是如何使用嵌入画布中的框架内的地方?

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函数正常工作。 其次我怎样才能让滚动条正常工作。 谢谢

回答

0

问题是place不像其他几何管理器一样工作 - 它不会改变其父项的大小。因此,即使您在框架中放置了一个大(ish)标签,该框架仍然保持其默认尺寸为一个像素宽和一个像素高。它在那里,你看不到它。

您可以通过给帧一个明确的宽度和高度验证这一点(并加入独特的色彩有助于进行可视化,太):

frame.configure(width=100, height=100, background="bisque") 

official documentation for place

不像许多其他几何管理器(例如打包器)放置器 不会尝试操纵主窗口或从窗口的父窗口的几何图形(即,它不会设置它们的 请求的大小)。要控制这些窗口的大小,请使窗口像框架和画布一样为此提供配置选项 。

我强烈建议您使用place。 Tkinter的packgrid几何管理器非常擅长布置小部件。如果使用place,则必须自己进行大量的数学计算,结果可能无法正确调整大小,或者无法承受大量工作而承受分辨率或字体大小的变化。

+0

感谢Bryan,但我确实无法看到网格和包几何管理器与我的界面设计很好地配合。但是另外,为什么滚动条在我给出的例子中不起作用? –

+0

滚动条不起作用,因为'scrollregion'没有设置,因为框架很小。将'scrollregion'设置为大于画布的值,并且滚动条将起作用。我敢打赌,几乎没有任何界面设计可以满足,不能使用'pack'或'grid',除了需要用户能够交互移动小部件的设计之外。 –

+0

好的谢谢。但是,我可以使用包/网格方法,但是此时我发现很难将标签放在我想要的位置,而没有将标签设置得太紧密。 –

相关问题