【问题标题】:tkinter canvas image not displayingtkinter 画布图像不显示
【发布时间】:2014-12-16 06:23:41
【问题描述】:

我在一个函数中创建了一个简单的画布,我希望在画布上显示一个图像。

def start(root):
    startframe = tkinter.Frame(root)
    canvas = tkinter.Canvas(startframe,width=1280,height=720)

    startframe.pack()
    canvas.pack()

    one = tkinter.PhotoImage('images\one.gif')
    canvas.create_image((0,0),image=one,anchor='nw')

当我运行代码时,我得到一个空白的 1280x720 窗口,没有图像。

我查看了以下网站:http://effbot.org/pyfaq/why-do-my-tkinter-images-not-appear.htm 但我不明白如何将他们的示例应用于我的情况(如果这是我的问题,我不知道要创建什么引用或如何创建引用) .我还查看了一些堆栈溢出问题,但它们也没有帮助。

【问题讨论】:

    标签: python python-3.x tkinter


    【解决方案1】:
    1. 正确转义路径字符串中的反斜杠。 (或使用r'raw string literal')。

    2. 防止 PhotoImage 对象被垃圾回收。

    3. 使用file=... 选项指定文件名。


    def start(root):
        startframe = tkinter.Frame(root)
        canvas = tkinter.Canvas(startframe,width=1280,height=720)
    
        startframe.pack()
        canvas.pack()
    
        # Escape / raw string literal
        one = tkinter.PhotoImage(file=r'images\one.gif')
        root.one = one  # to prevent the image garbage collected.
        canvas.create_image((0,0), image=one, anchor='nw')
    

    更新

    one = ...root.one = one这两条语句可以合并为一条语句:

        root.one = one = tkinter.PhotoImage(r'images\one.gif')
    

    【讨论】:

    • root.one = one = tkinter.... 是一个常用的习惯用法,用于保存和使用对象的本地名称。
    • @TerryJanReedy,我更新了答案以提及它。谢谢你的评论。顺便说一句,使用root.one = one = ...,首先分配给root.oneideone.com/OMNeDy
    • 我仍然没有图像?
    • 为什么图像被垃圾收集?什么时候发生? (这立即解决了我的问题,所以我想知道为什么 OP 帖子中的主要逻辑会产生这种情况)
    • @Sawyer, one 是局部变量。当函数(局部变量定义)返回时,它被垃圾收集。
    【解决方案2】:

    canvas.update() 怎么样?我遇到了类似的问题。我正在使用网格,所以我需要使用 .update 而不是 .pack

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-26
      • 2015-11-29
      • 2021-12-31
      • 1970-01-01
      • 1970-01-01
      • 2013-12-02
      相关资源
      最近更新 更多