Tkinter用grid展示PDF报错:无法在grid管理的窗口内调用pack
解决方案
错误原因
报错是因为tkPDFViewer第三方库的pdf_view方法内部默认使用pack管理组件,哪怕你给返回的PDF组件手动调用grid,库代码已经先在你的root(Toplevel控件)下执行了pack操作,同一个父控件下同时存在grid和pack管理的子组件就会触发该错误。
修复方案
不用修改库源码,加一层中间Frame做布局隔离即可,同一父控件内只能用一种布局管理器,不同父控件的布局逻辑互不干扰:
修改后完整可运行代码
from tkinter import * from tkPDFViewer import tkPDFViewer as pdf mys = Tk() mys.title("Mystery Books") mys.config(bg='white') def dead(): root = Toplevel() root.geometry("550x750") # 新增中间承载容器 pdf_container = Frame(root) # 外层用grid和全局布局规则统一 pdf_container.grid(row=0, column=0) v1 = pdf.ShowPdf() # 将容器传给pdf_view,库内部的pack仅作用在容器内部,不会触发冲突 v1.pdf_view(pdf_container, pdf_location=r"C:\\Users\\mande\\Desktop\\Books\\Mystery\\Dead Until Dark.pdf") button_dead = Button(mys, text="Dead until Dark", font=30, padx=15, pady=15, height=2, width=12, command=dead,fg="black", bg="white", borderwidth=5) button_dead.grid(row=1, column=0, padx=7, pady=7) mys.mainloop()
额外说明
- 不需要在
dead函数里额外调用root.mainloop(),主窗口的mys.mainloop()已经可以处理所有子窗口的事件循环,重复调用可能引发未知问题。 - 如果你不想用中间容器,也可以直接找到
tkPDFViewer库的源码,定位ShowPdf类的pdf_view方法,将内部所有pack()调用替换为grid()即可,但该方案需要在每一个运行环境都修改库源码,通用性较差。
内容的提问来源于stack exchange,提问作者user16806547
相关产品推荐
相关产品推荐

