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

Python封装函数加载PDF到ttk Notebook仅显示灰色无法正常渲染求助

问题原因

你的问题是Tkinter的图片对象引用丢失导致的:

  • 你把photos列表定义在upload_pdf函数内部,属于局部变量,函数执行结束后这个列表会被Python的垃圾回收机制销毁
  • 列表里存储的ImageTk.PhotoImage对象没有其他引用留存,Tkinter渲染时找不到图片数据,就只会显示空白灰色
  • 你没封装函数的时候photos是全局变量,程序运行全程不会被销毁,所以显示正常

解决方法

只要给图片对象留一个永久引用即可,推荐直接把图片列表绑定到你用来展示的pdf文本组件的属性上,不需要改动其他逻辑。

修正后的完整代码

import tkinter as tk
from tkinter import ttk
from PIL import Image, ImageTk
from pdf2image import convert_from_path


def upload_pdf():
    # PDF转图片列表
    pages = convert_from_path('/home/admin/PycharmProjects/ChecklistProject/Main_Genny_Bi-monthly_Operational_Check_M72QZZ1.pdf', size=(800, 900))

    photos = []
    for i in range(len(pages)):
        photos.append(ImageTk.PhotoImage(pages[i]))
    
    # 新增这一行:把图片列表绑定到pdf组件的属性上,避免被回收
    pdf.photos = photos

    # 把图片插入文本组件
    for photo in photos:
        pdf.image_create(tk.END, image=photo)
        pdf.insert(tk.END, '\n\n')


root = tk.Tk()
root.title('')
root.geometry("920x680+500+20")
mon_width = root.winfo_screenwidth()
mon_height = root.winfo_screenheight()

tab_control = ttk.Notebook(root)
tab_control.place(x=10, y=10, height=625, width=800)
tab1 = ttk.Frame(tab_control)
tab2 = ttk.Frame(tab_control)

tab_control.add(tab1, text="Preview pdf")
tab_control.add(tab2, text="Other")

# PDF文本框加滚动条
scroll_y = tk.Scrollbar(tab1, orient=tk.VERTICAL)
pdf = tk.Text(tab1, yscrollcommand=scroll_y.set, bg="grey")
scroll_y.pack(side=tk.RIGHT, fill=tk.Y)
scroll_y.config(command=pdf.yview)
pdf.pack(fill=tk.BOTH, expand=1)

# 上传按钮
my_button = tk.Button(root, text="Upload", command=upload_pdf)
my_button.place(x=840, y=400)

root.mainloop()

改动说明

仅在upload_pdf函数里新增了pdf.photos = photos一行代码,把图片列表绑定到全局存在的pdf组件属性上,只要pdf组件不被销毁,图片引用就会一直留存,不会被垃圾回收清理,就能正常显示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 19:30:00