Tkinter - 无法在中间画布/框架上放置按钮

时间:2015-11-02 15:25:11

标签: python tkinter

有人可以帮我解决我在Tkinter的问题吗?

我想在彼此之下创建三个框架/画布。一旦我在中间画布上放置了任何小部件(按钮/标签),画布的位置就会向下移动。

这是我的代码:

import tkinter as tk

class GameMain:
    def __init__(self):
        root = tk.Tk()
        top_bg = tk.PhotoImage(file="TopFrame.png")

        root.geometry("1280x900+3+3")
        cv=tk.Canvas(root,width=1280,height=100)
        cv.pack(side="top",fill="both",expand="yes")
        cv.create_image(0,0,image=top_bg,anchor='nw')
        Btn1 = tk.Button(cv,text="button1")
        Btn1.grid(row=0,column=0,padx=5,pady=5)
        Btn2 = tk.Button(cv,text="Button2")
        Btn2.grid(row=1,column=0,padx=5,pady=5)

        mcv=tk.Canvas(root,width=1280,height=700,bg="red",border=1)
        mcv.pack(side="top",fill="both",expand="yes")
        #Once I placed the following button, middle canvas moved down and shows empty spaces lot
        Btn3 = tk.Button(mcv,text="button1")
        Btn3.pack(padx=5,pady=5)
        Btn4 = tk.Button(mcv,text="Button2")
        Btn4.pack(padx=5,pady=5)

        bcv=tk.Canvas(root,width=1280,height=100,bg="yellow")
        bcv.pack(side="top",fill="both",expand="yes")

        root.mainloop()

GameMain()

2 个答案:

答案 0 :(得分:1)

任何窗口小部件的默认行为是展开或收缩以完全适合其所有子窗口小部件。根据我的经验,这种行为为您提供了最灵活的用户界面,工作量最少。此功能称为"几何传播"。

如果要强制容器窗口小部件为特定大小,可以为其指定大小,然后关闭几何体传播。例如,您可以添加以下代码行:

mcv.pack_propagate(False)

但是,要真正将窗口小部件强制为特定大小,需要更多工作,因为它取决于 父的方式。在UI设计中,实际上很少需要将小部件设置为非常特定的大小,而不管小部件内部是什么。

通常情况下,您的问题有更好的解决方案。例如,您将窗口设置为900的高度,两个100像素高的窗口和700像素高的窗口。通过简单地强制中间窗口占用任何额外空间(以及让其他窗口占用额外空间),您可以获得相同的效果,而无需关闭几何传播。

在不知道您想要实现的确切外观和行为的情况下,很难做出具体建议。

答案 1 :(得分:0)

这个问题的确切原因有点令人费解;关于向画布添加按钮的一些方法是改变它的几何形状。解决这个问题的方法是强制画布保持至少700像素的高度(有点像在门上楔入一根棍子以保持它打开)。为此,我在画布的一侧添加了for (Component c : components) if (c instanceof PhysicsComponent) return c; 并为其添加了frame的填充。为什么350?因为它将在上方和下方填充350像素(因此最多可添加700个像素)。只要您不向框架添加任何内容,它就会保持不可见。以下是您的工作示例:

pady=350