You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:基于tkinter实现图片选择后实时显示功能

基于Tkinter实现图片选择与显示功能

我正在开发一个基于Tkinter库的项目,需求为创建一个Tkinter窗口,初始包含“Open 1”和“Open 2”两个按钮,点击任一按钮选择图片后,需将选中的图片在窗口中显示。以下是我已编写的代码,但缺少图片显示的实现逻辑,希望能得到帮助。

import tkinter as tk
from tkinter import filedialog

start = tk.Tk()
start.title("Start")
start.geometry("700x400")

filenames = ["", ""]

def bu_1():
    file = filedialog.askopenfilename(title="Open 1.", filetypes=(("PNG", "*.png"), ("JPG", "*.jpg")))
    filenames[0] = file
    # 缺少图片显示代码
def bu_2():
    file = filedialog.askopenfilename(title="Open 2.", filetypes=(("PNG", "*.png"), ("JPG", "*.jpg")))
    filenames[1] = file
    # 缺少图片显示代码

open_1 = tk.Button(start, text="Open 1.", padx=10, pady=5, command=bu_1) 
open_1.grid(row = 0, column = 0, padx = 30)
open_2 = tk.Button(start, text="Open 2.", padx=10, pady=5, command=bu_2) 
open_2.grid(row = 0, column = 1, padx = 70)

start.mainloop()

需求效果说明:窗口顶部横向排列两个选择按钮,按钮下方对应位置分别显示各自选中的图片。


解决方案

要实现图片显示,需要借助Pillow库(Tkinter原生支持的图片格式有限,Pillow能处理更多格式还能缩放适配窗口),步骤如下:

  1. 先安装Pillow:
pip install pillow
  1. 修改代码,添加图片显示逻辑:
import tkinter as tk
from tkinter import filedialog
from PIL import Image, ImageTk

start = tk.Tk()
start.title("Start")
start.geometry("700x400")

# 存储图片对象,防止被垃圾回收
image_objects = [None, None]
# 创建显示图片的Label容器
image_label1 = tk.Label(start)
image_label1.grid(row=1, column=0, padx=30, pady=20)
image_label2 = tk.Label(start)
image_label2.grid(row=1, column=1, padx=70, pady=20)

def load_and_show_image(file_path, label, idx):
    if not file_path:
        return
    # 打开图片并缩放,适配窗口显示区域
    img = Image.open(file_path)
    # 限制最大宽度为250,高度按比例自适应
    max_width = 250
    ratio = max_width / img.width
    new_height = int(img.height * ratio)
    img = img.resize((max_width, new_height), Image.Resampling.LANCZOS)
    # 转换为Tkinter可用的图片对象
    tk_img = ImageTk.PhotoImage(img)
    # 保存引用避免被回收
    image_objects[idx] = tk_img
    # 更新Label显示
    label.config(image=tk_img)

def bu_1():
    file = filedialog.askopenfilename(title="Open 1.", filetypes=(("PNG", "*.png"), ("JPG", "*.jpg")))
    load_and_show_image(file, image_label1, 0)

def bu_2():
    file = filedialog.askopenfilename(title="Open 2.", filetypes=(("PNG", "*.png"), ("JPG", "*.jpg")))
    load_and_show_image(file, image_label2, 1)

open_1 = tk.Button(start, text="Open 1.", padx=10, pady=5, command=bu_1) 
open_1.grid(row=0, column=0, padx=30)
open_2 = tk.Button(start, text="Open 2.", padx=10, pady=5, command=bu_2) 
open_2.grid(row=0, column=1, padx=70)

start.mainloop()

代码说明

  • 引入Pillow库处理图片格式转换与缩放,解决Tkinter原生支持格式有限的问题
  • 创建两个Label作为图片显示容器,与按钮对应排列
  • 提取通用的图片加载显示函数,减少重复代码
  • 保存ImageTk.PhotoImage对象引用,避免Python垃圾回收导致图片无法显示
  • 添加自适应缩放逻辑,确保图片在窗口内合理展示

内容的提问来源于stack exchange,提问作者Sinkos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 18:05:18