Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.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 在更新后禁用树视图填充窗口_Python_Tkinter_Ttk - Fatal编程技术网

Python 在更新后禁用树视图填充窗口

Python 在更新后禁用树视图填充窗口,python,tkinter,ttk,Python,Tkinter,Ttk,我有两列非常简单的网格布局,第一列显示一些文本,第二列显示树状视图: #! python3 from random import randint import tkinter as tk from tkinter import ttk from tkinter.constants import * class Application(ttk.Frame): def __init__(self, root): self.root = root sel

我有两列非常简单的网格布局,第一列显示一些文本,第二列显示树状视图:

#! python3

from random import randint
import tkinter as tk
from tkinter import ttk
from tkinter.constants import *


class Application(ttk.Frame):

    def __init__(self, root):
        self.root = root
        self.root.resizable(0, 0)
        self.root.grid_columnconfigure(0, weight=1)
        self.root.grid_columnconfigure(1, weight=3)
        self.init_widgets()
        self.arrange_grid()

    def init_widgets(self):
        self.text_frame = ttk.Labelframe(self.root, text='Info')
        self.button = ttk.Button(self.root, text='Process', command=self.on_button)
        self.tree = ttk.Treeview(self.root)
        self.scroll = ttk.Scrollbar(self.root, orient=HORIZONTAL, command=self.tree.xview)
        self.tree.configure(xscrollcommand=self.scroll.set)

    def arrange_grid(self):
        self.text_frame.grid(row=0, sticky=NSEW)
        self.button.grid(row=0, sticky=N, pady=32)
        self.tree.grid(row=0, column=1, sticky=NSEW)
        self.scroll.grid(row=0, column=1, sticky=(S, W, E))

    def on_button(self):
        headers = list(range(20))
        rows = [[randint(0, 100)] * len(headers) for i in headers]
        self.tree["columns"] = headers
        for i, row in enumerate(rows):
            self.tree.insert("", i, values=row)


if __name__ == '__main__':
    root = tk.Tk()
    app = Application(root)
    root.mainloop()
当我点击一个“进程”按钮时,树视图中会填充数据,但同时它会调整根窗口的大小并填充整个空间


如何指示ttk树视图在填充数据后保持其大小?

树视图将增长以适应其所有列,除非受窗口约束。除非你给它一个固定的尺寸,否则窗户会长到适合所有的孩子。现在的情况是,您给treeview添加了许多列,导致它增长。因为它在增长,所以窗口在增长,因为您没有限制它的增长

有几种解决方案。也许最简单的解决方案是把树放在一个框架中,这样你就可以给它一个明确的宽度和高度。关键是让框架控制其子对象的大小,而不是相反。这是通过禁用几何体传播来完成的

首先,先创建一个框架,然后将树放在框架中。我们还可以将滚动条放在框架中,这样我们就可以将树和滚动条视为一个单独的单元

self.tree_frame = tk.Frame(self.root, width=400, height=200)
self.tree = ttk.Treeview(self.treeframe)
self.scroll = ttk.Scrollbar(self.tree_frame, orient=HORIZONTAL, command=self.tree.xview)
self.tree.configure(xscrollcommand=self.scroll.set)
接下来,将treeview和滚动条添加到框架中。您可以使用
pack
place
grid
中的任何一种;我发现
pack
对于从上到下的布局更为优越。我们还使用
pack\u propagate
来关闭几何体传播(意思是:帧的宽度和高度如下所示):

这样,您需要修改
arrange_grid
以将框架放入根窗口,然后忽略滚动条,因为它已经打包在框架中:

def arrange_grid(self):
    self.text_frame.grid(row=0, sticky=NSEW)
    self.button.grid(row=0, sticky=N, pady=32)
    self.tree_frame.grid(row=0, column=1, sticky=NSEW)

注意:您已经关闭了用户调整窗口大小的功能。我建议避免这种情况——用户通常更清楚他们想要的窗口大小。相反,您应该将GUI配置为在用户调整窗口大小时正确调整大小

因为您使用的是
网格
,所以您只需告诉tkinter哪些行和列因用户调整窗口大小而获得额外空间。由于所有内容都在一行中,因此只需为该行赋予权重:

root.grid_rowconfigure(0, weight=1)

树状视图将增长以适应其所有列,除非受窗口约束。除非你给它一个固定的尺寸,否则窗户会长到适合所有的孩子。现在的情况是,您给treeview添加了许多列,导致它增长。因为它在增长,所以窗口在增长,因为您没有限制它的增长

有几种解决方案。也许最简单的解决方案是把树放在一个框架中,这样你就可以给它一个明确的宽度和高度。关键是让框架控制其子对象的大小,而不是相反。这是通过禁用几何体传播来完成的

首先,先创建一个框架,然后将树放在框架中。我们还可以将滚动条放在框架中,这样我们就可以将树和滚动条视为一个单独的单元

self.tree_frame = tk.Frame(self.root, width=400, height=200)
self.tree = ttk.Treeview(self.treeframe)
self.scroll = ttk.Scrollbar(self.tree_frame, orient=HORIZONTAL, command=self.tree.xview)
self.tree.configure(xscrollcommand=self.scroll.set)
接下来,将treeview和滚动条添加到框架中。您可以使用
pack
place
grid
中的任何一种;我发现
pack
对于从上到下的布局更为优越。我们还使用
pack\u propagate
来关闭几何体传播(意思是:帧的宽度和高度如下所示):

这样,您需要修改
arrange_grid
以将框架放入根窗口,然后忽略滚动条,因为它已经打包在框架中:

def arrange_grid(self):
    self.text_frame.grid(row=0, sticky=NSEW)
    self.button.grid(row=0, sticky=N, pady=32)
    self.tree_frame.grid(row=0, column=1, sticky=NSEW)

注意:您已经关闭了用户调整窗口大小的功能。我建议避免这种情况——用户通常更清楚他们想要的窗口大小。相反,您应该将GUI配置为在用户调整窗口大小时正确调整大小

因为您使用的是
网格
,所以您只需告诉tkinter哪些行和列因用户调整窗口大小而获得额外空间。由于所有内容都在一行中,因此只需为该行赋予权重:

root.grid_rowconfigure(0, weight=1)