在带有 PIL 的 tkinter GUI 中使用生成的图像
Using a generated image in a tkinter GUI with PIL
我正在尝试使用 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()
您可以使用 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()
我正在尝试使用 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()
您可以使用 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()