[英]tkinter: How to have one labelframe under another expand as the page grows without leaving space between the two frames, using grid()
我提前向 tkinter 新手道歉。 我正在制作一个搜索工具来查找名字(用户名),目前正在前端工作。 在进行这项工作时,我已经开始使用粘性来帮助不同的部分在用户调整页面大小时伸展。 我当前的问题是,当我向下/向南拉伸它时,在第一个顶部和底部 LabelFrame 之间创建了一堆空间。 我想要的是底部标签框架随着用户拉伸页面而拉伸,而不是让它创建不需要的空间。
我为第二个框架使用了 sticky nsew,这样它就可以随着页面增长而不会脱离顶部标签框架。 我会让顶部标签框架粘在南边,但这会使标签框架随着页面向下拉伸而增长。 下面是我的代码。
def query_window(conn):
window.destroy()
q_window = Tk()
q_window.title('Moniker Lookup')
q_window.columnconfigure(0, weight=1)
q_window.rowconfigure(0, weight=1)
path = os.path.realpath(
os.path.join(os.getcwd(), os.path.dirname(__file__)))
icon = PhotoImage(file = path + "..\\assets\main_icon.png")
q_window.iconphoto(False, icon)
#q_window.geometry("700x700")
#Create a search frame for the moniker search to sit in
search_frame = tk.LabelFrame(q_window, text='Moniker Search')
search_frame.rowconfigure(0, weight=1)
search_frame.columnconfigure(0, weight=1)
search_frame.grid(row = 0, column=0, pady=GLOBAL_PAD_Y, padx=GLOBAL_PAD_X, sticky="nw")
#Create a results frame for the treeview widget to sit in.
output_frame = tk.LabelFrame(q_window, text='Results')
output_frame.rowconfigure(0, weight=1)
output_frame.columnconfigure(0, weight=1)
output_frame.grid(row = 1, column=0, pady=GLOBAL_PAD_Y, padx=GLOBAL_PAD_X, sticky="nsew")
#Create area for user to provide Moniker
moniker_label = tk.Label(search_frame, text="Moniker:")
moniker_label.grid(row=0, column = 2, pady = GLOBAL_PAD_Y, padx = GLOBAL_PAD_X)
moniker_field = tk.Entry(search_frame)
moniker_field.grid(row=0, column = 3, pady=GLOBAL_PAD_Y, padx=GLOBAL_PAD_X, columnspan=2)
#Create a run button
run_button = tk.Button(search_frame, text="Run", command=lambda:
moniker_query(moniker_field, conn, q_window), width=10)
run_button.grid(row=0, column = 5, pady = GLOBAL_PAD_Y, padx = GLOBAL_PAD_X)
#Create a treeview to display output
tv1 = ttk.Treeview(output_frame)
tv1.columnconfigure(0, weight=1)
tv1.rowconfigure(0, weight=1)
#Create the tree scrolls
tree_scroll_y = tk.Scrollbar(output_frame, orient = "vertical", command=tv1.yview)
tree_scroll_x = tk.Scrollbar(output_frame, orient="horizontal", command=tv1.xview)
tv1.configure(xscrollcommand=tree_scroll_x.set, yscrollcommand=tree_scroll_y.set)
tv1.grid(row=0, column=0, pady = GLOBAL_PAD_Y, padx = GLOBAL_PAD_X, sticky="nsew")
tree_scroll_x.grid(row=1, column=0, sticky=tk.E+tk.W)
tree_scroll_x.grid_rowconfigure(0, weight=1)
tree_scroll_y.grid(row=0, column=1, sticky=tk.N+tk.S)
tree_scroll_x.grid_columnconfigure(0, weight=1)
此外,这是我的默认页面打开时的样子,然后是我拉伸页面时的样子。
您对.rowconfigure
有点困惑。 设置weight=1
时,调整大小来自父级。 我将它们移近了它们所影响的小部件。 没错, Scrollbar
的大小是.grid_rowconfigure
本身的一种方法。 这是一个工作示例。
from tkinter import *
from tkinter import ttk
GLOBAL_PAD_Y = 10
GLOBAL_PAD_X = 10
q_window = Tk()
q_window.title('Moniker Lookup')
q_window.geometry("250x200")
# path = os.path.realpath(
# os.path.join(os.getcwd(), os.path.dirname(__file__)))
# icon = PhotoImage(file=path + "..\\assets\main_icon.png")
# q_window.iconphoto(False, icon)
#q_window.geometry("700x700")
# Create a search frame for the moniker search to sit in
q_window.columnconfigure(0, weight=1)
search_frame = LabelFrame(q_window, text='Moniker Search')
search_frame.grid(row=0, column=0, pady=GLOBAL_PAD_Y, padx=GLOBAL_PAD_X, sticky="new")
# Create a results frame for the treeview widget to sit in.
q_window.rowconfigure(1, weight=1)
q_window.columnconfigure(0, weight=1)
output_frame = LabelFrame(q_window, text='Results')
output_frame.grid(row=1, column=0, pady=GLOBAL_PAD_Y, padx=GLOBAL_PAD_X, sticky="nsew")
# Create area for user to provide Moniker
search_frame.columnconfigure(0, weight=1)
search_frame.columnconfigure(1, weight=1)
search_frame.columnconfigure(2, weight=1)
moniker_label = Label(search_frame, text="Moniker:")
moniker_label.grid(row=0, column=0, pady=GLOBAL_PAD_Y, padx=GLOBAL_PAD_X, sticky='e')
moniker_field = Entry(search_frame)
moniker_field.grid(row=0, column=1, pady=GLOBAL_PAD_Y, padx=GLOBAL_PAD_X, sticky='we')
# Create a run button
run_button = Button(search_frame, text="Run", command=lambda: print("run"), width=10)
run_button.grid(row=0, column=2, pady=GLOBAL_PAD_Y, padx=GLOBAL_PAD_X, sticky='w')
# Create a treeview to display output
output_frame.columnconfigure(0, weight=1)
output_frame.rowconfigure(0, weight=1)
tv1 = ttk.Treeview(output_frame)
tv1.grid(row=0, column=0, pady=GLOBAL_PAD_Y, padx=GLOBAL_PAD_X, sticky="nsew")
# Create the tree scrolls
tree_scroll_y = ttk.Scrollbar(output_frame, orient="vertical", command=tv1.yview)
tree_scroll_x = ttk.Scrollbar(output_frame, orient="horizontal", command=tv1.xview)
tree_scroll_x.grid(row=1, column=0, sticky="ew")
tree_scroll_y.grid(row=0, column=1, sticky="ew")
tree_scroll_y.grid_rowconfigure(0, weight=1)
tree_scroll_x.grid_columnconfigure(0, weight=1)
tv1.configure(xscrollcommand=tree_scroll_x.set, yscrollcommand=tree_scroll_y.set)
q_window.mainloop()
我了解到您销毁了主应用程序窗口并创建了一个新窗口。 最好将 Toplevel 用于这些目的,最小化或隐藏主窗口,并仅在程序结束时销毁它,因为主循环与它相关联。
尝试添加
q_window.rowconfigure(1, weight=1)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.