繁体   English   中英

我无法在Tkinter python中将图像加载到画布上

[英]I can't get an image to load on the canvas in Tkinter python

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

我是在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()

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

现在您的代码可以使用了。 但是,有效的代码不一定是好的代码。 您的代码还有其他问题。 让我快速浏览一下它们:

  • 最好将import Tkinter as Tk编码import Tkinter as Tk不是from Tkinter import *
  • 为什么在您的班级名称中使用连字符? 遵循PEP8,以便将来人们可以轻松查看和理解您的代码。
  • 很好,您已经编写了self.master = master (阅读完整的代码以了解原因),但是您从未使用过它。 这意味着您做出了一个明智的决定,并使它变得毫无用处。
  • 您可以在初始化程序中设置窗口的标题。 最好在单独的函数中执行此操作,以便每当要向GUI添加其他设置(例如大小,字体等)时,都只会向该函数添加代码,而不是在初始化器中呕吐大量垃圾而是需要清洁。
  • 您创建的所有小部件都不是' selfed '(您可以阅读为什么显式自我必须保留
  • 最好在单独的函数中创建小部件,否则__init__()会很脏。
  • 为什么使用回报prank()close_window() 默认情况下,不返回内容的Python函数始终返回None ,因此编写该代码是无用的。
  • 为什么您将一个按钮放在左边,另一个按钮放在右边,然后在标签旁没有包装? 了解关于pack()几何管理器的信息。
  • 为什么不像其他两个按钮那样将标签粘贴到父窗口小部件上? 所有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()

上面程序的输出是:

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM