带有小部件的可滚动 tkinter canvas 仅填充了一半的框架
Scrollable tkinter canvas with widgets is only filling half the frame
我尝试在 tkinter 中执行可滚动的 canvas 方法,但是 canvas 从上到下只填充了一半的屏幕,它向两侧填充了屏幕。
class Application(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
tk.Tk.iconbitmap(self, default = "icon.ico")
tk.Tk.wm_title(self, "name")
tk.Tk.geometry(self, "1024x576")
container = tk.Frame(self)
container.pack(side = "top", fill = "both", expand = True)
self.frames = {}
for F in (Frame1, Frame2, ...):
frame = F(container, self)
self.frames[F] = frame
frame.grid(row = 0, column = 0, sticky = "nsew")
self.show_frame(Frame1)
def show_frame(self, cont):
frame = self.frames[cont]
frame.tkraise()
class Frame2(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.canvas = tk.Canvas(self, borderwidth=0, background="#ffffff")
self.frame = tk.Frame(self.canvas, background="#ffffff")
self.vsb = tk.Scrollbar(self, orient="vertical", command=self.canvas.yview)
self.canvas.configure(yscrollcommand=self.vsb.set)
self.vsb.pack(side="right", fill="y", expand=False)
self.canvas.pack(side="left", fill="both", expand=True)
self.canvas.create_window((0,0), window=self.frame, anchor="nw", tags="self.frame")
self.frame.bind("<Configure>", self.onFrameConfigure)
for i in range(n):
"a bunch of widgets".grid(column = 0, row = i)
def onFrameConfigure(self, event):
self.canvas.configure(scrollregion=self.canvas.bbox("all"))
grid
不会自动调整小部件的大小。
您可以告知 container
(作为使用 frame.grid
的 frame
的父项)网格中的哪些行和列可以使用更多 space并调整小部件的大小。 (不同的rows/columns可能会有不同的weight
)
container.rowconfigure(0, weight=1)
container.columnconfigure(0, weight=1)
for F in (Frame2, ):
frame = F(container, self)
self.frames[F] = frame
frame.grid(row=0, column=0, sticky="news")
或者您可以使用 frame.pack()
而不是 frame.grid()
for F in (Frame2, ):
frame = F(container, self)
self.frames[F] = frame
frame.pack(fill='both', expand=True)
我尝试在 tkinter 中执行可滚动的 canvas 方法,但是 canvas 从上到下只填充了一半的屏幕,它向两侧填充了屏幕。
class Application(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
tk.Tk.iconbitmap(self, default = "icon.ico")
tk.Tk.wm_title(self, "name")
tk.Tk.geometry(self, "1024x576")
container = tk.Frame(self)
container.pack(side = "top", fill = "both", expand = True)
self.frames = {}
for F in (Frame1, Frame2, ...):
frame = F(container, self)
self.frames[F] = frame
frame.grid(row = 0, column = 0, sticky = "nsew")
self.show_frame(Frame1)
def show_frame(self, cont):
frame = self.frames[cont]
frame.tkraise()
class Frame2(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.canvas = tk.Canvas(self, borderwidth=0, background="#ffffff")
self.frame = tk.Frame(self.canvas, background="#ffffff")
self.vsb = tk.Scrollbar(self, orient="vertical", command=self.canvas.yview)
self.canvas.configure(yscrollcommand=self.vsb.set)
self.vsb.pack(side="right", fill="y", expand=False)
self.canvas.pack(side="left", fill="both", expand=True)
self.canvas.create_window((0,0), window=self.frame, anchor="nw", tags="self.frame")
self.frame.bind("<Configure>", self.onFrameConfigure)
for i in range(n):
"a bunch of widgets".grid(column = 0, row = i)
def onFrameConfigure(self, event):
self.canvas.configure(scrollregion=self.canvas.bbox("all"))
grid
不会自动调整小部件的大小。
您可以告知 container
(作为使用 frame.grid
的 frame
的父项)网格中的哪些行和列可以使用更多 space并调整小部件的大小。 (不同的rows/columns可能会有不同的weight
)
container.rowconfigure(0, weight=1)
container.columnconfigure(0, weight=1)
for F in (Frame2, ):
frame = F(container, self)
self.frames[F] = frame
frame.grid(row=0, column=0, sticky="news")
或者您可以使用 frame.pack()
而不是 frame.grid()
for F in (Frame2, ):
frame = F(container, self)
self.frames[F] = frame
frame.pack(fill='both', expand=True)