2015-11-02 91 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像素高的窗戶。通過簡單地強制中間窗口占用任何額外的空間(以及使其他窗口不佔用額外空間),您可以獲得相同的效果,而不必關閉幾何圖形傳播。

不知道要達到的確切外觀和行爲,很難提出具體建議。