搭建基于tkinter的一个View框架,实现多个页面切换(续)

同样使用面向对象设计方法,定义一个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()
复制代码

 

posted @   辛河  阅读(24)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示