簡體   English   中英

如何在Python Tkinter中獲取Treeview和Scrollbar的全粘性網格?

[英]How to get an all sticky grid of Treeview and Scrollbar in Python Tkinter?

我在Python 2.7中的Tkinter中想要的是以下網格布局:

網格布局

但是,一旦我開始使用grid()函數而不是pack()函數,在運行腳本時什么也沒顯示。 以下是我所堅持的:

import Tkinter, ttk

class App(Tkinter.Frame):
    def __init__(self,parent):
        Tkinter.Frame.__init__(self, parent, relief=Tkinter.SUNKEN, bd=2)
        self.parent = parent        
        self.grid(row=0, column=0, sticky="nsew")
        self.menubar = Tkinter.Menu(self)
        try:
            self.parent.config(menu=self.menubar)
        except AttributeError:
            self.tk.call(self.parent, "config", "-menu", self.menubar)    

        self.tree = ttk.Treeview(self.parent)
        self.tree.grid(row=0, column=0, sticky="nsew")

        self.yscrollbar = ttk.Scrollbar(self, orient='vertical', command=self.tree.yview)
        self.yscrollbar.grid(row=0, column=1, sticky='nse')
        self.tree.configure(yscrollcommand=self.yscrollbar.set)
        self.yscrollbar.configure(command=self.tree.yview)

if __name__ == "__main__":
    root = Tkinter.Tk()
    root.title("MyApp")
    app = App(root)
    app.pack()
    app.mainloop()

任何幫助將不勝感激。

您有幾個影響布局的問題。

首先, App內的某些小部件使用self作為父級,一些使用self.parent 他們都應該在這種情況下使用self 因此,要做的第一件事是將Treeview的parent選項更改為self

self.tree = ttk.Treeview(self)

其次,由於您的主要代碼是調用app.pack() ,所以您不應該調用self.grid 刪除“ self.grid(行= 0,列= 0,sticky =“ nsew”)行。 這是多余的。

第三,您使用非常不尋常的代碼來添加菜單欄。 您需要配置根窗口的菜單。 無需將其放在try/except塊中,也沒有理由使用self.tk.call 只需執行以下操作:

self.parent.configure(menu=self.menubar)

假設self.parent確實是根窗口。 如果您不想強制執行該假設,則可以使用winfo_toplevel() ,該方法將始終返回最頂部的窗口:

self.parent.winfo_toplevel().configure(menu=self.menubar)

最后,由於您使用grid ,因此需要至少給一行和一列賦予“權重”,以便tkinter知道如何分配額外的空間(例如,當用戶調整窗口大小時)。

在您的情況下,您希望將所有權重賦予行和列0(零),因為這是您放置了需要最大空間的小部件的位置:

def __init__(self, parent):
    ...
    self.grid_rowconfigure(0, weight=1)
    self.grid_columnconfigure(0, weight=1)

注意:您還需要確保在調用app.pack()app.pack()提供參數,使其也可以填充額外的空間。 否則,樹將填充“ app”,但“ app”不會填充窗口。

app.pack(fill="both", expand=True)

這是所有這些更改的完整示例。 我將主布局代碼分組在一起,因為這使代碼更易於可視化和易於維護:

import Tkinter, ttk

class App(Tkinter.Frame):
    def __init__(self,parent):
        Tkinter.Frame.__init__(self, parent, relief=Tkinter.SUNKEN, bd=2)
        self.parent = parent        

        self.menubar = Tkinter.Menu(self)
        self.parent.winfo_toplevel().configure(menu=self.menubar)

        self.tree = ttk.Treeview(self)

        self.yscrollbar = ttk.Scrollbar(self, orient='vertical', command=self.tree.yview)
        self.tree.configure(yscrollcommand=self.yscrollbar.set)

        self.tree.grid(row=0, column=0, sticky="nsew")
        self.yscrollbar.grid(row=0, column=1, sticky='nse')
        self.yscrollbar.configure(command=self.tree.yview)

        self.grid_rowconfigure(0, weight=1)
        self.grid_columnconfigure(0, weight=1)

if __name__ == "__main__":
    root = Tkinter.Tk()
    root.title("MyApp")
    app = App(root)
    app.pack(fill="both", expand=True)
    app.mainloop()

您的問題提到了grid,但是在這種情況下,您可以使用pack節省幾行代碼。 pack在這樣的布局中表現出色,其中gui從上到下和/或從左到右對齊。 您需要做的就是用以下兩行替換最后五行(對grid ,grid_rowconfigure and grid_columnconfigure的調用):

self.yscrollbar.pack(side="right", fill="y")
self.tree.pack(side="left", fill="both", expand=True)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM