2017-06-20 64 views
3

我想要使用Tkinter的網格管理器來獲取特定的窗口布局。期望的佈局是:Tkinter中的網格管理器:列間距被忽略

_______________________________________________________ 
|     |     |     | 
|     |     |     | 
| canvas A  | canvas B  | canvas C  | 
|     |     |     | 
|     |     |     | 
|------------------------------------------------------ 
| B0 | B1 | B2 | B3 | B4 | B5 | B6 | B7 | B8 | 
| ____|_____|_____|_____|_____|_____|_____|_____|_____| 

其中B代表9個按鈕之一。下面的代碼變得非常接近,但是在我看來,畫布A和C簡單地忽略了columnspan=3參數,而畫布B正確地使用了它。

import matplotlib 
matplotlib.use('TkAgg') 
import matplotlib.pyplot as plt 
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg 
import Tkinter as Tk 

def generate_window(): 
    root = Tk.Tk() 
    root.rowconfigure((0,1), weight=1, minsize=35) 
    root.columnconfigure((0,8), weight=1, minsize=200) 

    titles = ['A', 'B', 'C']  
    for t, n in zip(titles, xrange(1, 4)): 
     fig = plt.figure() 
     ax = fig.add_subplot(111) 
     ax.plot([1,2,3,4], [1,4,9,16], 'ro') 
     ax.set_title(t) 
     canvas = FigureCanvasTkAgg(fig, master=root) 
     canvas.get_tk_widget().grid(row=0, column=(n-1)*3, columnspan=3, sticky='NSEW') 

    for x in xrange(0, 9): 
     Tk.button = Tk.Button(master=root, text=str(x), command= lambda x=x:button(x)) 
     Tk.button.grid(row=1, column=x, sticky='NSEW') 
    Tk.mainloop() 

def button(button_number): 
    print button_number 



generate_window() 

This類似的措辭問題不解決這個問題,因爲這裏有

+2

我不明白的問題。在我看來,每個畫布橫跨三列。列的寬度不相等,所以列的大小是不同的,但是這似乎是有意的,因爲您只給了幾列的權重。順便說一句,如果你刪除了對matplotlib的依賴關係,回答這個問題會容易得多。只需使用空白畫布。 –

+0

啊,我誤解了'columnconfigure'的工作方式。我認爲這是將重量應用到每一列。如果你添加了這個效果的答案,我會接受。謝謝。 –

回答

2

沒有空列,您只將一列重一對夫婦列,所以你最終不等列寬。如果您希望所有列的大小相同,最簡單的解決方案就是給它們全部相同的權重和/或使用uniform選項。

例如:

root.columnconfigure((0,1,2,3,4,5,6,7,8), weight=1)