2011-01-24 37 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()