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

2024-03-28 10:35:34 发布

您现在位置:Python中文网/ 问答频道 /正文

在下面的例子中,标有“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

Tags: textmaster宽度部件tkintercolumnbuttonuniform
3条回答

我想你应该用粘性选项。

sticky= Defines how to expand the widget if the resulting cell is larger than the widget itself. This can be any combination of the constants S, N, E, and W, or NW, NE, SW, and SE.

For example, W (west) means that the widget should be aligned to the left cell border. W+E means that the widget should be stretched horizontally to fill the whole cell. W+E+N+S means that the widget should be expanded in both directions. Default is to center the widget in the cell.

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

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

对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

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)

相关问题 更多 >