2015-04-01 75 views
3

我使用的Tkinter的Toplevel的显示图像(),但是当我把它在函数中这是行不通的函数里面显示(这是非常初学者,我知道)Tkinter的PIL图像不

# -*- coding: utf-8 -*- 
import Tkinter 
from Tkinter import * 
import tkMessageBox 
from tkMessageBox import * 
import Image, ImageTk 
import PIL.Image, PIL.ImageTk 
import os 
import subprocess 


root = Tk() 
root.title("Test") 
quin=Toplevel()  
C = Tkinter.Canvas(quin, bg="white", height = 350, width = 350) 
directory=os.path.dirname(os.path.abspath(__file__)) 
filename=os.path.join(directory, 'un.png') 
img=PIL.Image.open(filename) 
tkimg=PIL.ImageTk.PhotoImage(img) 
image = C.create_image(175,175,image=tkimg) 
C.grid(row=5,column=5) 
def Head(): 
    h1 = Label(root, text = "How to Secure a Computer", fg ="white", bg = "#00b8ff", width = 6,bd=2, height =2, font = "Arial", relief = RAISED) 
    h1.grid(row= 0, column = 0, ipadx=122, pady=3, padx=5,columnspan=3) 
def Mainmenu(): 
    menubar = Menu(root) 
    filemenu = Menu(menubar, tearoff=0) 
    filemenu.add_command(label="Exit", command=root.destroy) 
    menubar.add_cascade(label="Options", menu=filemenu) 
    helpmenu = Menu(menubar, tearoff=0) 
    helpmenu.add_radiobutton(label="Help") 
    helpmenu.add_radiobutton(label="User Manual Security Configuration Guide") 
    menubar.add_cascade(label="Help", menu=helpmenu) 
    root.config(menu=menubar) 

def Mainbuttons(): 
    B1=Button(root,text="Services",height=2, width=6,bd=2, font = "Arial", fg = "#FFFFFF", bg = "#156cff",command=Services) 
    B2=Button(root,text="Account Policies",height=2, width=6,bd=2, font = "Arial", fg = "#FFFFFF", bg = "#156cff") 
    B3=Button(root,text="Firewall Config",height=2, width=6,bd=2, font = "Arial", fg = "#FFFFFF", bg = "#156cff") 
    B4=Button(root,text="User Logon Time",height=2, width=6,bd=2, font = "Arial", fg = "#FFFFFF", bg = "#156cff") 
    B5=Button(root,text="Security Policies",height=2, width=6,bd=2, font = "Arial", fg = "#FFFFFF", bg = "#156cff") 
    B1.grid(row = 1, column = 0, ipadx=120,pady=2,padx=5) 
    B2.grid(row = 1, column = 1, ipadx=120,pady=2,padx=5) 
    B3.grid(row = 2, column = 1, ipadx=120,pady=2,padx=5) 
    B4.grid(row = 2, column = 0, ipadx=120,pady=2,padx=5) 
    B5.grid(row = 3, column = 0, ipadx=120,pady=2,padx=5) 

def Services(): 
    serv=Toplevel() 
    servcanv=Canvas(serv,height=250, width=250) 
    servtext=Text(serv,width=26) 
    servtext.insert(INSERT, "To start go to your start menu, in the search bar\ntype services.msc") 
    servtext.grid(row=0, column=0) 
    servcanv.grid(row=0, column=1) 
    s = Tkinter.Canvas(serv, bg="white", height = 350, width = 350) 
    directory=os.path.dirname(os.path.abspath(__file__)) 
    filename=os.path.join(directory, 'un.png') 
    img=PIL.Image.open(filename) 
    tkimg=PIL.ImageTk.PhotoImage(img) 
    image=s.create_image(175,175,image=tkimg) 
    s.grid(row=5,column=5) 





Mainmenu() 
Mainbuttons() 
Head() 
root.mainloop() 

正如你所看到的,用于显示图像的代码被使用了两次,一次在一个函数中,一次在外面。当它在外面工作完美,但是当它在内部不起作用时,它表示可变图像被分配但从未使用过。

回答

4

它不起作用,因为tkimg函数完成后垃圾回收。你需要将你的图像绑定到不会被垃圾收集的变量。例如全局变量或类中的实例变量,而不是局部变量。

使tkimg能够写入全局tkimg使用global tkimg在函数中。

+0

它应该是一个本地版本,但它只出现在新的Toplevel窗口中。 – TigerhawkT3 2015-04-01 22:30:59

+0

@ TigerhawkT3所以它不会工作。当“服务”功能完成时,“tkimg”仍然被垃圾收集。需要使其他全局变量保存对要使用的图像的引用。 – Marcin 2015-04-01 22:34:14

+0

它就像你说的那样工作,我把'tkimg'变成了一个全球化的公司。 – Nitroxko 2015-04-01 22:37:06