【问题标题】:Tkinter Canvas set to size of it's container [duplicate]Tkinter Canvas 设置为其容器的大小 [重复]
【发布时间】:2018-01-09 23:13:10
【问题描述】:

我有一个关于使用 Tkinter Canvas 对象在 Python 中制作 GUI 的问题。

在创建框架对象时,您可以为其指定宽度和高度。有没有办法检测它的容器的大小并将其用于它的宽度和高度?

例如,假设您想创建一个始终占用等于整个屏幕右上角的空间的 Canvas,即使您的窗口要调整大小,或者您要使用它包含的 Frame另一个可能有另一个 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"添加到@987654326 @ 陈述。但是,如果我只希望它是框架的 2/3 怎么办?还是框架宽度和高度的一半?有可能吗?

也许我谷歌搜索很烂,但我似乎无法在网上找到任何相关信息:\

【问题讨论】:

  • 你的语言有点含糊。您能否使用一些示例代码发布minimal reproducible example,以便我们知道您所称的容器。目前尚不清楚您是在谈论画布中的框架,还是框架中的画布,还是窗口中的画布,或者其他什么。
  • @BryanOakley 抱歉,刚刚添加了一个代码 sn-p,希望这能让我的要求更清楚
  • @Skitzafreak:我认为您希望根据当前窗口大小调整画布大小。看看这个question/answer
  • 您可能在此处遇到x/y 问题。您是否特别询问如何获取容器的宽度和高度,或者您的真正目标是配置 UI 以使容器占据其容器的一定百分比(可以在不知道宽度和高度的情况下完成)?
  • @BryanOakley 我特意问的是如何制作像 Canvas 这样的东西,只占用放入容器的一部分。

标签: python tkinter


【解决方案1】:

在代码中,当您将画布打包到框架中时,将“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 的任何部分的权重。这应该有效。

【讨论】:

  • 这并不是我想要达到的目标。即使您这样做pack(expand = True, fill = "both"),Canvas 上绘图区域的尺寸似乎也没有改变。
【解决方案2】:

在您写的其中一个 cmets 中:

我特意问的是如何制作像 Canvas 这样的东西,只占用放置它的容器的一部分。

有很多方法可以做到这一点。正如您推测的那样,一种方法是获取容器的尺寸,然后相应地设置小部件的尺寸。

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

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

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

【讨论】:

  • 所以如果我要执行foo.grid_configure(relwidth = 0.25) 之类的操作,它会将foo 的宽度设置为容器宽度的1/4?
  • @Skitzafreak:不,因为grid 不支持relwidth。我看到我的回答有一个小错误。我已经改正了这个错误。请参阅effbot.org/tkinterbook/place.htm 了解如何使用place。对于grid,它比单个配置选项要复杂一些。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-20
    • 1970-01-01
    • 2016-03-09
    • 2012-05-04
    • 1970-01-01
    • 1970-01-01
    • 2014-09-02
    相关资源
    最近更新 更多