首页 > 解决方案 > 图像未使用 PIL 加载到 tKinter 窗口中

问题描述

下面是我的整个代码。当我运行它时,我希望它会打开一个 tkinter 窗口并在单击 Add 按钮时在画布中输出图像。但是会触发一个空的 Tkinter 窗口。路径是正确的,当我在名为 graph_plot 的函数中单独运行相同的代码时,它工作得相当好。我不明白出了什么问题。

import tkinter as tk
from tkinter.ttk import *
from pandas import DataFrame
from tkinter import *
from matplotlib import style
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import datetime

style.use('dark_background')

master=tk.Tk()
width, height = master.winfo_screenwidth(), master.winfo_screenheight()
master.geometry('%dx%d+0+0' % (width,height))
master.resizable(False,True) 
master.title('Plotter')
master.state('zoomed')
def graph_plot(type_of):
    global k
    k=tk.Toplevel()
    canvas=tk.Canvas(k,height=400,width=500)
    k.title(title.get())
    photo = tk.PhotoImage(file = 'C://Users//User//Desktop//Graph//plot1.png')
    canvas.create_image(0, 0, image=photo)   
    canvas.pack()


def save(path):
    M = tk.Toplevel()
    try:
        df1.savefig(path)
        tk.Message(M, text='Download Succesfully Completed').pack(fill=BOTH)
    except:
        tk.Message(M, text='Download Unsuccesful ').pack(fill=BOTH)
def reload():
    global title, path
    navbar = tk.Canvas(master,width=width+1,highlightthickness=0, height=40, bg='#0a2145')
    title=tk.Entry(master,width=27,relief='flat')
    ribbon = tk.Canvas(master,width=width+1,highlightthickness=0, height=100, bg='#bfbfbf')
    name = tk.Label(master, text='Plotter', font=('Verdana',12,'bold'))
    name.config(background='#0a2145', foreground='white')   
    now = datetime.datetime.now()
    current_time = now.strftime("%H:%M:%S")
    label1=tk.Label(master,text=' '*225+'Sl.no'+' '*40+'Name'+' '*55+'Type'+' '*50+'Date'+' '*30+'Download path'
                    , bg='#1d1d30',fg='white',width=width)
    n = tk.StringVar() 
    graph = ttk.Combobox(master, width = 27, textvariable = n) 
    graph['values'] = ('Bar Graph','Frequency','Dot')
    plotter=tk.Button(master,text='Plot',command=lambda:graph_plot(graph.get()),relief='flat',bg='#e89802',
                      fg='white',width=10)
    add=tk.Button(master,text='+ Add',command=lambda:graph_plot(graph.get()),relief='flat',bg='#08a63f',
                      fg='white',width=10)
    date = tk.Label(master,text=current_time,fg='white',font=('Verdana'),bg='#1d1d30')
    path=tk.Entry(master,width=27)
    download=tk.Button(master,text=' Download',command=lambda:save(path.get()),relief='flat',bg='#0a91c7',
                      fg='white',width=10)
    
    canvas1.create_window(35, 20, window=name)
    canvas1.create_window(681, 90, window=ribbon)
    canvas1.create_window(681,20,window=navbar)
    canvas1.create_window(1320,20,window=plotter)
    canvas1.create_window(1230,20,window=add)
    canvas1.create_window(1140,20,window=download)
    canvas1.create_window(390,200,window=graph)
    canvas1.create_window(180,200,window=title)
    canvas1.create_window(40,150,window=label1)
    canvas1.create_window(560,200,window=date)
    canvas1.create_window(700,200,window=path)
    
canvas1 = tk.Canvas(master, width = width, height = height, bg = '#304566',highlightthickness=0,
                     relief='ridge')
canvas1.pack()
reload()
master.mainloop()

标签: pythonimagetkinterpython-imaging-library

解决方案


您需要在此处添加一行:

canvas.create_image(0, 0, image=photo)   
canvas.pack()

改为这样做:

canvas.create_image(0, 0, image=photo)   
canvas.image = photo
canvas.pack()

您需要保留对照片的引用,否则它会被垃圾收集,请参阅http://effbot.org/pyfaq/why-do-my-tkinter-images-not-appear.htm了解更多信息。


推荐阅读