搭建基于tkinter的一个View框架,实现多个页面切换(续)
1.搭建基于tkinter的一个View框架,实现多个页面切换
2.搭建基于tkinter的一个View框架,实现多个页面切换(续)
3.主窗口+子窗口 实现复杂GUI模式4.张大头 电机驱动模块 modbus-rtu 通信 pymodbus 3.8.3同样使用面向对象设计方法,定义一个tk.Frame派生类,class PlotCurve(tk.Frame)。此类在窗口中作为一个控件显示。
# -*- coding: utf-8 -*- """ 使用matplotlib绘制图形,并在窗口中显示 """ import tkinter as tk from tkinter import ttk # 绘图需要 from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk from matplotlib.figure import Figure # 定义一个tk.Frame派生类,class PlotCurve(tk.Frame): # 绘图需要 # from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk # from matplotlib.figure import Figure class PlotCurve(tk.Frame): def __init__(self, parent): super().__init__(parent) self.name = "Class: PlotCurve(tk.Frame)" # 创建Matplotlib图形和画布 fig = Figure(figsize=(5, 5), dpi=100) a = fig.add_subplot(111) a.plot([1, 2, 3, 4, 5, 6, 7, 8], [5, 6, 1, 3, 8, 9, 3, 5]) canvas = FigureCanvasTkAgg(fig, self) canvas.draw() canvas_widget = canvas.get_tk_widget() canvas_widget.pack(side=tk.TOP, fill=tk.BOTH, expand=True) self.print_class() def print_class(self): print(self.name) if __name__ == "__main__": root = tk.Tk() PlotCurve(root).pack() root.mainloop()
将调试通过的tk.Frame派生类,class PlotCurve(tk.Frame)集成到 《1、搭建基于tkinter的一个View框架,实现多个页面切换》中定义的框架代码中。
# -*- coding: utf-8 -*- import tkinter as tk from tkinter import ttk # 绘图需要 from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk from matplotlib.figure import Figure # 设置全局字体样式 LARGE_FONT = ("Verdana", 12) # 定义一个tk.Tk派生类 class AppView(tk.Tk): def __init__(self): super().__init__() self.name ="Class: Application(tk.Tk)" self.wm_title("多页面切换程序") # 创建一个容器框架来放置所有页面 self.container = tk.Frame(self) self.container.pack(side="top", fill="both", expand=True)# 同一个容器内,使用布局方法必须相同 self.container.grid_rowconfigure(0, weight=1) self.container.grid_columnconfigure(0, weight=1) # 初始化页面框架字典 self.pages = {} for F in (StartPage, PageOne, PageTwo, PageThree): frame = F(self.container, self) self.pages[F] = frame frame.grid(row=0, column=0, sticky="nsew") # 显示起始页面 self.show_page(StartPage) # 创建工具栏 Frame self.toolbar_frame = tk.Frame(self, bg='gray') self.toolbar_frame.pack(side=tk.BOTTOM, fill=tk.X)# 同一个容器内,使用布局方法必须相同 # 创建按钮并绑定页面切换命令 self.create_toolbar_buttons() def show_page(self, cont): frame = self.pages[cont] frame.tkraise() def create_toolbar_buttons(self): self.button1 = ttk.Button(self.toolbar_frame, text="去到第一页", command=lambda: self.show_page(PageOne)).pack(side=tk.LEFT) # 同一个容器内,使用布局方法必须相同 self.button2 = ttk.Button(self.toolbar_frame, text="去到第二页", command=lambda: self.show_page(PageTwo)).pack(side=tk.LEFT) # 同一个容器内,使用布局方法必须相同 self.button3 = ttk.Button(self.toolbar_frame, text="去到第三页", command=lambda: self.show_page(PageThree)).pack(side=tk.LEFT)# 同一个容器内,使用布局方法必须相同 self.button4 = ttk.Button(self.toolbar_frame, text="去到主页面", command=lambda: self.show_page(StartPage)).pack(side=tk.LEFT)# 同一个容器内,使用布局方法必须相同 def print_class(self): print(self.name) # 定义一个tk.Frame派生类(以StartPage为例,其他页面类似) class StartPage(tk.Frame): def __init__(self, parent, root): self.name ="Class: StartPage(tk.Tk)" super().__init__(parent) label = tk.Label(self, text="这里是主页", font=LARGE_FONT) label.pack(pady=10, padx=10)# 同一个容器内,使用布局方法必须相同 root.print_class() def print_class(self): print(self.name) # 类似地定义PageOne, PageTwo, PageThree(省略以避免重复) # 定义一个tk.Frame派生类,class PageOne(tk.Frame): class PageOne(tk.Frame): def __init__(self, parent, root): self.name = "Class: StartPage(tk.Tk)" super().__init__(parent) label = tk.Label(self, text="这里是1页", font=LARGE_FONT) label.pack(pady=10, padx=10)# 同一个容器内,使用布局方法必须相同 root.print_class() def print_class(self): print(self.name) # 定义一个tk.Frame派生类,class PageTwo(tk.Frame): class PageTwo(tk.Frame): def __init__(self, parent, root): super().__init__(parent) self.name = "Class: StartPage(tk.Tk)" label = tk.Label(self, text="这里是2页", font=LARGE_FONT) label.pack(pady=10, padx=10)# 同一个容器内,使用布局方法必须相同 root.print_class() def print_class(self): print(self.name) # 定义一个tk.Frame派生类,class PageThree(tk.Frame): class PageThree(tk.Frame): def __init__(self, parent, root): super().__init__(parent) self.name = "Class: StartPage(tk.Tk)" label = tk.Label(self, text="这里是3页", font=LARGE_FONT) label.pack(pady=10, padx=10)# 同一个容器内,使用布局方法必须相同 root.print_class() PlotCurve(self).pack(side=tk.TOP) # 定义 PlotCurve控件 def print_class(self): print(self.name) # 定义一个tk.Frame派生类,class PlotCurve(tk.Frame): # 绘图需要 # from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk # from matplotlib.figure import Figure class PlotCurve(tk.Frame): def __init__(self, parent): super().__init__(parent) self.name = "Class: PlotCurve(tk.Frame)" # 创建Matplotlib图形和画布 fig = Figure(figsize=(5, 5), dpi=100) a = fig.add_subplot(111) a.plot([1, 2, 3, 4, 5, 6, 7, 8], [5, 6, 1, 3, 8, 9, 3, 5]) canvas = FigureCanvasTkAgg(fig, self) canvas.draw() canvas_widget = canvas.get_tk_widget() canvas_widget.pack(side=tk.TOP, fill=tk.BOTH, expand=True) self.print_class() def print_class(self): print(self.name) if __name__ == '__main__': app = AppView() app.mainloop()
合集:
一个有点复杂的项目-MVC
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)