如何定义图像对象
How to define an image object
这是一段代码,它从 sqlite3 中获取图像路径,调整其大小以匹配 label/frame 大小并将其显示在 tkinter GUI 上。我不知道或不记得如何定义变量“final_image”,如果该变量仅在 GUI 启动后创建。
我的意思是我在 ttk.treeview 中有一个记录列表。每条记录都有一个插入数据库的图像路径。当我单击树视图中的一个项目时,选择激活函数 preview_image(),然后调整图像大小以适合 GUI 上的确切帧大小,然后显示它。
这里的问题是,直到我在 treevew 上单击一条记录,变量“final_image”为空,所以当我启动 GUI 时,该变量未定义,并且 GUI 失败。
import tkinter as tk
from tkinter import ttk
from PIL import Image, ImageTk
import sqlite3
def preview_image():
global img_link1, final_image
Find path for selected record.
conn = sqlite3.connect('Equipment.db')
c = conn.cursor()
query = "SELECT c_ipath FROM items WHERE itemID LIKE '%" + record_value + "%'"
c.execute(query)
img_link = c.fetchone()
c.close()
conn.close()
image = Image.open(img_link)
img_link1 = image.copy()
final_image = ImageTk.PhotoImage(image)
def resize_image(event):
new_width = event.width
new_height = event.height
img = img_link1.resize((new_width, new_height))
photo = ImageTk.PhotoImage(img)
img_label.config(image=photo)
img_label.image = photo # avoid garbage collection
root = tk.Tk()
root.title("Title")
root.geometry('600x600')
# --------------------------------------- Tab 1 Image Preview -------------------------------
section3 = tk.Frame(root, background="black")
section3.place(x=10, y=10, height=460, width=500)
img_label = ttk.Label(section3, image=final_image)
img_label.bind('<Configure>', resize_image)
img_label.pack(fill=tk.BOTH, expand=tk.YES)
root.mainloop()
解决方案可能非常简单明了,但我看不到。
只需添加这一行
final_image = tk.PhotoImage()
创建根后 window。
或
创建标签时只需删除图像属性
img_label = ttk.Label(section3)
在 acw1668 的帮助下,我用一个函数解决了这个问题:我 select 来自树视图的记录。这将从数据库中提取图像的文件路径。使用文件路径,我即时调整图像大小并将其放入 canvas。每次我单击树视图上的记录时,它都会运行 preview_image(event) 函数并使用适合框架高度的调整大小的图像更改 img_canvas 中的图像。这对我有用,可能对其他人也有帮助。
acw1668 指出的更正在下面的评论中。不要忘记将“final_img”设为全局。
def preview_image(event):
global final_img
# Find path for selected record.
conn = sqlite3.connect(conndb.data_source)
c = conn.cursor()
query = "SELECT c_ipath FROM items WHERE itemID LIKE '%" + record_value + "%'"
c.execute(query)
img_link = c.fetchone()
c.close()
conn.close()
baseheight = 460
img = Image.open(img_link[0])
hpercent = (baseheight / float(img.size[1]))
wsize = int((float(img.size[0]) * float(hpercent)))
img_resized = img.resize((wsize, baseheight), Image.ANTIALIAS)
final_img = ImageTk.PhotoImage(img_resized)
img_canvas.itemconfigure(image_item, image=final_img)
# --- GUI ----
root = tk.Tk()
root.title("Title")
root.geometry('1120x980+500+20')
section3 = tk.Frame(root, background="black")
section3.place(x=10, y=510, height=460, width=1100)
img_canvas = tk.Canvas(section3, bg="black", highlightthickness=0)
img_canvas.pack(fill=tk.BOTH, expand=tk.YES)
image_item = img_canvas.create_image(1100/2, 460/2, anchor=tk.CENTER)
root.mainloop()
这是一段代码,它从 sqlite3 中获取图像路径,调整其大小以匹配 label/frame 大小并将其显示在 tkinter GUI 上。我不知道或不记得如何定义变量“final_image”,如果该变量仅在 GUI 启动后创建。
我的意思是我在 ttk.treeview 中有一个记录列表。每条记录都有一个插入数据库的图像路径。当我单击树视图中的一个项目时,选择激活函数 preview_image(),然后调整图像大小以适合 GUI 上的确切帧大小,然后显示它。
这里的问题是,直到我在 treevew 上单击一条记录,变量“final_image”为空,所以当我启动 GUI 时,该变量未定义,并且 GUI 失败。
import tkinter as tk
from tkinter import ttk
from PIL import Image, ImageTk
import sqlite3
def preview_image():
global img_link1, final_image
Find path for selected record.
conn = sqlite3.connect('Equipment.db')
c = conn.cursor()
query = "SELECT c_ipath FROM items WHERE itemID LIKE '%" + record_value + "%'"
c.execute(query)
img_link = c.fetchone()
c.close()
conn.close()
image = Image.open(img_link)
img_link1 = image.copy()
final_image = ImageTk.PhotoImage(image)
def resize_image(event):
new_width = event.width
new_height = event.height
img = img_link1.resize((new_width, new_height))
photo = ImageTk.PhotoImage(img)
img_label.config(image=photo)
img_label.image = photo # avoid garbage collection
root = tk.Tk()
root.title("Title")
root.geometry('600x600')
# --------------------------------------- Tab 1 Image Preview -------------------------------
section3 = tk.Frame(root, background="black")
section3.place(x=10, y=10, height=460, width=500)
img_label = ttk.Label(section3, image=final_image)
img_label.bind('<Configure>', resize_image)
img_label.pack(fill=tk.BOTH, expand=tk.YES)
root.mainloop()
解决方案可能非常简单明了,但我看不到。
只需添加这一行
final_image = tk.PhotoImage()
创建根后 window。
或
创建标签时只需删除图像属性
img_label = ttk.Label(section3)
在 acw1668 的帮助下,我用一个函数解决了这个问题:我 select 来自树视图的记录。这将从数据库中提取图像的文件路径。使用文件路径,我即时调整图像大小并将其放入 canvas。每次我单击树视图上的记录时,它都会运行 preview_image(event) 函数并使用适合框架高度的调整大小的图像更改 img_canvas 中的图像。这对我有用,可能对其他人也有帮助。
acw1668 指出的更正在下面的评论中。不要忘记将“final_img”设为全局。
def preview_image(event):
global final_img
# Find path for selected record.
conn = sqlite3.connect(conndb.data_source)
c = conn.cursor()
query = "SELECT c_ipath FROM items WHERE itemID LIKE '%" + record_value + "%'"
c.execute(query)
img_link = c.fetchone()
c.close()
conn.close()
baseheight = 460
img = Image.open(img_link[0])
hpercent = (baseheight / float(img.size[1]))
wsize = int((float(img.size[0]) * float(hpercent)))
img_resized = img.resize((wsize, baseheight), Image.ANTIALIAS)
final_img = ImageTk.PhotoImage(img_resized)
img_canvas.itemconfigure(image_item, image=final_img)
# --- GUI ----
root = tk.Tk()
root.title("Title")
root.geometry('1120x980+500+20')
section3 = tk.Frame(root, background="black")
section3.place(x=10, y=510, height=460, width=1100)
img_canvas = tk.Canvas(section3, bg="black", highlightthickness=0)
img_canvas.pack(fill=tk.BOTH, expand=tk.YES)
image_item = img_canvas.create_image(1100/2, 460/2, anchor=tk.CENTER)
root.mainloop()