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