Tkinter PIL图像未在函数内部显示 [英] Tkinter PIL image not displaying inside of a function

查看:126
本文介绍了Tkinter PIL图像未在函数内部显示的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用Tkinter在Toplevel()中显示图像,但是当我将其放入函数中时,它不起作用(我知道这是非常初学者)

I am using Tkinter to display images in a Toplevel() but when I put it inside of a function it doesn't work(This is very beginner I know)

 # -*- 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()

如您所见,用于显示图像的代码已使用两次,一次在函数内部,一次在外部.在外面时,它工作正常,但是在里面时,它说变量图像已分配但从未使用过.

As you can see the code used to display the image is used twice, once inside a function and once outside. When outside it works perfectly, but when inside it doesn't work, it says the variable image is assigned but never used.

推荐答案

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

It does not work inside function, since tkimg is garbage collected after function finishes. You need to bind your images into variables that wont be garbage collected. For example to global variables, or instance variables in a class, rather than local variables.

要使tkimg能够写入全局tkimg,请在函数中使用global tkimg.

To make tkimg be able to write to the global tkimg use global tkimg in the function.

这篇关于Tkinter PIL图像未在函数内部显示的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆