【问题标题】:Image is not showing up on tkinter canvas图像未显示在 tkinter 画布上
【发布时间】:2019-06-14 23:03:19
【问题描述】:
  • 在能够复制问题后更新。

最初我可以通过将键绑定到画布来使其工作,我不知道为什么会起作用,但后来它也停止工作了,所以我进一步调查。

在设置了一些测试之后,我设法编写了一个简短的代码来复制问题:

from tkinter import *


class SomeClass:
    def __init__(self, master):
        self.can = Canvas(master, bg="gray")
        self.can.pack()

        thing = PhotoImage(file=("./img/thing.PNG"))

        img = self.can.create_image(20, 20, image=thing)

        stuff = self.can.find_all()
        print(stuff)


app = Tk()

SomeClass(app)  # Does not work

something = SomeClass(app)  # Dos not work

# This part does work:
can = Canvas(app, bg="gray")
can.pack()
thing = PhotoImage(file=("./img/thing.PNG"))

img = can.create_image(20, 20, image=thing)

stuff = can.find_all()
print(stuff)

app.mainloop()

在所有情况下,img 在 find_all() 中显示为一个项目,但前两个不会在画布上显示它。

还尝试将图像的创建作为一种绑定方法来激活它,认为它在初始化部分出错了。这并没有改变任何东西。

那么我在这里做错了什么?

【问题讨论】:

  • 尝试将Timeline() 的实例分配给一个变量,例如timeline = Timeline(frame)
  • 试过了,没用。我设法制作了一个简短的代码来复制问题,但是,请参阅上面的更新问题。
  • 对于您更新的代码,请将 SomeClass 中的 thing = ... 更改为 self.thing = ...
  • 同样的事情发生了,但刚刚想出答案,图像正在被垃圾收集,我只需要将图像设为全局或附加到某物。

标签: python canvas tkinter


【解决方案1】:

所以回答我自己的问题,因为我终于发现出了什么问题。

我没有阅读有关 PhotoImage 的文档中的这一行:

“您必须在 Python 程序中保留对图像对象的引用,方法是将其存储在全局变量中,或者将其附加到另一个对象。”

所以在这种情况下,让它工作的方法是:

app = Tk()
thing = PhotoImage(file=("./img/thing.PNG")) # making it a global variable

class SomeClass:
    def __init__(self, master):
        self.can = Canvas(master, bg="gray")
        thing = PhotoImage(file=("./img/thing.PNG")
        self.can.img = thing   # This attaches the image to the canvas object

希望这可以帮助遇到此问题的其他人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-26
    • 1970-01-01
    • 2019-06-26
    • 2012-12-28
    • 2014-12-16
    • 1970-01-01
    • 2021-11-29
    • 1970-01-01
    相关资源
    最近更新 更多