如何在Tkinter中更新tkPDFViewer的pdf_view视图显示内容?
问题修复方案
问题原因
视图不更新是两个核心问题共同导致的:
- 每次打开新PDF时没有销毁旧的
pdf_view组件,新组件会直接追加在旧组件下方,视觉上看起来没有更新 tkPDFViewer的ShowPdf类内部维护了一个img列表存储PDF每页的渲染结果,默认不会自动清空,重复加载时旧PDF的内容会残留
修复后完整代码
from tkinter import * import tkinter as tk from tkinter.filedialog import * from tkPDFViewer import tkPDFViewer as pdf def donothing(): x = 0 # 全局变量存储当前PDF视图实例和PDF加载器 current_pdf_view = None pdf_loader = pdf.ShowPdf() def open_file(): global current_pdf_view # 销毁之前的PDF视图 if current_pdf_view is not None: current_pdf_view.destroy() # 清空加载器内部的图片缓存 pdf_loader.img = [] # 选择PDF文件,获取文件路径 file_path = askopenfilename(filetypes=[("PDF文件", "*.pdf")]) # 用户取消选择则直接返回 if not file_path: return # 渲染新的PDF current_pdf_view = pdf_loader.pdf_view(root, pdf_location = file_path, width = 200, height = 100) current_pdf_view.pack() root = Tk() root.state('zoomed') menubar = Menu(root) filemenu = Menu(menubar, tearoff=0) filemenu.add_command(label="New", command=donothing) filemenu.add_command(label="Open", command=open_file) filemenu.add_command(label="Save", command=donothing) filemenu.add_separator() filemenu.add_command(label="Exit", command=root.quit) menubar.add_cascade(label="File", menu=filemenu) helpmenu = Menu(menubar, tearoff=0) helpmenu.add_command(label="Help Index", command=donothing) helpmenu.add_command(label="About...", command=donothing) menubar.add_cascade(label="Help", menu=helpmenu) root.config(menu=menubar) root.mainloop()
关键修改说明
- 新增全局变量存储当前活跃的PDF视图和加载器实例,每次加载新PDF前先销毁旧视图,避免组件叠加
- 每次加载PDF前清空加载器的
img缓存列表,彻底清除旧PDF的渲染残留 - 将原
askopenfile替换为askopenfilename,tkPDFViewer的pdf_location参数需要传入文件路径字符串,而非文件对象 - 修改函数名避免使用内置函数名
open,防止覆盖内置函数引发未知错误
内容的提问来源于stack exchange,提问作者Block
相关产品推荐
相关产品推荐

