tkinter画布图像不显示

The*_*dxo 6 python tkinter python-3.x

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

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')
Run Code Online (Sandbox Code Playgroud)

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

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

fal*_*tru 18

  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')
Run Code Online (Sandbox Code Playgroud)

UPDATE

这两种说法one = ... ,并root.one = one可以合并为一个语句:

    root.one = one = tkinter.PhotoImage(r'images\one.gif')
Run Code Online (Sandbox Code Playgroud)

  • `root.one = one = tkinter....` 是保存和使用对象本地名称的常用习惯用法。 (2认同)
  • 为什么图像被垃圾收集?什么时候发生?(这立即解决了我的问题,所以我想知道为什么 OP 帖子中的主要逻辑会造成这种情况) (2认同)