如何通过Toplevel()在弹出窗口中打开PDF文件?
Tkinter PDF查看器弹出窗口无内容的问题修复
你的代码存在两个核心问题导致弹出窗口无法显示PDF内容:
- 按钮的
lambda: [viewpdf(), popup(file)]中,popup(file)会先于viewpdf()的文件选择逻辑执行,此时file还是初始空字符串;就算执行顺序正常,popup函数本身也没有加载PDF的逻辑。 - 原
popup函数只创建了空窗口,没有将PDF内容渲染到窗口中。
修复方案
- 改造
popup函数,让它能接收文件名并在弹出窗口内加载PDF。 - 调整按钮的点击逻辑,确保
popup能拿到正确的文件名,并且在文件选择完成后再调用。
修正后的完整代码
from tkinter import * from tkinter import filedialog from tkPDFViewer import tkPDFViewer as pdf import os # 创建主窗口 root = Tk() root.geometry("1000x700+200+100") root.title("PDF Viewer") root.configure(bg="light blue") # 查看框架 view_frame=Frame(root, bg="light blue", bd=5, width=400) view_frame.pack(side=LEFT) # 生成弹出窗口查看PDF def popup(filename): win=Toplevel(root) win.geometry("800x600") # 调整窗口大小适配PDF显示 win.title(os.path.basename(filename)) # 只显示文件名更美观 # 在弹出窗口中加载PDF pdf_viewer = pdf.ShowPdf() pdf_viewer.img_object_li.clear() pdf_widget = pdf_viewer.pdf_view(win, pdf_location=open(filename,"rb"), height=550, width=780) pdf_widget.pack(pady=10) v2 = None # 搜索文件并处理 def viewpdf(): global v2 filename = filedialog.askopenfilename( initialdir=os.getcwd(), title="Select PDF File", filetype=(('PDF File', '.pdf'), ('PDF File', '.PDF')) ) if filename: # 销毁主窗口旧的PDF视图 if v2: v2.destroy() # 更新主窗口的PDF视图 v1 = pdf.ShowPdf() v1.img_object_li.clear() v2 = v1.pdf_view(view_frame, pdf_location=open(filename,"rb"), height=50, width=80) v2.pack(pady=(0,0)) # 调用弹出窗口显示PDF popup(filename) # 设置按钮,直接绑定viewpdf函数即可 view_button = Button(view_frame, text='SEARCH FOR FILES', command=viewpdf, width=50, bd=5) view_button.pack() root.mainloop()
关键改动说明
- 弹出窗口加载PDF:在
popup函数中新增PDF加载逻辑,使用弹出窗口win作为父容器,创建PDF查看组件并显示。 - 调整执行顺序:把
popup的调用放到viewpdf函数内部,确保只有用户选择有效文件后才弹出窗口,且传入最新文件名。 - 优化文件类型过滤:移除不必要的
.txt文件类型,只保留PDF格式,避免选择错误文件。 - 窗口大小调整:增大弹出窗口尺寸,让PDF内容正常显示。
- 文件打开方式:将
open(filename,"r")改为open(filename,"rb"),PDF是二进制文件,用只读二进制模式打开更规范。
内容的提问来源于stack exchange,提问作者EQq
相关产品推荐
相关产品推荐

