簡體   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