2015-11-02 122 views
2

有人可以帮我解决我在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() 
+0

你想让这三幅画布保持完全的高度吗? –

回答

0

此问题的确切原因是有点令人费解;关于在画布上添加按钮的操作正在使其几何更改。解决这个问题的一个解决方法是强制画布保持至少700像素高(有点像锁在门上以保持打开状态)。为此,我在画布的一侧添加了frame,并为其填充了pady=350。为什么350?因为它会填充350像素以上和以下(因此加起来多达700)。只要你不添加任何东西到框架,它将保持不可见。这里是一个工作例子给你:

mcv=tk.Canvas(root,width=1280,height=700,bg="red",border=1) 
mcv.pack(side="top",fill="both",expand="yes") 
frame = tk.Frame(mcv) # Add this frame to your canvas. 
frame.pack(side="left", anchor="nw", pady=350) 
Btn3 = tk.Button(mcv,text="button1") 
Btn3.pack(padx=5,pady=5) 
Btn4 = tk.Button(mcv,text="Button2") 
Btn4.pack(padx=5,pady=5) 
+0

_“有关将按钮添加到画布上的事情正在使其几何变化”_:“某事”根本不令人费解。这是任何tkinter小部件的默认行为 - 当您使用'pack'或'grid'管理内部小部件时,包含小部件“缩小以适合”。 –

1

任何插件的默认行为是扩张或收缩,以便恰好符合它的所有子小部件。根据我的经验,这种行为为您提供了最少量工作的最灵活的用户界面。这个特征被称为“几何传播”。

如果要强制容器小部件为特定大小,则可以给它一个大小,然后关闭几何形状传播。例如,您可以添加以下代码行:

mcv.pack_propagate(False) 

然而,真正迫使小部件到特定的大小需要更多的工作,因为它是依赖于是如何加入到父母。实际上,在UI设计中很少有人希望小部件成为非常特定的大小,而不管小部件内部是什么。

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

不知道要达到的确切外观和行为,很难提出具体建议。