Tkinter中导入Gallery组件的三类技术问题咨询
Tkinter Gallery组件相关问题
- 单独运行Gallery模块时,组件以640x480正常尺寸显示,但导入后却变为小窗口;
- 导入后的Gallery组件显示在主窗口右上角,想移至主窗口中心,但之前的代码会额外生成空窗口;
- 希望将导入的Gallery组件嵌入主窗口,合并为单一窗口而非独立的两个窗口。
相关代码
old_code.py
def get_gallery(self): from GUI.module.gallery import Gallery Gallery(tk.Toplevel(self.root)).pack(fill=tk.BOTH, expand=1) x = self.root.winfo_x() y = self.root.winfo_y() tk.Toplevel(self.root).geometry("+%d+%d" % (x + 600, y + 800))
gallery.py
class Gallery(tk.Frame): # gallery的具体实现代码 if __name__ == '__main__': root = tk.Tk() root.geometry("%dx%d" % (640, 480)) root.title("Open file") app = Gallery(root) app.pack(fill=tk.BOTH, expand=1) root.mainloop()
main.py
... def get_gallery(self): from GUI.module.gallery import Gallery Gallery(tk.Toplevel(self.root)).pack() def get_run_gallery(self): jpg = tk.Button(self.frame, text="Gallery", command=self.get_gallery) self.my_canvas.create_window(780, 220, anchor="nw", window=jpg, height=50, width=200) ... def get_run_first_page(): # 相关调用逻辑 pass if __name__ == '__main__': first = MainPage(tk.Tk()) first.get_run_first_page()
解决方案
问题1:导入后Gallery变为小窗口
单独运行时给主窗口设置了640x480的尺寸,且让Gallery填充整个窗口,但导入时:
- 用
tk.Toplevel()创建的新窗口默认无尺寸设置; - 仅调用
pack()未添加fill=tk.BOTH, expand=1,导致Gallery无法填充Toplevel窗口。
修改main.py的get_gallery方法:
def get_gallery(self): from GUI.module.gallery import Gallery top = tk.Toplevel(self.root) top.geometry("640x480") # 同步单独运行时的尺寸 gallery = Gallery(top) gallery.pack(fill=tk.BOTH, expand=1) # 让Gallery填充整个Toplevel
问题2:将Gallery窗口移至主窗口中心,避免空窗口
原代码的问题是创建了两个tk.Toplevel(),第二个就是多余的空窗口。只需创建一个Toplevel,计算主窗口中心位置后设置其坐标:
def get_gallery(self): from GUI.module.gallery import Gallery top = tk.Toplevel(self.root) top.geometry("640x480") # 计算主窗口的中心偏移量 root_x = self.root.winfo_x() root_y = self.root.winfo_y() root_w = self.root.winfo_width() root_h = self.root.winfo_height() # 计算Toplevel的左上角坐标,使其居中 top_x = root_x + (root_w - 640) // 2 top_y = root_y + (root_h - 480) // 2 top.geometry(f"+{top_x}+{top_y}") gallery = Gallery(top) gallery.pack(fill=tk.BOTH, expand=1)
问题3:将Gallery嵌入主窗口,合并为单一窗口
不需要创建tk.Toplevel(),直接将Gallery的父组件设为主窗口内的容器(比如self.frame或画布容器):
def get_gallery(self): from GUI.module.gallery import Gallery # 以self.frame为父容器,将Gallery嵌入主窗口 gallery = Gallery(self.frame) gallery.pack(fill=tk.BOTH, expand=1) # 根据布局需求调整参数 # 如果需要放在画布中,可参考按钮的创建方式: # self.my_canvas.create_window(400, 300, window=gallery, anchor="center")
内容的提问来源于stack exchange,提问作者Luziklolek
相关产品推荐
相关产品推荐

