2011-01-24 94 views
2

下面是我的跳棋遊戲我目前的GUI佈局:如何使用包或網格實現以下Tkinter GUI佈局?

Checkers game

正如你所看到的,它由沿頂部的菜單,在這裏我畫棋盤,工具欄左側的畫布的(幀)在右上角,我有各種格式/導航按鈕,以及用於註釋移動的文本小部件。目前,我正在爲小部件使用網格佈局。

這就是我需要做的:

  1. 能夠顯示/隱藏在文本控件的滾動條時文本的數量增長比小部件大小。 (根據this article,這似乎需要網格佈局。)
  2. 更改文本窗口小部件中的文本的字體和/或大小[通過首選項對話框],並且不會在文本窗口小部件周圍留下奇怪的空白。 (這似乎需要一個包佈局,因爲Text小部件只能以字符而不是像素給出寬度和高度......這意味着當我更改字體或大小時,Text小部件會增大或縮小,並且窗口不會調整以適應網格佈局我一直在嘗試使用Font.measure來根據所選字體調整文本窗口部件的大小,但我仍然有空白,因爲我無法將窗口部件的大小調整爲確切像素。)
  3. 我的最終解決方案需要跨平臺(包括Windows & Linux和希望Mac)。

我可以使用哪種佈局來滿足我的要求?如果兩者都不能完全發揮作用,哪種佈局(網格或包裝)會使我接近我的目標?謝謝!

+0

網格佈局具有所有的相同的放大/縮小行爲的包,只是訪問不同(給行和/或列的「權重」) – 2011-01-24 22:19:34

+0

你的屏幕截圖顯示的是非標準菜單欄,它_not_跨越一路延伸。這是一個要求,還是標準的菜單欄好嗎? – 2011-01-24 22:20:52

回答

6

對於這個簡單的佈局,你可以使用grid,pack或兩者。在這種特殊情況下也沒有明顯的優勢。兩者都有你想要的調整行爲。

關閉我的頭頂我會用一個水平框架來保存按鈕,並在其中包裝按鈕。然後,我可能會使用網格將工具欄,文本窗口小部件和滾動條放入框架中。包也可以使用,要麼工作。這需要照顧右側。

如果你想讓菜單欄在圖片中顯示(例如:非標準菜單,只能在棋盤上),我會使用類似的技術:左邊的另一個框架,菜單欄放在頂部,棋盤在底部。

然後,我會在主窗口中使用包,狀態欄在底部,棋盤在左邊,然後右邊的文本區域。

然而,最好是使用標準的菜單欄,這意味着你不需要包含幀的棋盤/菜單欄組合

這裏是在一個解決方案中使用標準的菜單欄的快速破解。這使用了將大多數小部件作爲父項的子項的技術,然後使用參數in_將它們放入容器中。這樣可以稍後更改佈局,因爲您不必更改整個層次結構,而只需將容器部件放置在容器中。

import Tkinter as tk 
import random 

class App(tk.Tk): 
    def __init__(self, *args, **kwargs): 
     tk.Tk.__init__(self, *args, **kwargs) 

     size = 40 
     menubar = tk.Menu(self) 
     menubar.add_cascade(label="Game") 
     menubar.add_cascade(label="Options") 
     menubar.add_cascade(label="Help") 
     chessboard = tk.Canvas(width=8*size, height=8*size, borderwidth = 0, 
           highlightthickness=0) 
     statusbar = tk.Label(self, borderwidth=1, relief="sunken") 
     right_panel = tk.Frame(self, borderwidth = 1, relief="sunken") 
     scrollbar = tk.Scrollbar(orient="vertical", borderwidth=1) 
     # N.B. height is irrelevant; it will be as high as it needs to be 
     text = tk.Text(background="white",width=40, height=1, borderwidth=0, yscrollcommand=scrollbar.set) 
     scrollbar.config(command=text.yview) 

     toolbar = tk.Frame(self) 
     for i in range(10): 
      b = tk.Button(self, text="B%s" % i, borderwidth=1) 
      b.pack(in_=toolbar, side="left") 

     self.config(menu=menubar) 
     statusbar.pack(side="bottom", fill="x") 
     chessboard.pack(side="left", fill="both", expand=False) 
     toolbar.grid(in_=right_panel, row=0, column=0, sticky="ew") 
     right_panel.pack(side="right", fill="both", expand=True) 
     text.grid(in_=right_panel, row=1, column=0, sticky="nsew") 
     scrollbar.grid(in_=right_panel, row=1, column=1, sticky="ns") 
     right_panel.grid_rowconfigure(1, weight=1) 
     right_panel.grid_columnconfigure(0, weight=1) 

if __name__ == "__main__": 
    app = App() 
    app.mainloop()