【问题标题】:python kwargs expression evaluationpython kwargs 表达式求值
【发布时间】:2014-05-05 18:25:10
【问题描述】:

关于将复杂表达式作为关键字参数传递,我应该知道些什么?我遇到的例子是在 tkinter 中:

image = gui.utils.get_image(self.get_icon('pause'), dimensions=(50, 50))
button = ttk.Label(self.mainframe, image=image)
button.place(x=0, y=-10, relwidth=1, relheight=1)

有效,但以下无效:

button = ttk.Label(self.mainframe, image=gui.utils.get_image(self.get_icon('pause'), dimensions=(50, 50)))
button.place(x=0, y=-10, relwidth=1, relheight=1)

有什么区别? gui.utils.get_image(self.get_icon('pause'), dimensions=(50, 50)) 应该在我将它传递给构造函数时进行评估。这是python中的错误(我在2.7上),还是tkinter的错误?如果有帮助,我将在子线程中运行此代码,但我没有引用此线程之外的任何对象。

编辑:

通过“作品”,我的意思是所需的图像附加到标签的背景。在第二个示例中,标签以适当的大小和位置显示,但背景为空白。

【问题讨论】:

  • 在什么情况下不起作用?您收到错误消息吗?如果有,错误信息是什么?
  • Juuust 编辑了我的问题。见上文。
  • 你能发布一个简单但完整的可运行示例来说明问题吗?

标签: python tkinter evaluation keyword-argument


【解决方案1】:

您需要保留对图像的引用。 Otherwise, as Fredrik Lundh explains,

Tkinter 告诉 Tk 释放图像。但由于图像正在使用 一个小部件,Tk 不会破坏它。不完全的。它只是空白 图像,使其完全透明……

【讨论】:

  • 所以通过 kwargs 传入图片不算作保留参考?这似乎有点奇怪。按照同样的逻辑,仅仅将硬编码的值作为 kwarg 传递会不会容易受到垃圾回收的影响?
  • 哦,哦,你的意思是应用了图像之后!多么疯狂的陷阱
  • 对。在您的第一个示例中,image 变量引用了图像。在第二个中,您将图像对象传递给ttk.Label,但没有对图像的其他引用。所以当ttk.Label实例返回时,就没有更多的图片引用了,所以Pythongarage收集图片。
  • 这种行为应该被修复而不是记录,不是吗?
  • @moooeeeep:为了解决这个问题,Tkinter 必须保留对传递给任何 Tkinter 小部件的每个 PhotoImage 的引用。除非 Tkinter 用户知道这个额外的引用隐藏在哪里,否则这样做会破坏通常的垃圾收集过程。 Tkinter 可以记录 那个 行为,但有些人可能认为内存管理陷阱是一个错误。所以无论哪种方式,Tkinter 都需要要求用户理解这个问题。
猜你喜欢
  • 1970-01-01
  • 2023-03-19
  • 2010-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-08
相关资源
最近更新 更多