本文介绍了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
type 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 图像未显示在函数内部的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

07-23 04:18
查看更多