这个问题在这里已有答案:
我有一个关于使用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 回答
在代码中,当您在框架中打包画布时,将“expand”关键字设置为True,将“fill”关键字设置为“both”(或tkinter.BOTH) . 如果您使用网格,则需要使用此代码(将名称“f”作为框架:
然后,当您对画布进行网格化时,将“sticky”关键字设置为“nsew”(或tkinter.NSEW) . 在上面的代码中,如果将0替换为画布将在其中的行和网格数,并将权重替换为您希望画布填充的GUI的任何部分 . 这应该工作 .
在你写的一条评论中:
有很多方法可以实现这一目标 . 正如您所推测的,一种方法是获取容器的尺寸,然后相应地设置窗口小部件的尺寸 .
您还可以使用几何管理器为您管理 . 例如,您可以使用
grid
将画布放置在特定的行和列中,然后安排该行和/或列恰好具有容器高度和/或宽度的1/4 .您也可以使用
place
而不是grid
或pack
.place
非常擅长调整小部件和放置相对于其他小部件的小部件 . 例如,您可以将relwidth
设置为.25,以使窗口小部件的宽度为父窗口宽度的1/4 .哪种选择是正确的选择取决于许多因素,主要与屏幕上其他小部件以及它们应如何交互有关 . 如果不了解整个应用程序的更多细节而不仅仅是一个窗口,则无法提供更具体的建议 .
做了一些猜测工作,但我设法完成了我想做的事情 .
winfo_height
和winfo_width
包含用作画布容器的任何宽度和高度 . 所以做winfo_width / 2
之类的东西会给你一半宽度的容器 . 但是,您需要首先更新画布对象才能使调整大小生效 .