[英]Can't resize treeview with grid on tkinter
I am unable to resize the treeview widget on tkinter with a grid layout. 我无法使用网格布局调整tkinter上的treeview小部件。 I tried using
columnconfigure
and rowconfigure
with weight
but it does not work. 我尝试使用
columnconfigure
和rowconfigure
weight
但它不起作用。 When I run it, the treeview does not fill the empty space when I stretch the window it is in. 当我运行它时,当我拉伸它所在的窗口时,树视图不会填充空白区域。
def __init__(self, master):
self.master = master
tk.Frame.__init__(self, self.master)
self.create_widgets()
def create_widgets(self):
# button to request data
self.request_button = tk.Button(root, text="Send", command=self.req_client)
self.request_button.grid(row=0, column=0, rowspan=2, columnspan=3)
# timer label
self.timer_label = tk.Label(root, text="Timer Settings")
self.timer_label.grid(row=0, column=3, columnspan=2, pady=3, sticky=tk.NSEW)
# create tk variable
self.timervar = tk.StringVar(root)
# dropdown dictionary
self.timerDict = {"-", "5 minutes", "10 minutes", "15 minutes"}
self.timervar.set("-") # <-- set the default value
# timer dropdown menu
self.timer_option = tk.OptionMenu(root, self.timervar, *self.timerDict, command=self.req_timer)
self.timer_option.grid(row=1, column=3, columnspan=2, padx=3, pady=3, sticky=tk.NSEW)
# scroll bar for the terminal outputs
self.terminal_scrollbar = tk.Scrollbar(root)
self.terminal_scrollbar.grid(row=2, column=5, sticky=tk.NS)
# terminal output
self.terminal_tree = ttk.Treeview(root)
self.terminal_tree.grid(row=2, column=0, columnspan=5, sticky=tk.NSEW)
self.terminal_tree.configure(yscrollcommand=self.terminal_scrollbar.set)
self.terminal_tree.columnconfigure(0, weight=1)
self.terminal_tree.rowconfigure(0, weight=1)
self.terminal_tree["columns"] = ("1")
self.terminal_tree['show'] = 'headings'
self.terminal_tree.column("1", width=100, anchor='c')
self.terminal_tree.heading("1", text="Example")
First: if you use Frame
to create class then you should use this frame ( self
) as parent for widgets (instead of using root
) 首先:如果你使用
Frame
来创建类,那么你应该使用这个框架( self
)作为小部件的父级(而不是使用root
)
After that ... 之后 ...
Second: you have to resize Frame
( self
) so it will use full window 第二:你必须调整
Frame
( self
)的大小,所以它将使用完整的窗口
self.pack(fill='both', expand=True)
Because Treeview
is inside Frame
then you have to use columnconfigure
with Frame
因为
Treeview
在Frame
所以你必须使用带有Frame
columnconfigure
self.columnconfigure(0, weight=1) # column with treeview
self.rowconfigure(2, weight=1) # row with treeview
Working example. 工作实例。 I commented
command=
to run it. 我评论
command=
运行它。
(BTW: I used bg="red"
in Frame
to see if Frame
is resizing) (顺便说一下:我在
Frame
使用bg="red"
来查看Frame
是否正在调整大小)
import tkinter as tk
from tkinter import ttk
class Main(tk.Frame):
def __init__(self, master):
self.master = master
tk.Frame.__init__(self, self.master) # , bg="red")
self.pack(fill='both', expand=True)
self.create_widgets()
def create_widgets(self):
# button to request data
self.request_button = tk.Button(self, text="Send") #, command=self.req_client)
self.request_button.grid(row=0, column=0, rowspan=2, columnspan=3)
# timer label
self.timer_label = tk.Label(self, text="Timer Settings")
self.timer_label.grid(row=0, column=3, columnspan=2, pady=3, sticky=tk.NSEW)
# create tk variable
self.timervar = tk.StringVar(self)
# dropdown dictionary
self.timerDict = {"-", "5 minutes", "10 minutes", "15 minutes"}
self.timervar.set("-") # <-- set the default value
# timer dropdown menu
self.timer_option = tk.OptionMenu(self, self.timervar, *self.timerDict) #, command=self.req_timer)
self.timer_option.grid(row=1, column=3, columnspan=2, padx=3, pady=3, sticky=tk.NSEW)
# scroll bar for the terminal outputs
self.terminal_scrollbar = tk.Scrollbar(self)
self.terminal_scrollbar.grid(row=2, column=5, sticky=tk.NS)
# terminal output
self.terminal_tree = ttk.Treeview(self)
self.terminal_tree.grid(row=2, column=0, columnspan=5, sticky=tk.NSEW)
self.terminal_tree.configure(yscrollcommand=self.terminal_scrollbar.set)
self.terminal_tree["columns"] = ("1")
self.terminal_tree['show'] = 'headings'
self.terminal_tree.column("1", width=100, anchor='c')
self.terminal_tree.heading("1", text="Example")
self.columnconfigure(0, weight=1) # column with treeview
self.rowconfigure(2, weight=1) # row with treeview
root = tk.Tk()
Main(root)
root.mainloop()
You may have to use frame inside first row to better organize button and optionmenu. 您可能必须在第一行内使用框架以更好地组织按钮和选项菜单。
EDIT: after changing options in some grid()
and changing rowconfigure()
编辑:更改某些
grid()
选项和更改rowconfigure()
import tkinter as tk
from tkinter import ttk
class Main(tk.Frame):
def __init__(self, master):
self.master = master
tk.Frame.__init__(self, self.master) # , bg="red")
self.pack(fill='both', expand=True)
self.create_widgets()
def create_widgets(self):
# button to request data
self.request_button = tk.Button(self, text="Send") #, command=self.req_client)
self.request_button.grid(row=0, column=0, rowspan=2)
# timer label
self.timer_label = tk.Label(self, text="Timer Settings")
self.timer_label.grid(row=0, column=1, pady=3, sticky=tk.NSEW)
# create tk variable
self.timervar = tk.StringVar(self)
# dropdown dictionary
self.timerDict = {"-", "5 minutes", "10 minutes", "15 minutes"}
self.timervar.set("-") # <-- set the default value
# timer dropdown menu
self.timer_option = tk.OptionMenu(self, self.timervar, *self.timerDict) #, command=self.req_timer)
self.timer_option.grid(row=1, column=1, padx=3, pady=3, sticky=tk.NSEW)
# scroll bar for the terminal outputs
self.terminal_scrollbar = tk.Scrollbar(self)
self.terminal_scrollbar.grid(row=2, column=5, sticky=tk.NS)
# terminal output
self.terminal_tree = ttk.Treeview(self)
self.terminal_tree.grid(row=2, column=0, columnspan=3, sticky=tk.NSEW)
self.terminal_tree.configure(yscrollcommand=self.terminal_scrollbar.set)
self.terminal_tree["columns"] = ("1")
self.terminal_tree['show'] = 'headings'
self.terminal_tree.column("1", width=100, anchor='c')
self.terminal_tree.heading("1", text="Example")
self.columnconfigure(2, weight=1) # column with treeview
self.rowconfigure(2, weight=1) # row with treeview
root = tk.Tk()
Main(root)
root.mainloop()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.