我有以下代码,可滚动框架工作得非常好(感谢这里的所有其他海报)。现在有一件事让我感到困惑:如何管理代码以打开适合所有内容的应用程序窗口?
无论我做什么或尝试,应用程序窗口都会始终以某个默认大小(我猜为它的画布默认大小)打开,而不是适合其内容。在下面的示例中,我添加了20个文本标签来显示行为。创建的窗口仅适合这些标签中的14个。其他的都在那里,并且可以滚动,但是我希望启动窗口可以立即容纳所有内容。
首先,我想避免为tk()窗口设置固定大小。老实说,我不完全理解我从其他线程收集的代码,但是除了我刚刚描述的问题之外,其他所有方法都有效。
import tkinter as tk
from tkinter import ttk
class mainWindow():
''' Master class of the gui window. '''
def __init__(self,appName):
self.window = tk.Tk()
self.window.title(appName)
self.canvas = tk.Canvas(self.window)
self.GlobalContentFrame = tk.Frame(self.canvas, background="#ffffff")
self.vsb = tk.Scrollbar(self.window, orient="vertical", command=self.canvas.yview)
self.canvas.configure(yscrollcommand=self.vsb.set)
self.vsb.pack(side=tk.RIGHT, fill="y")
self.canvas.pack(side=tk.LEFT, fill="both",expand=1)
self.canvas.create_window((1,1), window=self.GlobalContentFrame, anchor="nw",tags="self.GlobalContentFrame")
self.GlobalContentFrame.bind("<Configure>", self.onFrameConfigure)
self.canvas.bind("<Configure>", self.onCanvasConfigure)
for p in range(20):
label = ttk.Label(self.GlobalContentFrame,text="test")
label.grid(column=0,row=p,sticky=tk.EW)
self.window.mainloop()
def onCanvasConfigure(self,event):
w,h = event.width, event.height
natural = self.GlobalContentFrame.winfo_reqwidth()
self.canvas.itemconfigure("inner", width= w if w>natural else natural)
self.canvas.configure(scrollregion=self.canvas.bbox("all"))
def onFrameConfigure(self, event):
'''Reset the scroll region to encompass the inner frame'''
self.canvas.configure(scrollregion=self.canvas.bbox("all"))
appWin = mainWindow("test")
如果您希望窗口在启动程序时适合所有内容,那么您需要查看您创建了多少个文本小部件,然后将其乘以宽度。
在这种情况下,我使用了19.5
,但是您可以尝试使用任何数字,具体取决于字体大小。您必须将num
文本小部件的数量传递给mainWindow()
功能。
下面我给35
作为num的值:
import tkinter as tk
from tkinter import ttk
class mainWindow():
''' Master class of the gui window. '''
def __init__(self,appName, num):
self.num = num
self.window = tk.Tk()
self.window.title(appName)
self.RESOLUTION = str(int(300)) + "x" + str(int(int(self.num) * 19.5))
self.window.geometry(self.RESOLUTION)
self.canvas = tk.Canvas(self.window)
self.GlobalContentFrame = tk.Frame(self.canvas, background="#ffffff")
self.vsb = tk.Scrollbar(self.window, orient="vertical", command=self.canvas.yview)
self.canvas.configure(yscrollcommand=self.vsb.set)
self.vsb.pack(side=tk.RIGHT, fill="y")
self.canvas.pack(side=tk.LEFT, fill="both",expand=1)
self.canvas.create_window((1,1), window=self.GlobalContentFrame, anchor="nw",tags="self.GlobalContentFrame")
self.GlobalContentFrame.bind("<Configure>", self.onFrameConfigure)
self.canvas.bind("<Configure>", self.onCanvasConfigure)
for p in range(num):
label = ttk.Label(self.GlobalContentFrame,text="test")
label.grid(column=0,row=p,sticky=tk.EW)
self.window.mainloop()
def onCanvasConfigure(self,event):
w,h = event.width, event.height
natural = self.GlobalContentFrame.winfo_reqwidth()
self.canvas.itemconfigure("inner", width= w if w>natural else natural)
self.canvas.configure(scrollregion=self.canvas.bbox("all"))
def onFrameConfigure(self, event):
'''Reset the scroll region to encompass the inner frame'''
self.canvas.configure(scrollregion=self.canvas.bbox("all"))
appWin = mainWindow("test", 35)
希望这对您有帮助!