自动调整 tkinter 窗口以适合所有小部件

8
我希望主要的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决定窗口的大小。您可以展示一个 [mcve] 来说明问题所在吗? - Bryan Oakley
1
那段代码远远不够。我们需要知道runScript做了什么,并且需要看到足够的代码来运行你的代码。你的代码中可能有一些东西阻止了窗口的调整大小,但是如果没有看到一个小的可工作程序,就无法知道原因。 - Bryan Oakley
好的,如果你需要其他东西,请告诉我。我尝试在框架内使用pack()来调整按钮大小,但是这并没有增加窗口的大小,所以我采用了另一种方法,即获取框架的高度并再次设置窗口大小。然而,这是一个hack,我不想这样做。 - E. Oregel
代码无法运行。它缺少一个导入语句,缩进不正确,并且您正在使用未先定义的变量screen_widthscreen_height。此外,您使用了self但是您还没有定义一个类。还有许多其他问题。 - Bryan Oakley
1
当您设置窗口大小时,可以防止其自动调整大小。 - Artemis
显示剩余6条评论
2个回答

10

您正在使用此行代码显式地设置窗口的特定大小:

masterWindow.geometry("%dx%d" % (self.window_width, self.window_height))
因为你这样做,tkinter将保持窗口大小,即使你添加了小部件。 如果你想自动调整大小,需要删除那行代码。
此外,如果用户调整了窗口大小,tkinter会尝试保留该大小。 如果您希望在添加新小部件时自动调整大小,则需要删除窗口大小,以便tkinter可以计算它。 您可以通过调用masterWindow.geometry("")来实现。

1
我在我的答案中保留了 self.window_start_xself.window_start_y,因为我实际上想定义窗口出现的位置。但这是正确的。移除窗口大小的定义后,当添加小部件时,窗口会动态调整大小。 - E. Oregel

3
我找到了问题所在。问题是我在代码块中为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))

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接