如何在tk.Canvas内的tk.Frame中添加两个小部件?

时间:2018-07-12 03:24:55

标签: python canvas tkinter scrollbar frame

我正在尝试使用两个按钮来创建可滚动的应用程序。按下这些按钮之一应在框架中放置一个新按钮,并在框架内滚动小部件。

我的问题是如何将两个按钮放在框架中?

当我尝试只放入同一框架时,我只能看到一个按钮,而只有另一个按钮的一小部分。
该如何解决?

from tkinter import *   # from x import * is bad practice
global y
y=0
def _configure_interior(event):
    print("hola")
    size = (interior.winfo_reqwidth(), interior.winfo_reqheight())
    canvas.config(scrollregion="0 0 %s %s" % size)

def newbutton():
    buttons=Button(interior, text="Button ")
    buttons.pack()
    #b2.place(y=50)


root =Tk()
#configuring the Scrollbars
vscrollbar = Scrollbar(root, orient=VERTICAL)
vscrollbar.pack(fill=Y, side=RIGHT)
hscrollbar = Scrollbar(root, orient=HORIZONTAL)
hscrollbar.pack(fill=X, side=BOTTOM)

#setting canvas with scrollbar
canvas = Canvas(root,height=500, width=500, bg="blue",
            yscrollcommand=vscrollbar.set,xscrollcommand=hscrollbar.set)
canvas.propagate(0)
vscrollbar.config(command=canvas.yview)
hscrollbar.config(command=canvas.xview)
canvas.pack()

#making a interior scrolleable frame
interior = Frame(canvas,bg='black',height=600,width=600)
interior.pack(side="top", fill="both", expand=True)

#adding some widgets to the Frame
b=Button(interior, text="Button 2",command=newbutton)
b.pack()
b2=Button(interior, text="Button 2",command=newbutton)
b2.pack()
b2.place(x=50,y=50)

interior_id = canvas.create_window(30,30, window=interior,
                                 anchor=NW)
interior.bind('<Configure>', _configure_interior)
root.mainloop()

1 个答案:

答案 0 :(得分:0)

您还使用了pack()interior框架放置在画布上,该框架不起作用。我在下面的代码中对此行进行了注释。另外,我已经注释掉b2.place(),因为您不应在框架中使用更多的几何管理器。

#making a interior scrolleable frame
interior = Frame(canvas,bg='black',height=600,width=600)
#interior.pack(side="top", fill="both", expand=True)
interior_id = canvas.create_window(30,30, window=interior,
                                 anchor=NW)

#adding some widgets to the Frame
b=Button(interior, text="Button 2",command=newbutton)
b.pack()
b2=Button(interior, text="Button 2",command=newbutton)
b2.pack()
#b2.place(x=50,y=50)

新按钮现已打包到interior中。