首页 文章

Tkinter画布设置为它的容器大小[重复]

提问于
浏览
0

这个问题在这里已有答案:

我有一个关于使用Tkinter Canvas对象在Python中创建GUI的问题 .

创建框架对象时,请为其指定所需的宽度和高度 . 有没有办法检测它的容器的大小,并使用它的宽度和高度?

例如,假设您想要创建一个Canvas,它总是占用等于屏幕整个右上角的空间,即使您的窗口要调整大小,或者您要使用另一个程序中包含的Frame . 也许有另一个框架占用其他屏幕空间 .

以此为例:

import tkinter as tk

root = tk.Tk()
root.geometry("800x480")
container = tk.Frame(root, bg = "yellow")
container.pack(expand = True, fill = "both")
drawArea = tk.Canvas(container, bg = "red")
drawArea.pack()

在上面的代码中,画布不会占据它所放置的整个黄色框架 . 我知道如果我想将它设置为黄色框架的完整尺寸,我将 expand = True, fill = "both" 添加到 .pack() 语句中 . 但是,如果我只想要它是帧的2/3呢?或框架宽度和高度的一半?有可能吗?

也许我在Googling吮吸,但我似乎无法在网上找到任何信息:\

3 回答

  • 0

    在代码中,当您在框架中打包画布时,将“expand”关键字设置为True,将“fill”关键字设置为“both”(或tkinter.BOTH) . 如果您使用网格,则需要使用此代码(将名称“f”作为框架:

    f.grid_rowconfigure(0, weight=1)
    f.grid_columnconfigure(0, weight=1)
    

    然后,当您对画布进行网格化时,将“sticky”关键字设置为“nsew”(或tkinter.NSEW) . 在上面的代码中,如果将0替换为画布将在其中的行和网格数,并将权重替换为您希望画布填充的GUI的任何部分 . 这应该工作 .

  • 1

    在你写的一条评论中:

    我特别询问如何制作像Canvas这样的东西,只占据放入其中的容器的一部分 .

    有很多方法可以实现这一目标 . 正如您所推测的,一种方法是获取容器的尺寸,然后相应地设置窗口小部件的尺寸 .

    您还可以使用几何管理器为您管理 . 例如,您可以使用 grid 将画布放置在特定的行和列中,然后安排该行和/或列恰好具有容器高度和/或宽度的1/4 .

    您也可以使用 place 而不是 gridpack . place 非常擅长调整小部件和放置相对于其他小部件的小部件 . 例如,您可以将 relwidth 设置为.25,以使窗口小部件的宽度为父窗口宽度的1/4 .

    哪种选择是正确的选择取决于许多因素,主要与屏幕上其他小部件以及它们应如何交互有关 . 如果不了解整个应用程序的更多细节而不仅仅是一个窗口,则无法提供更具体的建议 .

  • 1

    做了一些猜测工作,但我设法完成了我想做的事情 .

    import tkinter as tk
    
    root = tk.Tk()
    container = tk.Frame(root, bg = "yellow")
    container.pack(expand = true, fill = "both")
    drawArea = tk.Canvas(container, bg = "red")
    drawArea.update()
    drawArea.configure(width = container.winfo_width(), height = winfo_height())
    drawArea.pack()
    

    winfo_heightwinfo_width 包含用作画布容器的任何宽度和高度 . 所以做 winfo_width / 2 之类的东西会给你一半宽度的容器 . 但是,您需要首先更新画布对象才能使调整大小生效 .

相关问题