当小部件跨越多列时,如何制作宽度相等的Tkinter列(Python 2.7)

时间:2014-01-09 00:07:02

标签: python python-2.7 tkinter tcl tk

在下文中,标有“ONE”,“TWO”和“THR”的按钮不会均匀分布。在我看来,问题的根源是Tk假定包含跨越多列的小部件的任何列的默认最小宽度。但是,此行为似乎没有记录,因此我不确定如何容纳或调整它以使列具有相等的宽度 - 包括文本小部件跨越的两列和文本未跨越的单列小部件 - 从而均匀地分隔按钮。我可以通过反复试验来克服它,即填充后一列,直到它与前两列匹配,但这似乎是一个糟糕的解决方案。

编辑:在下面与@ jwillis0720进行讨论之后,我添加了一个额外的列(3)和按钮('FIV')以使问题更加清晰。这个问题是关于如何在多列小部件跨越其中一些列时使列宽度相同而其他列不是。

import Tkinter

master = Tkinter.Tk()

Tkinter.Button(master, text='ONE').grid(row=0, column=0)
Tkinter.Button(master, text='TWO').grid(row=0, column=1)
Tkinter.Button(master, text='THR').grid(row=0, column=2)
Tkinter.Button(master, text='FOU').grid(row=1, column=2)
Tkinter.Button(master, text='FIV').grid(row=0, column=3) # added as per above edit
Tkinter.Text(master).grid(row=1, column=0, columnspan=2)

master.mainloop()

请注意,grid_columnconfigureuniform一起使用无法解决此问题。插入以下行(请参阅此处对类似问题的回答:How to create equal-width columns in Python 2.7 with Tkinter)只会使列有弹性;它们仍然不均匀:

master.grid_columnconfigure(0, weight=1, uniform='a')
master.grid_columnconfigure(1, weight=1, uniform='a')
master.grid_columnconfigure(2, weight=1, uniform='a')
master.grid_columnconfigure(3, weight=1, uniform='a') # added as per above edit

3 个答案:

答案 0 :(得分:4)

我想你可能想要使用粘性选项。

  

sticky =定义如果生成的单元格是如何扩展窗口小部件   比小部件本身大。这可以是任何组合   常数S,N,E和W,或NW,NE,SW和SE。

     

例如,W(west)表示小部件应该与   左边的细胞边界。 W + E意味着应该拉伸小部件   水平填充整个细胞。 W + E + N + S表示小部件   应该向两个方向扩展。默认是使小部件居中   在牢房里。

import Tkinter

master = Tkinter.Tk()

Tkinter.Button(master, text='ONE').grid(row=0, column=0, sticky='NW')
Tkinter.Button(master, text='TWO').grid(row=0, column=1, sticky='NW')
Tkinter.Button(master, text='THR').grid(row=0, column=2, sticky='NW')
Tkinter.Button(master, text='FOU').grid(row=1, column=2)
Tkinter.Text(master).grid(row=1, column=0, columnspan=2)


master.mainloop()

修改

它看起来像什么。除了文本小部件占用指定的两列之外,我看起来像这样均匀分布。

Does it look like this

答案 1 :(得分:2)

我知道的旧帖子,但是我也很难使列和行保持相同的宽度/高度,所以我想我会分享我的解决方案

更新python和tkinter,所以如果有任何错误,请告诉我

我创建了一个网格管理器,该网格管理器允许将主窗口和任何框架设置为具有均匀间隔的列和行,虽然不是100%,但是对于我使用它的效果很好,它在构建期间特别有用阶段

创建框架时的一个缺点是,框架的最大行数/列数必须等于或小于其所跨越的行数/列数,否则会有些奇怪(可以肯定为什么)

希望这会有所帮助

import tkinter

class grid_manager:
    def __init__(self, Frame, colour = "gray94"):
        self.Frame = Frame
        self.Colour = colour

    def set_grid(self, numofRows, numofColumns, borderwidth = 1):
        self.numofRows = numofRows
        self.numofColumns = numofColumns
        self.borderwidth = borderwidth
        for i in range(numofRows):
            for j in range(numofColumns):
                canvas = tkinter.Canvas(self.Frame)
                canvas.config(relief="raised", borderwidth=self.borderwidth)   #comment out to hide grid layout
                canvas.grid(row=i, column=j)
                canvas.config(background=self.Colour)
                self.Frame.columnconfigure(j, weight=1)
            self.Frame.rowconfigure(i, weight=1)

mainwindow = tkinter.Tk()

mainwindow.title("Test")
mainwindow.geometry("640x480-8-200")
mainGrid = grid_manager(mainwindow)
mainGrid.set_grid(10, 10)

header_Frame = tkinter.Frame(mainwindow)
header_Frame.grid(row=0, column=0, columnspan=10, sticky="nsew")
headerGrid = grid_manager(header_Frame)
headerGrid.set_grid(numofRows=1, numofColumns=10, borderwidth=5)

footerFrame = tkinter.Frame(mainwindow)
footerFrame.grid(row=9, column=0, columnspan=10, sticky="nsew")
footerGrid = grid_manager(footerFrame, "red")
footerGrid.set_grid(numofRows=1, numofColumns=10, borderwidth=5)

rightFrame = tkinter.Frame(mainwindow)
rightFrame.grid(row=1, column=5, rowspan=5, columnspan=5, sticky="nsew")
rightGrid = grid_manager(rightFrame, "blue")
rightGrid.set_grid(numofRows=5, numofColumns=5, borderwidth=2)

leftFrame = tkinter.Frame(mainwindow)
leftFrame.grid(row=3, column=0, rowspan=5, columnspan=4, sticky="nsew")
leftGrid = grid_manager(leftFrame, "yellow")
leftGrid.set_grid(numofRows=5, numofColumns=4, borderwidth=2)

mainwindow.mainloop()

enter image description here

答案 2 :(得分:-1)

import tkinter

master = tkinter.Tk()

tkinter.Button(master, text='ONE                ').grid(row=0, column=3, sticky='NW')
tkinter.Button(master, text='TWO               ').grid(row=1, column=3, sticky='NW')
tkinter.Button(master, text='THR                ').grid(row=2, column=3, sticky='NW')
tkinter.Button(master, text='FOU                ').grid(row=3, column=3, sticky='NW')
tkinter.Text(master).grid(column=30, columnspan=10)