【问题标题】:Python tkinter widget resizes when it changesPython tkinter 小部件在更改时调整大小
【发布时间】:2017-10-18 17:01:51
【问题描述】:

当我按下切换标题按钮时,如何防止此应用中的小部件改变大小?

我希望两个 Treeview 始终占据窗口宽度的 50%

目前,左边的列在获得更多/更少列时会调整大小

import tkinter as tk
from tkinter import ttk
def toggle_headings():
    global htog
    if htog==0:
        t1.config(columns=columnswide)
        for i,h in enumerate(columnswide):
            c = ('#')+str(i)
            t1.heading(c,text=h)
        htog = 1
    else:
        t1.config(columns=columns)
        t1.heading(columns[0],text=columns[0])
        htog = 0
htog = 0

app = tk.Tk()

columnswide = ['abcd' for i in range(5)]
columns = ['abcd']
columnsbutton = tk.Button(app,text='toggle headings',command=toggle_headings)

t1 = ttk.Treeview(app,selectmode='browse',columns=columns)
t2 = ttk.Treeview(app,selectmode='browse',columns=columnswide)
for i,h in enumerate(columnswide):
    c = ('#')+str(i)
    t2.heading(c,text=h)
t1.heading(columns[0],text=columns[0])
for i in range(10):
    t1.insert('','end',text='testing '+str(i),values=['value'])
    t2.insert('','end',text='testing '+str(i),values=['value' for i in range(5)])

columnsbutton.pack(side='top',fill='x',expand=1)
t1.pack(side='left',fill='both',expand=1)
t2.pack(side='left',fill='both',expand=1)

app.mainloop()

如果有人建议使用 .grid(),我在下面尝试了这种方法:

import tkinter as tk
from tkinter import ttk
def toggle_headings():
    global htog
    if htog==0:
        t1.config(columns=columnswide)
        for i,h in enumerate(columnswide):
            c = ('#')+str(i)
            t1.heading(c,text=h)
        htog = 1
    else:
        t1.config(columns=columns)
        t1.heading(columns[0],text=columns[0])
        htog = 0
htog = 0

app = tk.Tk()

columnswide = ['abcd' for i in range(5)]
columns = ['abcd']
columnsbutton = tk.Button(app,text='toggle headings',command=toggle_headings)

t1 = ttk.Treeview(app,selectmode='browse',columns=columns)
t2 = ttk.Treeview(app,selectmode='browse',columns=columnswide)
for i,h in enumerate(columnswide):
    c = ('#')+str(i)
    t2.heading(c,text=h)
t1.heading(columns[0],text=columns[0])
for i in range(10):
    t1.insert('','end',text='testing '+str(i),values=['value'])
    t2.insert('','end',text='testing '+str(i),values=['value' for i in range(5)])

columnsbutton.grid(row=0,column=0,columnspan=2,sticky='we')
t1.grid(row=1,column=0,sticky='nswe')
t2.grid(row=1,column=1,sticky='nswe')
app.grid_columnconfigure(0,weight=1)
app.grid_columnconfigure(1,weight=1)
app.mainloop()

【问题讨论】:

  • 这很难,框架小部件可能会有所帮助
  • @AlexBohm 在完整版程序中,两个树视图都位于单独的框架小部件内,添加列的效果是相同的,但感谢您的想法

标签: python tkinter treeview


【解决方案1】:

更详细地解释@new_to_coding 的解决方案:

将grid_columnconfigure() 用于Tkinter。

grid_columnconfigure()的第一个参数需要设置列索引。

请注意,还有其他参数。例如,某些列在调整大小时可能会比其他列增长得更多。

  • minsize:定义列的最小大小。请注意,如果一列完全为空,即使设置了此选项,它也不会显示。
  • pad: 设置整列大小时添加到列中最大小部件大小的填充。
  • weight:用于在列之间分配额外空间的相对权重。权重为 2 的列的增长速度是权重为 1 的列的两倍。默认值为 0,这意味着该列根本不会增长。
  • uniform:当提供非空值时,将该列与具有相同 uniform 值的其他列放在 uniform group 中。为属于统一组的列分配空间,以便它们的大小始终与其weight 值严格成比例。

【讨论】:

    【解决方案2】:

    我已经用这个选项解决了这个问题:

    app.grid_columnconfigure(0,weight=1,uniform='x')
    app.grid_columnconfigure(1,weight=1,uniform='x')
    

    它使每一列的大小成比例

    【讨论】:

    • 有你的赏金 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-18
    • 2012-04-07
    • 1970-01-01
    • 2018-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多