2015-04-01 74 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