我有一个关于使用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吮吸,但我似乎无法在网上找到任何信息:\
答案 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
代替grid
或pack
。 place
非常善于调整小部件并将小部件放在相对于其他小部件的位置。例如,您可以将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_height
和winfo_width
包含您用作画布容器的任何宽度和高度。所以做winfo_width / 2
这样的事情会给你一半宽度的容器。但是,您需要先更新画布对象才能使调整大小生效。