如何定义图像对象

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()