繁体   English   中英

tkinter:如何使用 grid() 随着页面的增长在两个框架之间不留空间的情况下在另一个标签框架下展开

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM