【问题标题】:Get height/width of tkinter Canvas获取 tkinter Canvas 的高度/宽度
【发布时间】:2021-03-07 12:57:55
【问题描述】:

我正在寻找这个已经很久了。在 tkinter 中获取 Canvas 的高度/宽度有那么难吗? 我想做这样的事情:

c = Tk.Canvas(self, heigth=12, width=12)
c.create_oval(0, 0, self.height, self.width)

这样我就可以用画布的宽度/高度来画一个圆。

我怎么找不到那个画布的宽度/高度之类的属性? c.winfo_widthc.winfo_height 不起作用,因为那只会给我错误。

你能帮帮我吗?这真的很烦人,因为即使在构造函数中也有属性heightwidth...

【问题讨论】:

  • 你必须在winfo_height之前调用<tkinter.Tk>.update
  • 你还说它给它行不通,因为那只会给我错误。什么是错误回溯?
  • @TheLizzard 有趣的是,当我尝试您的答案解决方案时,后来c.winfo_widthc.winfo_height 也起作用了。但我会坚持@hussics 的回答

标签: python-3.x tkinter canvas


【解决方案1】:

使用 winfo_reqwidth 和 winfo_reqheight:

root = tk.Tk()
c = tk.Canvas(root, height=120, width=120)
c.create_oval(0, 0, c.winfo_reqheight(), c.winfo_reqwidth())

c.pack()
root.mainloop()

【讨论】:

  • 完美!谢谢!
  • 只是说这并不总是有效。 winfo_reqheight 获取小部件所需的高度,而不是实际高度。为了证明这一点,将画布放在一个框架内:tk.Frame(root, width=10, height=10) 并调用 frame.pack_propagate(False)
【解决方案2】:

您必须在winfo_height 之前调用<tkinter.Tk>.update<tkinter.Canvas>.pack,如下所示:

import tkinter as tk

root = tk.Tk()
c = tk.Canvas(root, height=120, width=120)
c.pack()

root.update()
c.create_oval(0, 0, c.winfo_height(), c.winfo_width())

root.mainloop()

此代码的一部分也是从@hussic 窃取的。

<tkinter.Tk>.update 确保所有 tkinter 任务都已完成。这些任务可以是确保几何管理器为小部件保留空间并且小部件被绘制在屏幕上。调用<tkinter.Widget>.update 其中Widget 可以是任何tkinter 小部件与调用<tkinter.Tk>.update 相同,因为它将调用相同的tcl 函数。

【讨论】:

  • <tkinter.Tk>.update 是什么意思? AFAIK,update 是一种通用方法,可用于任何小部件,而不仅仅是Tk()
  • @CoolCloud 我会用解释更新我的答案
  • 我的意思是,你所说的<tkinter.Tk>.update 使update() 似乎只能在Tk() 上调用,这是一个更正。
  • @Sunburst275 很好,我只是在展示您拥有的另一个选项。 CoolCloud 它调用相同的 tcl 函数,所以没关系,它的常规调用 <tkinter.Tk>.update
  • @CoolCloud 我知道,但问题是update 做了什么update_idletasks 不做。我找到了this,但还是太模糊了。
猜你喜欢
  • 1970-01-01
  • 2015-08-15
  • 2020-10-12
  • 1970-01-01
  • 2013-11-09
  • 2015-08-05
  • 2013-11-29
  • 1970-01-01
  • 2017-12-26
相关资源
最近更新 更多