【问题标题】:Auto resize tkinter window to fit all widgets自动调整 tkinter 窗口大小以适应所有小部件
【发布时间】:2018-11-30 01:05:42
【问题描述】:

我想为 tkinter 主窗口设置动态大小,以便在添加新小部件时无需更改窗口大小。相反,主窗口将考虑该小部件的大小并自动增加其高度/宽度以适应该窗口中的小部件。

        masterWindow = Tk()

        #Main Window min width
        self.window_width = screen_width * .01
        self.window_height = screen_height * .04

        #Window startst in center of screen
        self.window_start_x = (screen_width/2)
        self.window_start_y = (screen_height/2)
        masterWindow.geometry("%dx%d+%d+%d" % (self.window_width, self.window_height, self.window_start_x, self.window_start_y))
        self.buttonsFrame.pack(side = TOP)
        button_width = 13
        button_height = 2

        #A simple dict that stores script name strings
        for script in SCRIPTS.keys():
            #Remove script extension
            script_name = script.split(".")[0]
            button_width = 13
            button_height = 2
            BUTTONS[script] = Button(self.buttonsFrame, text = script, width = button_width, height = button_height, justify = LEFT, wraplength = 100, command = lambda s = script: self.runScript(s))
            BUTTONS[script].grid(row = self.row, column = self.col)
            self.update()

            #Increment row and col and set new window size
            if self.col == 2:
                self.col = 0
                self.row += 1
                reached_max_width = True
            else:
                self.col += 1
                if not reached_max_width:
                    self.window_width += button_width * 13
            self.window_height = self.buttonsFrame.winfo_height() * (self.row*3)
            masterWindow.geometry("%dx%d" % (self.window_width, self.window_height))


        def runScript(self, script):
            print(script)

【问题讨论】:

  • 框架会自动展开。您可以发布一些代码以便我们解决您的具体问题吗?
  • 如果你使用pack 和/或grid,Tkinter 会自动执行此操作,并让 tkinter 决定窗口的大小。你能告诉我们一个minimal reproducible example来说明你遇到的问题吗?
  • 该代码还不够。我们需要知道runScript 做了什么,我们需要看到足够的代码来运行你的代码。您的代码中可能有一些东西阻止了窗口调整大小,但是如果没有看到 small 工作程序,就无法知道。
  • 你去。如果你想要别的东西,请告诉我。我尝试将pack() 用于框架内的按钮,但这并没有增加窗口大小,所以我采取了这条路线,获取框架的高度并再次设置窗口大小。然而,这是一个 hack,我不想这样做。
  • 设置窗口大小时,会阻止它自动调整大小。

标签: python tkinter


【解决方案1】:

您正在使用这行代码将窗口显式设置为特定大小:

masterWindow.geometry("%dx%d" % (self.window_width, self.window_height))

因为您正在这样做,所以即使您添加小部件,tkinter 也会将窗口保持在该大小。如果您希望它自动调整大小,则需要删除该行代码。

此外,如果用户调整窗口大小,tkinter 将尝试采用该大小。如果您希望它在添加新小部件时自动调整大小,您需要删除窗口大小以便 tkinter 可以计算它。你可以通过调用masterWindow.geometry("")来做到这一点。

【讨论】:

  • 我在答案中留下了self.window_start_xself.window_start_y,因为我实际上想定义窗口出现的位置。但这是正确的。删除窗口大小的定义使窗口在添加小部件时动态调整大小。
【解决方案2】:

我发现了问题。问题是我在代码块中为 Tkinter mainWindow 设置了初始宽度/高度:

#Main Window min width
self.window_width = screen_width * .01
self.window_height = screen_height * .04
masterWindow.geometry("%dx%d+%d+%d" % (self.window_width, self.window_height, self.window_start_x, self.window_start_y))

我从几何图形中删除了该尺寸定义和设置,因此代码如下所示,并且有效:

masterWindow.geometry("+%d+%d" % (self.window_start_x, self.window_start_y))

现在窗口会自动调整大小以适应所有按钮。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-01
    相关资源
    最近更新 更多