簡體   English   中英

當小部件跨越多列時,如何制作寬度相等的Tkinter列(Python 2.7)

[英]How to make Tkinter columns of equal width when widgets span multiple columns (Python 2.7)

在下文中,標有“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()

請注意,使用帶有uniform grid_columnconfigure並不能解決此問題。 插入以下行(請參閱此處類似問題的答案: 如何在Python 2.7中使用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

我想你可能想要使用粘性選項。

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()

編輯

它是什么樣子的。 除了文本小部件占用指定的兩列之外,我看起來像這樣均勻分布。

它看起來像這樣嗎?

老帖子我知道,但我也努力讓列和行保持共同的寬度/高度所以我想我會分享我的解決方案

對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()

在此輸入圖像描述

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM