python - 图像未使用 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()
解决方案
您需要在此处添加一行:
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了解更多信息。
推荐阅读
- postgresql - Postgres 面临:错误排序规则不存在。尝试更改排序规则时
- ios - Swift Firebase Facebook 登录 GET 请求应包含明确的“字段”参数
- laravel-5 - VPS Provision 中同一台服务器上的多个 Laravel 项目
- ssl - Nginx ssl_preread 无法处理 SOCKS 5 代理协议
- typo3 - 为 Flexform 中的复选框提供预设(例如通过 fieldControls?)?
- git - 我可以创建一个带有本地存储库的远程 git 存储库吗?
- php - PHP中的并行分配
- python-3.x - 如何检查正在运行的测试是哪个 pytest 标记
- python - 在保留列顺序的同时使用 dataframe.to_csv() 追加
- angular - AngularFireFunctions httpCallable 响应后不更新