Tkinter Canvas设置为容器的大小

时间:2017-08-02 16:00:13

标签: python tkinter

我有一个关于使用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 :(得分:1)

在代码中,当您在框架中打包画布时,设置"展开"关键字为True," fill"关键字到"两者" (或tkinter.BOTH)。如果您使用的是网格,那么您需要使用此代码(以名称" f"作为框架:

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

然后当您对画布进行网格化时,设置"粘贴"关键字到" nsew" (或tkinter.NSEW)。在上面的代码中,如果用画布所在的行和网格数替换0,并将画布填充的GUI的重量替换为GUI的任何部分。这应该工作。

答案 1 :(得分:1)

在你写的一条评论中:

  

我特别询问如何制作类似Canvas的东西,只占据容器内部的一部分。

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

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

您也可以使用place代替gridpackplace非常善于调整小部件并将小部件放在相对于其他小部件的位置。例如,您可以将relwidth设置为.25,以使窗口小部件的宽度为父窗口宽度的1/4。

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

答案 2 :(得分:0)

进行了一些猜测,但我设法完成了我想做的事情。

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这样的事情会给你一半宽度的容器。但是,您需要先更新画布对象才能使调整大小生效。