在带有PIL的tkinter GUI中使用生成的图像

2024-09-26 22:42:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使用tkinter按钮来显示使用sqlalchemy和PIL的ERD图。 通过将生成的图片保存到文件中,然后重新打开该文件以显示在标签中,我成功地实现了这一点

有没有一种方法可以在不保存图像的情况下显示图像

import tkinter as tk
from sqlalchemy_schemadisplay import create_schema_graph
import urllib
from sqlalchemy import MetaData, create_engine
from PIL import Image, ImageTk 

root = tk.Tk()

def erd_gen(pr):
    global erd_img
    conn = create_engine("mssql+pyodbc:///?odbc_connect={}".format(pr))
    grph_data = MetaData(bind=conn)
    graph = create_schema_graph(metadata=grph_data, show_datatypes=False, show_indexes=False, rankdir='LR', concentrate=False)
    graph.write_png('dbschema.png') # write file to folder 
    erd_img = ImageTk.PhotoImage(Image.open("dbschema.png")) #open file from folder, would like to do this by just referring to 'graph' and not the saved file
    panel.configure(image = erd_img)
    conn.close()


params = urllib.parse.quote_plus("DRIVER={SQL Server Native Client 11.0};"
                                    "SERVER=(localdb)\ProjectsV13;"
                                    "DATABASE=Test;"
                                    "Trusted_Connection=yes")  

tk.Button(root, text='Generate', command=lambda: erd_gen(params)).pack()

panel = tk.Label(root)
panel.pack()

root.mainloop()

Tags: tofromimportfalseimgsqlalchemypngcreate
2条回答

可以使用io将其保存到类似文件的对象中,请参见示例:

from tkinter import *
from PIL import Image, ImageTk
import urllib.request
import io

root = Tk()

show = Label(root)
show.pack()

img_url = 'http://hem.bredband.net/b235373/kroppkakor/DSCF0002.JPG'

with urllib.request.urlopen(img_url) as url:
    temp_file = io.BytesIO(url.read())

img = Image.open(temp_file)
tkimg = ImageTk.PhotoImage(image=img)
show.config(image=tkimg)

root.mainloop()

您可以使用create_png()而不是write_png()来创建PNG图像数据缓冲区,然后使用io.BytesIO来模拟文件输入流:

from io import BytesIO

def erd_gen(pr):
    global erd_img
    conn = create_engine("mssql+pyodbc:///?odbc_connect={}".format(pr))
    grph_data = MetaData(bind=conn)
    graph = create_schema_graph(metadata=grph_data, show_datatypes=False, show_indexes=False, rankdir='LR', concentrate=False)
    iostream = BytesIO(graph.create_png())
    erd_img = ImageTk.PhotoImage(file=iostream)
    panel.configure(image=erd_img)
    conn.dispose()

相关问题 更多 >

    热门问题