在tkinter中使用可滚动框架时初始化具有正确尺寸的窗口

问题描述 投票:1回答:1

我有以下代码,可滚动框架工作得非常好(感谢这里的所有其他海报)。现在有一件事让我感到困惑:如何管理代码以打开适合所有内容的应用程序窗口?

无论我做什么或尝试,应用程序窗口都会始终以某个默认大小(我猜为它的画布默认大小)打开,而不是适合其内容。在下面的示例中,我添加了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")
tkinter resize scrollable
1个回答
0
投票

如果您希望窗口在启动程序时适合所有内容,那么您需要查看您创建了多少个文本小部件,然后将其乘以宽度。

在这种情况下,我使用了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)

希望这对您有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.