调整tkinter窗口及其内容大小

1 投票
2 回答
4234 浏览
提问于 2025-04-20 17:50

我正在用Python的tkinter库来创建一个用户界面,这个界面里有一个matplotlib图形和一些按钮,但我在调整窗口和里面内容的大小时遇到了困难。我查看了一些这个网站上的例子和文档,按照我的理解,如果一个框架里面包含了其他小框架,要让它们一起调整大小,就需要单独配置每一个框架。每个框架都要设置一个权重,用来定义它能占用多少可用空间(这样理解对吗?)。但是,当我尝试按照下面的方式设置时,所有的框架都没有调整大小。另外,如果列的配置权重是零,而行的配置权重是1,这是否意味着它只会在一个方向上调整大小呢?

import Tkinter
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
class Application():
    def __init__(self, master):


        frame2 = Tkinter.Frame(master, height=510, width=770, bg='red')
        frame2.grid(row=0, column=0, sticky='nsew')
        frame2.columnconfigure(0, weight=1)
        frame2.rowconfigure(0, weight=1)

        frame2a = Tkinter.Frame(frame2, height=80, width=770, bg='blue') 
        frame2a.grid(row=0, column=0, sticky='nsew')
        frame2a.columnconfigure(0, weight=1)
        frame2a.rowconfigure(0, weight=1)        

        frame2b = Tkinter.Frame(frame2, height=410, width=770, bg='green') 
        frame2b.grid(row=1, column= 0, sticky='nsew')
        frame2b.columnconfigure(0, weight=1)
        frame2b.rowconfigure(1, weight=1)    

        # add plot
        fig = Figure(figsize=(9.5,5.2), facecolor='white')
        fig.add_subplot(111)        
        canvas = FigureCanvasTkAgg(fig, master=frame2b)

        canvas.show()
        canvas.get_tk_widget().pack(side='top', fill='both', expand=1)

if __name__ == '__main__' :

    root = Tkinter.Tk()
    root.geometry("770x510")
    app = Application(root)
    root.mainloop()

2 个回答

0

这里提到的 rowconfigure 是要应用在容器上,而不是容器里面的东西。你有一个叫 frame 2 的框架,它里面包含了 frame2aframe2b。所以,除了要用 frame2.rowconfigure(0, weight=1) 给第0行(也就是 frame2a)设置一个权重为1之外,你还需要加上 frame2.rowconfigure(1, weight=1),这样才能让另一行的权重也一样。另一方面,像 frame2[ab].[row|column]configure(...) 这样的四行代码其实是多余的。

1

你使用 columnconfigurerowconfigure 的方法是对的,但你忘了一件事:你没有在 窗口上使用这些方法。所以,实际上你应该这样做:

def __init__(self, master):
    master.columnconfigure(0, weight=1)
    master.rowconfigure(0, weight=1)

关于你问的另一个问题(如果 columnconfigure 的权重是零,而 rowconfigure 的权重是 1,这是否意味着它只会在一个方向上调整大小?):是的,你说得对,这样的话,窗口或控件只会在一个方向上扩展,或者根本不扩展。

另外,由于你使用 grid 来动态调整大小,heightwidth 这两个参数就没用了。

撰写回答