Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x tkinter treeview在列宽更改时不调整宽度_Python 3.x_Tkinter_Treeview - Fatal编程技术网

Python 3.x tkinter treeview在列宽更改时不调整宽度

Python 3.x tkinter treeview在列宽更改时不调整宽度,python-3.x,tkinter,treeview,Python 3.x,Tkinter,Treeview,我有一个包含树视图和按钮的框架。当按下按钮时,树视图的行被删除,列被重新创建,标题被命名。列设置为拉伸,树本身设置为展开 我的理解是,这种配置应该导致列拉伸以匹配包含的帧 在第一次启动时,列将调整大小,并且帧与treeview的预期大小相匹配。然后我按下按钮来重新分配和调整列的大小(与初始化中调用的函数相同) 列可以调整大小,但树状视图保持相同的总宽度。如果拖动窗口的右边缘,则树状视图将随帧一起收缩。当框架“接触”最右边的列时,它似乎恢复了它的“拉伸性”,列随着我调整窗口的大小而增长/收缩 此外

我有一个包含树视图和按钮的框架。当按下按钮时,树视图的行被删除,列被重新创建,标题被命名。列设置为拉伸,树本身设置为展开

我的理解是,这种配置应该导致列拉伸以匹配包含的帧

在第一次启动时,列将调整大小,并且帧与treeview的预期大小相匹配。然后我按下按钮来重新分配和调整列的大小(与初始化中调用的函数相同)

列可以调整大小,但树状视图保持相同的总宽度。如果拖动窗口的右边缘,则树状视图将随帧一起收缩。当框架“接触”最右边的列时,它似乎恢复了它的“拉伸性”,列随着我调整窗口的大小而增长/收缩

此外,有时(每两次启动一次),第一次单击按钮时,列的宽度设置不起作用;我从未在以后的任何点击中看到过这个问题

我搜索了几篇类似的文章,但它们指出expand为false,但我在
self.tree.pack()
中以及
listbox.pack()中的包含框架中将其设置为true。我在没有expand的情况下尝试了两个pack()语句;行为是相同的

当我调整树视图包含的列的大小时,为什么树视图没有调整大小?什么可能导致第一次单击无法调整列的大小


将tkinter作为tk导入
将tkinter.font作为tkFont导入
将tkinter.ttk导入为ttk
随机输入
#导入natsort为ns
类多列列表框(tk.Frame):
“”“使用treeview类中的排序列创建多列“listbox”
定义初始化(self,master=None,*args,**kwargs):
tk.Frame.\uuuu init\uuuuu(self,master=master,*args,**kwargs)
#添加按钮以更改列
按钮(self,text=“change columns”,command=self.\u populate\u dummy).pack(anchor=tk.NW,pady=5)
self.tree=ttk.Treeview(master=self,show=“headers”)#不显示树列
self.tree.pack(fill=tk.X,expand=True)#将树放在父框架中
#初始化为随机值
self._填充_虚拟()
def_填充_虚拟(自身):
#生成列名
colnames=[“项目编号”]
numcols=random.randint(1,6)
colnames+=['col{}'。范围内i的格式(i)(numcols)]
self.set_头(colnames)
#生成行内容
行=[]
对于范围(20)内的i:
VAL=['item{}'。格式(i)]
对于范围内的(numcols):
VAL+=[random.randint(1100)]
行。追加(元组(VAL))
self.set_行(行)
#设置表格标题
def set_标题(自身、列):
self.tree.configure(列=列)
对于i,枚举中的列(列):
列宽=tkFont.Font().measure(列标题())
self.tree.heading(i,text=col)
self.tree.column(i,width=column\u width,stretch=True)#添加列,设置宽度以匹配标题
#设置行值
def set_行(自身,行):
#清行
对于self.tree.get_children()中的子对象:
self.tree.delete(子项)
#应用新行
对于i,枚举中的项(行):
标签=[(),('oddrow',)]
self.tree.insert(“”,'end',value=item,tags=tags[i%2])
self.tree.tag\u configure('oddrow',background='gray80')
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
root=tk.tk()
root.title(“多列树视图/列表框”)
listbox=多列listbox(根)
pack(padx=10,pady=10,fill=tk.X,expand=True)
root.mainloop()
此图显示程序在红色描述的条件下的状态

更新

我已经用调用包装了
set_headers()
,以获取treeview及其包含帧(self)的宽度,因此_populate_dummy()现在是:

def\u填充\u虚拟(自身):
#生成列名
colnames=[“项目编号”]
numcols=random.randint(1,6)
colnames+=['col{}'。范围内i的格式(i)(numcols)]+[]
打印(“之前”)
打印(“帧宽度:{}”。格式(帧宽度))
tree\u width=self.tree.winfo\u width()
打印(“表宽:{}”。格式(树宽))
self.set_头(colnames)
打印(“之后”)
frame_width=self.winfo_width()
打印(“帧宽度:{}”。格式(帧宽度))
tree\u width=self.tree.winfo\u width()
打印(“表宽:{}”。格式(树宽))
有趣的是,当程序在构造函数中调用_populate_dummy()时,返回

BEFORE
frame width: 1
table width: 1
AFTER
frame width: 1
table width: 1
尽管视觉外观是相当大的东西。 但此后,将出现一个(非1)值。当我得到“未调整大小”的版本(图中的步骤2)时,我得到:

frame width: 99
table width: 91
frame width: 99
table width: 91
frame width: 1003
table width: 1003
frame width: 1003
table width: 1003
当我得到一个列大小正确但框架较大的表时,我得到以下结果:

frame width: 99
table width: 91
frame width: 99
table width: 91
frame width: 1003
table width: 1003
frame width: 1003
table width: 1003
我应该注意到,报告的宽度似乎与列数无关,甚至不一致;我一次从两列中得到1003,另一次从两列中得到1203


这似乎很重要,但我不知道如何解释它。

我不知道为什么在当前情况下treeview会这样做,但是 您可以通过在_populate_dummy方法中的colnames末尾添加一个空标题来解决空格问题

def _populate_dummy(self):
    # generate column names
    colnames = ["item number"]
    numcols = random.randint(1,6)
    colnames += ['col{}'.format(i) for i in range(numcols)] + ['']
    self.set_headers(colnames)
然后在set_headers方法的最后一行中,将空列标题宽度设置为大于当前主窗口宽度

def set_headers(self, columns):
    self.tree.configure(columns=columns)
    for i, col in enumerate(columns):
        column_width = tkFont.Font().measure(col.title())
        self.tree.heading(i, text=col)
        self.tree.column(i, width=column_width, stretch=True)   # add column, set width to match header
    self.tree.column(i, width=self.winfo_width())