我有一个 tkinter 应用程序,它将用于多种屏幕尺寸。我想在左侧放置一个列表框,并在其下方放置一些按钮。我还有一个标签要放在列表框的顶部。我正在使用
grid
管理来放置所有小部件,使其与不同的屏幕尺寸保持一致。到目前为止,我可以将它们全部与屏幕左对齐,但我想将列表框向上移动一点,这样顶部就没有空间了。我该如何管理?
这是一个MWE
import tkinter as tk
from tkinter import ttk
from tkmacosx import Button
class Window(tk.Tk):
def __init__(self,*args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
tk.Tk.wm_title(self, "OCTOLE")
container = tk.Frame(self)
container.pack(side="top", fill="both", expand = True)
container.grid_rowconfigure(0, weight=1)
container.grid_columnconfigure(0, weight=1)
self.frames = {}
for F in (StartPage, PageOne, PageTwo):
frame = F(container, self)
self.frames[F] = frame
frame.grid(row=0, column=0, sticky="nsew")
self.show_frame(StartPage)
self.attributes("-topmost", False)
self.wm_state('zoomed')
def show_frame(self, cont):
frame = self.frames[cont]
frame.tkraise()
class StartPage(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self,parent,bg='#192232')
toolbar0 = tk.Frame(self,bg="#393951")
toolbar0.grid_rowconfigure(0, weight=1)
toolbar0.grid_columnconfigure(0, weight=1)
toolbar0.pack(side=tk.TOP, fill=tk.X)
label = ttk.Label(toolbar0, text="OLE Analyser")
label.place(relx=0.5, rely=0.5, anchor="center")
exit_btn = Button(toolbar0, text="EXIT",command=lambda: app.destroy())
exit_btn.pack(side="right", padx=5, pady=5)
button2 = Button(toolbar0, text="Comparison",command=lambda: controller.show_frame(PageTwo))
button2.pack(side="right", padx=5, pady=5)
button1 = Button(toolbar0, text="Analysis",command=lambda: controller.show_frame(PageOne))
button1.pack(side="right", padx=5, pady=5)
class PageOne(tk.Frame):
def __init__(self,parent, controller):
tk.Frame.__init__(self, parent,bg='#192232')
toolbar1 = tk.Frame(self,bg="#393951")
toolbar1.pack(side=tk.TOP, fill=tk.X)
label = ttk.Label(toolbar1, text="Analysis")
label.place(relx=0.5, rely=0.5, anchor="center")
exit_btn = Button(toolbar1, text="EXIT",command=lambda: app.destroy())
exit_btn.pack(side="right", padx=5, pady=5)
button2 = Button(toolbar1, text="Comparison",command=lambda: controller.show_frame(PageTwo))
button2.pack(side="right", padx=5, pady=5)
button1 = Button(toolbar1, text="Home",command=lambda: controller.show_frame(StartPage))
button1.pack(side="right", padx=5, pady=5)
frame = tk.Frame(self, bg='#192232')
frame.pack(side="left", padx=15, pady=5)
files_label = tk.Label(frame,text="Spectrum Files",bg='#192232', fg= '#C4BDED',font=16)
files_label.grid(row=0, column=0, sticky="w")
scrollbarx = ttk.Scrollbar(frame, orient=tk.HORIZONTAL)
scrollbarx.grid(row=2, column=0, sticky="ew")
listb = tk.Listbox(frame, selectmode = "multiple",height=40,width=40,bd=3,xscrollcommand=scrollbarx.set)
listb.grid(row=1, column=0, sticky="n")
browse_btn = Button(frame,text="Browse",borderless=True,command=lambda: ask())
browse_btn.grid(row=3, column=0, sticky="w")
clb_btn = Button(frame,text="Clear Files",borderless=True,command=lambda:clear_listbox())
clb_btn.grid(row=3, column=0, sticky="e")
submit_btn = Button(frame,text="Submit Selection",command=lambda:sumit())
submit_btn.grid(row=4, column=0, sticky="w")
def ask():
pass
scrollbarx.config(command=listb.xview)
def sumit():
pass
def clear_listbox():
listb.delete(0,tk.END)
class PageTwo(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent,bg='#192232')
toolbar2 = tk.Frame(self,bg="#393951")
toolbar2.pack(side=tk.TOP, fill=tk.X)
if __name__ == "__main__":
app = Window()
app.update()
app.mainloop()
问题不在于您使用
grid
。问题在于您使用pack
.
您已经将列表框所在的框架打包到左侧,但您没有要求框架填充它分配的空间。像下面这样的东西会导致框架从上到下填充左侧,导致列表框出现在顶部:
frame.pack(side="left", padx=15, pady=5, fill="y")