我无法在Tkinter python的画布上加载图像

时间:2017-05-25 04:57:15

标签: python canvas tkinter

我有一个大问题。画布加载完美但图像不显示。

我在1周前开始使用Python,但我不知道为什么不起作用。任何人都可以告诉我如何解决未在画布上加载图像的问题吗?

from Tkinter import *
from PIL import ImageTk
from PIL import Image

class Fake_Virus:
    def __init__(self, master):
        self.master = master
        master.title("Totally not a virus!")

        b = Button(master, text="Help", command=self.prank)
        b.pack(padx=10, pady=10, side=LEFT)

        quit = Button(master, text="Close", command=self.close_window)
        quit.pack(padx=10, pady=10, side=RIGHT)




        photo = PhotoImage("eh.gif")

        label = Label(image=photo)
        label.image = photo # keep a reference!
        label.pack()



        f = Frame(master, height=150, width=150)
        f.pack_propagate(0) # don't shrink
        f.pack()

    def prank(self):
        print "work"
        return

    def close_window(self):
        root.destroy()
        return


root = Tk()
my_gui = Fake_Virus(root)
root.mainloop()

1 个答案:

答案 0 :(得分:2)

您应该使用file选项初始化照片图像对象 这意味着您需要将photo = PhotoImage("eh.gif")更改为photo = PhotoImage(file="eh.gif")

现在您的代码将正常运行。但是工作代码不一定是好代码。您的代码还有其他问题。让我快点介绍一下:

  • 最好将import Tkinter as Tk编码为from Tkinter import *
  • 为什么你班级名字中的连字符?关注PEP8,这样,在未来,人们会发现查看和理解您的代码很容易。
  • 很高兴你写了self.master = master(阅读complete code知道原因)但是你从未使用它。这意味着你做出了一个很好的决定而且你没有用它。
  • 您可以在初始化程序中设置窗口的标题。最好是在单独的函数中执行此操作,以便每当您想要向GUI添加其他设置(例如大小,字体或其他)时,您只会向该函数添加代码,而不是在初始化程序中呕吐大量垃圾相当需要清洁。
  • 您创建的小部件都不是“自我”(您可以阅读Why explicit self has to stay
  • 最好在单独的函数中创建小部件,否则__init__()会变脏。
  • 为什么在prank()close_window()中使用退货?默认情况下,不返回某些内容的Python函数无论如何都返回None,因此对它进行编码是没用的。
  • 为什么你打包一个按钮向左,另一个按钮向右包装,然后没有包装标签?阅读pack()几何管理器。
  • 为什么没有像其他2个按钮那样将标签附加到父窗口小部件?所有Tkinter小部件都需要紧紧包含在父窗口小部件中。这些小部件的祖父是Tkinter.Tk()
  • 的实例
  • 为什么你创建那个框架然后你从未使用它?你没有做任何事情,所以......?

鉴于这些评论,我想为您提供一个改进但不完美的程序版本。然后,您可以按照此“哲学”添加或修改现有小部件:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import Tkinter as Tk
from PIL import ImageTk

class FakeVirus:
   def __init__(self, master):
       self.master = master
       self.configure_gui()
       self.create_widgets()

   def configure_gui(self):
       self.master.title('Totally not a virus!')

   def create_widgets(self):
       self.create_buttons()
       self.create_label_for_image()

   def create_buttons(self):
       self.help = Tk.Button(self.master, text='Help', command=self.prank)
       self.help.pack(side=Tk.LEFT)
       self.quit = Tk.Button(self.master, text='Close', command=self.close_window)
       self.quit.pack(side=Tk.LEFT)

   def create_label_for_image(self):
       self.image_label = Tk.Label(self.master)
       self.image_label.pack(side=Tk.LEFT)
       self.load_image_to_label()

   def load_image_to_label(self):
       self.photo = ImageTk.PhotoImage(file='eh.gif')
       self.image_label.image = self.photo
       self.image_label.config(image=self.photo)

   def prank(self):
       print "work"

   def close_window(self):
        root.destroy()

if __name__ == '__main__':
   root = Tk.Tk()
   my_gui = FakeVirus(root)
   root.mainloop()

上述程序的输出是:

enter image description here