Python使用tkinter库开发图形可视化工具的完整代码指南

        很多时候,我们希望有一个程序,能够直接设置不同的参数,就显示这个图形的效果,基于这样的目的,今天我们设计开发一个基于python的tkinter库的一个图形可视化程序。这个应用程序实现了一个图形可视化工具,它具有以下特点:

  1. 菜单栏包含了 5 种图形类型:饼图、柱状图、折线图、散点图和直方图
  2. 每个图形都有独立的参数设置界面,可以自定义标题、标签、颜色等属性
  3. 可以实时预览图形效果,点击 "生成图形" 按钮更新显示
  4. 提供 "重置参数" 按钮,方便恢复默认设置
  5. 界面美观,布局合理,支持中文显示

以下是一个实现了的界面效果:

        你可以运行这个程序,通过菜单选择不同的图形类型,然后在左侧设置参数,右侧就会实时显示图形效果。
        接下来,我们将详细讲解这个程序是如何实现的:

        这个图形可视化工具基于 Python 的 tkinter 和 matplotlib 库开发,提供了一个直观的界面来创建和定制不同类型的图形。下面我将详细解释代码的各个部分。

1. 导入必要的库

        有关tkinter库的内容,可以看我的CSDN文章:基于Python的tkinter库创建图形用户界面-CSDN博客

import tkinter as tk
from tkinter import ttk, messagebox, scrolledtext
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import numpy as np
import random

# 设置matplotlib支持中文显示
plt.rcParams["font.family"] = ["SimHei", "WenQuanYi Micro Hei", "Heiti TC"]
plt.rcParams["axes.unicode_minus"] = False  # 解决负号显示问题

代码说明:

  • tkinter:用于创建 GUI 界面。
  • matplotlib:用于绘制各种图形。
  • numpyrandom:用于生成示例数据。
  • 字体设置:确保中文能正常显示在图形中。
  •         其中tkinter是python的标准库,不需要安装,matplotlib、numpy是需要安装的,在CMD中安装即可。命令如下:

    pip install matplotlib numpy -i https://pypi.tuna.tsinghua.edu.cn/simple

    2. 主应用类 GraphVisualizerApp

            包好了GraphVisualizerApp类的初始化函数,实例化时设定窗体的标题、窗口大小,创建菜单栏、主框架,以及默认的首界面信息。采用pack的布局方式。

    class GraphVisualizerApp:
        def __init__(self, root):
            self.root = root
            self.root.title("图形可视化工具")
            self.root.geometry("1000x600")
            
            # 创建菜单栏
            self.create_menu()
            
            # 创建主框架
            self.main_frame = ttk.Frame(root)
            self.main_frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)
            
            # 创建参数设置区域和图形显示区域
            self.setup_layout()
            
            # 默认显示饼图
            self.current_graph_type = "pie"
            self.show_pie_chart()
    

    代码说明:

  • 初始化窗口大小、标题,并设置默认图形为饼图。
  • 界面分为左侧参数设置区和右侧图形显示区。
  • 3. 菜单栏创建

            菜单中,包含三个菜单,第一个菜单显示“图形类型”,里面不同图形的子菜单。以及“关于”和“退出”两个一级菜单。

    def create_menu(self):
        menubar = tk.Menu(self.root)
        
        graph_menu = tk.Menu(menubar, tearoff=0)
        graph_menu.add_command(label="饼图", command=self.show_pie_chart)
        graph_menu.add_command(label="柱状图", command=self.show_bar_chart)
        graph_menu.add_command(label="折线图", command=self.show_line_chart)
        graph_menu.add_command(label="散点图", command=self.show_scatter_chart)
        graph_menu.add_command(label="直方图", command=self.show_histogram)
        
        menubar.add_cascade(label="图形类型", menu=graph_menu)
        menubar.add_command(label="关于", command=self.show_about)
        menubar.add_command(label="退出", command=self.root.quit)
        
        self.root.config(menu=menubar)
    

    代码说明:

  • 主菜单包含 "图形类型" 下拉菜单和 "关于"/"退出" 选项。
  • 每个图形类型对应一个回调函数,用于切换到相应的图形设置界面。
  • 4. 界面布局设置

            setup_layout()函数是框架函数,创建框架以及对框架进行布局。

    def setup_layout(self):
        # 创建左右框架
        left_frame = ttk.LabelFrame(self.main_frame, text="参数设置")
        left_frame.pack(side=tk.LEFT, fill=tk.BOTH, expand=False, padx=5, pady=5)
        
        right_frame = ttk.LabelFrame(self.main_frame, text="图形显示")
        right_frame.pack(side=tk.RIGHT, fill=tk.BOTH, expand=True, padx=5, pady=5)
        
        # 参数设置区域
        self.param_frame = ttk.Frame(left_frame)
        self.param_frame.pack(fill=tk.BOTH, expand=True, padx=5, pady=5)
        
        # 图形显示区域
        self.figure = plt.figure(figsize=(6, 5), dpi=100)
        self.canvas = FigureCanvasTkAgg(self.figure, master=right_frame)
        self.canvas.get_tk_widget().pack(fill=tk.BOTH, expand=True)
        
        # 按钮区域
        btn_frame = ttk.Frame(left_frame)
        btn_frame.pack(fill=tk.X, padx=5, pady=5)
        
        ttk.Button(btn_frame, text="生成图形", command=self.generate_graph).pack(side=tk.LEFT, padx=5)
        ttk.Button(btn_frame, text="重置参数", command=self.reset_params).pack(side=tk.LEFT, padx=5)
    

    代码说明:

  • 左侧:参数设置区和操作按钮(生成图形、重置参数)。
  • 右侧:matplotlib 图形显示区域。
  • 使用FigureCanvasTkAgg将 matplotlib 图形嵌入 tkinter 窗口。
  • 修改参数后,点击“生成图形”,新的图形在右侧显示:

    点击“重置参数”,恢复默认的效果。

    5. 图形参数设置界面

            以饼图为例:

    以下是实现饼图的函数:

    def show_pie_chart(self):
        self.current_graph_type = "pie"
        self.clear_param_frame()  # 清除现有控件
        
        ttk.Label(self.param_frame, text="数据标签(用逗号分隔):").grid(row=0, column=0, sticky=tk.W, pady=5)
        self.pie_labels = ttk.Entry(self.param_frame, width=30)
        self.pie_labels.insert(0, "A,B,C,D,E")
        self.pie_labels.grid(row=0, column=1, pady=5)
        
        ttk.Label(self.param_frame, text="数据值(用逗号分隔):").grid(row=1, column=0, sticky=tk.W, pady=5)
        self.pie_values = ttk.Entry(self.param_frame, width=30)
        self.pie_values.insert(0, "15,30,45,10,20")
        self.pie_values.grid(row=1, column=1, pady=5)
        
        # ... 其他参数设置 ...
        
        self.generate_graph()  # 生成默认图形
    

    代码说明:

  • 每种图形类型都有独立的参数设置函数。
  • 通过clear_param_frame()清除旧参数控件,避免重叠。
  • 提供默认值,方便用户快速预览。
  • 6. 图形生成函数

            设置参数后,要重新生成图形,并使用FigureCanvasTkAgg将新的matplotlib 图形嵌入 tkinter 窗口显示在右侧。以下是生成图形的函数:

    def generate_graph(self):
        self.figure.clear()
        
        try:
            if self.current_graph_type == "pie":
                labels = self.pie_labels.get().split(',')
                values = [float(x) for x in self.pie_values.get().split(',')]
                title = self.pie_title.get()
                show_percent = self.pie_show_percent.get()
                
                ax = self.figure.add_subplot(111)
                ax.pie(values, labels=labels, autopct='%1.1f%%' if show_percent else None, startangle=90)
                ax.axis('equal')
                ax.set_title(title)
            
            elif self.current_graph_type == "bar":
                # 柱状图生成代码...
            
            # ... 其他图形类型 ...
            
            self.figure.tight_layout()
            self.canvas.draw()
        
        except Exception as e:
            messagebox.showerror("错误", f"生成图形时出错: {str(e)}")
    

    代码说明:

  • 根据当前选择的图形类型,获取对应参数并绘制图形。
  • 使用try-except捕获可能的参数错误,提供友好的错误提示。
  • 7. 重置参数和关于对话框

    def reset_params(self):
        # 根据当前图形类型重置对应参数
        # 例如:
        if self.current_graph_type == "pie":
            self.pie_labels.delete(0, tk.END)
            self.pie_labels.insert(0, "A,B,C,D,E")
            # ... 重置其他参数 ...
        
        self.generate_graph()
    
    def show_about(self):
        messagebox.showinfo("关于", "图形可视化工具 v1.0\n\n支持饼图、柱状图、折线图、散点图和直方图等多种图形类型。")
    

    代码说明:

  • 重置参数:恢复每种图形的默认设置。
  • 关于对话框:显示程序信息。
  • 8. 程序入口

    if __name__ == "__main__":
        root = tk.Tk()
        app = GraphVisualizerApp(root)
        root.mainloop()
    

    代码说明:

  • 创建 tkinter 根窗口,实例化应用类,启动主事件循环。
  • 9.使用说明

    1. 运行程序后,默认显示饼图界面。
    2. 通过菜单栏选择不同图形类型(饼图、柱状图等)。
    3. 在左侧参数设置区修改图形参数。
    4. 点击 "生成图形" 按钮更新右侧图形。
    5. 点击 "重置参数" 恢复默认设置。

    有多种图形类型:

    10.完整代码

    import tkinter as tk
    from tkinter import ttk, messagebox, scrolledtext
    import matplotlib.pyplot as plt
    from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
    import numpy as np
    import random
    
    # 设置matplotlib支持中文显示
    plt.rcParams["font.family"] = ["SimHei", "WenQuanYi Micro Hei", "Heiti TC"]
    plt.rcParams["axes.unicode_minus"] = False  # 解决负号显示问题
    
    class GraphVisualizerApp:
        def __init__(self, root):
            self.root = root
            self.root.title("图形可视化工具")
            self.root.geometry("1000x600")
            
            # 创建菜单栏
            self.create_menu()
            
            # 创建主框架
            self.main_frame = ttk.Frame(root)
            self.main_frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)
            
            # 创建参数设置区域和图形显示区域
            self.setup_layout()
            
            # 默认显示饼图
            self.current_graph_type = "pie"
            self.show_pie_chart()
        
        def create_menu(self):
            """创建菜单栏"""
            menubar = tk.Menu(self.root)
            
            # 创建"图形类型"菜单
            graph_menu = tk.Menu(menubar, tearoff=0)
            graph_menu.add_command(label="饼图", command=self.show_pie_chart)
            graph_menu.add_command(label="柱状图", command=self.show_bar_chart)
            graph_menu.add_command(label="折线图", command=self.show_line_chart)
            graph_menu.add_command(label="散点图", command=self.show_scatter_chart)
            graph_menu.add_command(label="直方图", command=self.show_histogram)
            
            menubar.add_cascade(label="图形类型", menu=graph_menu)
            menubar.add_command(label="关于", command=self.show_about)
            menubar.add_command(label="退出", command=self.root.quit)
            
            self.root.config(menu=menubar)
        
        def setup_layout(self):
            """设置界面布局"""
            # 创建左右框架
            left_frame = ttk.LabelFrame(self.main_frame, text="参数设置")
            left_frame.pack(side=tk.LEFT, fill=tk.BOTH, expand=False, padx=5, pady=5)
            
            right_frame = ttk.LabelFrame(self.main_frame, text="图形显示")
            right_frame.pack(side=tk.RIGHT, fill=tk.BOTH, expand=True, padx=5, pady=5)
            
            # 参数设置区域 - 使用一个框架作为容器
            self.param_frame = ttk.Frame(left_frame)
            self.param_frame.pack(fill=tk.BOTH, expand=True, padx=5, pady=5)
            
            # 图形显示区域
            self.figure = plt.figure(figsize=(6, 5), dpi=100)
            self.canvas = FigureCanvasTkAgg(self.figure, master=right_frame)
            self.canvas.get_tk_widget().pack(fill=tk.BOTH, expand=True)
            
            # 按钮区域
            btn_frame = ttk.Frame(left_frame)
            btn_frame.pack(fill=tk.X, padx=5, pady=5)
            
            ttk.Button(btn_frame, text="生成图形", command=self.generate_graph).pack(side=tk.LEFT, padx=5)
            ttk.Button(btn_frame, text="重置参数", command=self.reset_params).pack(side=tk.LEFT, padx=5)
        
        def clear_param_frame(self):
            """清除参数设置区域的所有控件"""
            for widget in self.param_frame.winfo_children():
                widget.destroy()
        
        def show_pie_chart(self):
            """显示饼图设置界面"""
            self.current_graph_type = "pie"
            self.clear_param_frame()
            self.root.title("图形可视化工具 - 饼图")
            
            ttk.Label(self.param_frame, text="数据标签(用逗号分隔):").grid(row=0, column=0, sticky=tk.W, pady=5)
            self.pie_labels = ttk.Entry(self.param_frame, width=30)
            self.pie_labels.insert(0, "A,B,C,D,E")
            self.pie_labels.grid(row=0, column=1, pady=5)
            
            ttk.Label(self.param_frame, text="数据值(用逗号分隔):").grid(row=1, column=0, sticky=tk.W, pady=5)
            self.pie_values = ttk.Entry(self.param_frame, width=30)
            self.pie_values.insert(0, "15,30,45,10,20")
            self.pie_values.grid(row=1, column=1, pady=5)
            
            ttk.Label(self.param_frame, text="标题:").grid(row=2, column=0, sticky=tk.W, pady=5)
            self.pie_title = ttk.Entry(self.param_frame, width=30)
            self.pie_title.insert(0, "饼图示例")
            self.pie_title.grid(row=2, column=1, pady=5)
            
            ttk.Label(self.param_frame, text="是否显示百分比:").grid(row=3, column=0, sticky=tk.W, pady=5)
            self.pie_show_percent = tk.BooleanVar(value=True)
            ttk.Checkbutton(self.param_frame, variable=self.pie_show_percent).grid(row=3, column=1, sticky=tk.W, pady=5)
            
            # 生成默认图形
            self.generate_graph()
        
        def show_bar_chart(self):
            """显示柱状图设置界面"""
            self.current_graph_type = "bar"
            self.clear_param_frame()
            self.root.title("图形可视化工具 - 柱状图")
            
            ttk.Label(self.param_frame, text="X轴标签(用逗号分隔):").grid(row=0, column=0, sticky=tk.W, pady=5)
            self.bar_labels = ttk.Entry(self.param_frame, width=30)
            self.bar_labels.insert(0, "一月,二月,三月,四月,五月")
            self.bar_labels.grid(row=0, column=1, pady=5)
            
            ttk.Label(self.param_frame, text="Y轴值(用逗号分隔):").grid(row=1, column=0, sticky=tk.W, pady=5)
            self.bar_values = ttk.Entry(self.param_frame, width=30)
            self.bar_values.insert(0, "65,70,80,90,85")
            self.bar_values.grid(row=1, column=1, pady=5)
            
            ttk.Label(self.param_frame, text="标题:").grid(row=2, column=0, sticky=tk.W, pady=5)
            self.bar_title = ttk.Entry(self.param_frame, width=30)
            self.bar_title.insert(0, "柱状图示例")
            self.bar_title.grid(row=2, column=1, pady=5)
            
            ttk.Label(self.param_frame, text="X轴标签:").grid(row=3, column=0, sticky=tk.W, pady=5)
            self.bar_xlabel = ttk.Entry(self.param_frame, width=30)
            self.bar_xlabel.insert(0, "月份")
            self.bar_xlabel.grid(row=3, column=1, pady=5)
            
            ttk.Label(self.param_frame, text="Y轴标签:").grid(row=4, column=0, sticky=tk.W, pady=5)
            self.bar_ylabel = ttk.Entry(self.param_frame, width=30)
            self.bar_ylabel.insert(0, "数值")
            self.bar_ylabel.grid(row=4, column=1, pady=5)
            
            # 生成默认图形
            self.generate_graph()
        
        def show_line_chart(self):
            """显示折线图设置界面"""
            self.current_graph_type = "line"
            self.clear_param_frame()
            self.root.title("图形可视化工具 - 折线图")
            
            ttk.Label(self.param_frame, text="X轴数据(用逗号分隔):").grid(row=0, column=0, sticky=tk.W, pady=5)
            self.line_x = ttk.Entry(self.param_frame, width=30)
            self.line_x.insert(0, "1,2,3,4,5,6,7")
            self.line_x.grid(row=0, column=1, pady=5)
            
            ttk.Label(self.param_frame, text="Y轴数据(用逗号分隔):").grid(row=1, column=0, sticky=tk.W, pady=5)
            self.line_y = ttk.Entry(self.param_frame, width=30)
            self.line_y.insert(0, "65,59,80,81,56,55,70")
            self.line_y.grid(row=1, column=1, pady=5)
            
            ttk.Label(self.param_frame, text="标题:").grid(row=2, column=0, sticky=tk.W, pady=5)
            self.line_title = ttk.Entry(self.param_frame, width=30)
            self.line_title.insert(0, "折线图示例")
            self.line_title.grid(row=2, column=1, pady=5)
            
            ttk.Label(self.param_frame, text="X轴标签:").grid(row=3, column=0, sticky=tk.W, pady=5)
            self.line_xlabel = ttk.Entry(self.param_frame, width=30)
            self.line_xlabel.insert(0, "X轴")
            self.line_xlabel.grid(row=3, column=1, pady=5)
            
            ttk.Label(self.param_frame, text="Y轴标签:").grid(row=4, column=0, sticky=tk.W, pady=5)
            self.line_ylabel = ttk.Entry(self.param_frame, width=30)
            self.line_ylabel.insert(0, "Y轴")
            self.line_ylabel.grid(row=4, column=1, pady=5)
            
            ttk.Label(self.param_frame, text="线条颜色:").grid(row=5, column=0, sticky=tk.W, pady=5)
            self.line_color = ttk.Combobox(self.param_frame, values=["blue", "red", "green", "black", "purple"], width=27)
            self.line_color.current(0)
            self.line_color.grid(row=5, column=1, pady=5)
            
            # 生成默认图形
            self.generate_graph()
        
        def show_scatter_chart(self):
            """显示散点图设置界面"""
            self.current_graph_type = "scatter"
            self.clear_param_frame()
            self.root.title("图形可视化工具 - 散点图")
            
            ttk.Label(self.param_frame, text="X轴数据(用逗号分隔):").grid(row=0, column=0, sticky=tk.W, pady=5)
            self.scatter_x = ttk.Entry(self.param_frame, width=30)
            self.scatter_x.insert(0, "1,2,3,4,5,6,7")
            self.scatter_x.grid(row=0, column=1, pady=5)
            
            ttk.Label(self.param_frame, text="Y轴数据(用逗号分隔):").grid(row=1, column=0, sticky=tk.W, pady=5)
            self.scatter_y = ttk.Entry(self.param_frame, width=30)
            self.scatter_y.insert(0, "65,59,80,81,56,55,70")
            self.scatter_y.grid(row=1, column=1, pady=5)
            
            ttk.Label(self.param_frame, text="标题:").grid(row=2, column=0, sticky=tk.W, pady=5)
            self.scatter_title = ttk.Entry(self.param_frame, width=30)
            self.scatter_title.insert(0, "散点图示例")
            self.scatter_title.grid(row=2, column=1, pady=5)
            
            ttk.Label(self.param_frame, text="X轴标签:").grid(row=3, column=0, sticky=tk.W, pady=5)
            self.scatter_xlabel = ttk.Entry(self.param_frame, width=30)
            self.scatter_xlabel.insert(0, "X轴")
            self.scatter_xlabel.grid(row=3, column=1, pady=5)
            
            ttk.Label(self.param_frame, text="Y轴标签:").grid(row=4, column=0, sticky=tk.W, pady=5)
            self.scatter_ylabel = ttk.Entry(self.param_frame, width=30)
            self.scatter_ylabel.insert(0, "Y轴")
            self.scatter_ylabel.grid(row=4, column=1, pady=5)
            
            ttk.Label(self.param_frame, text="点的大小:").grid(row=5, column=0, sticky=tk.W, pady=5)
            self.scatter_size = ttk.Scale(self.param_frame, from_=10, to=200, orient=tk.HORIZONTAL, length=200)
            self.scatter_size.set(50)
            self.scatter_size.grid(row=5, column=1, pady=5)
            
            # 生成默认图形
            self.generate_graph()
        
        def show_histogram(self):
            """显示直方图设置界面"""
            self.current_graph_type = "histogram"
            self.clear_param_frame()
            self.root.title("图形可视化工具 - 直方图")
            
            ttk.Label(self.param_frame, text="数据(用逗号分隔):").grid(row=0, column=0, sticky=tk.W, pady=5)
            self.hist_data = ttk.Entry(self.param_frame, width=30)
            # 生成一些随机数据
            random_data = [random.normalvariate(50, 15) for _ in range(100)]
            self.hist_data.insert(0, ",".join([str(round(x, 1)) for x in random_data]))
            self.hist_data.grid(row=0, column=1, pady=5)
            
            ttk.Label(self.param_frame, text="标题:").grid(row=1, column=0, sticky=tk.W, pady=5)
            self.hist_title = ttk.Entry(self.param_frame, width=30)
            self.hist_title.insert(0, "直方图示例")
            self.hist_title.grid(row=1, column=1, pady=5)
            
            ttk.Label(self.param_frame, text="X轴标签:").grid(row=2, column=0, sticky=tk.W, pady=5)
            self.hist_xlabel = ttk.Entry(self.param_frame, width=30)
            self.hist_xlabel.insert(0, "数值")
            self.hist_xlabel.grid(row=2, column=1, pady=5)
            
            ttk.Label(self.param_frame, text="Y轴标签:").grid(row=3, column=0, sticky=tk.W, pady=5)
            self.hist_ylabel = ttk.Entry(self.param_frame, width=30)
            self.hist_ylabel.insert(0, "频率")
            self.hist_ylabel.grid(row=3, column=1, pady=5)
            
            ttk.Label(self.param_frame, text="分箱数量:").grid(row=4, column=0, sticky=tk.W, pady=5)
            self.hist_bins = ttk.Scale(self.param_frame, from_=5, to=50, orient=tk.HORIZONTAL, length=200)
            self.hist_bins.set(10)
            self.hist_bins.grid(row=4, column=1, pady=5)
            
            # 生成默认图形
            self.generate_graph()
        
        def generate_graph(self):
            """根据当前选择的图形类型生成图形"""
            self.figure.clear()
            
            try:
                if self.current_graph_type == "pie":
                    # 饼图
                    labels = self.pie_labels.get().split(',')
                    values = [float(x) for x in self.pie_values.get().split(',')]
                    title = self.pie_title.get()
                    show_percent = self.pie_show_percent.get()
                    
                    ax = self.figure.add_subplot(111)
                    autopct = '%1.1f%%' if show_percent else None
                    ax.pie(values, labels=labels, autopct=autopct, startangle=90)
                    ax.axis('equal')  # 使饼图为正圆形
                    ax.set_title(title)
                
                elif self.current_graph_type == "bar":
                    # 柱状图
                    labels = self.bar_labels.get().split(',')
                    values = [float(x) for x in self.bar_values.get().split(',')]
                    title = self.bar_title.get()
                    xlabel = self.bar_xlabel.get()
                    ylabel = self.bar_ylabel.get()
                    
                    ax = self.figure.add_subplot(111)
                    ax.bar(labels, values)
                    ax.set_xlabel(xlabel)
                    ax.set_ylabel(ylabel)
                    ax.set_title(title)
                    plt.xticks(rotation=45)
                
                elif self.current_graph_type == "line":
                    # 折线图
                    x = [float(i) for i in self.line_x.get().split(',')]
                    y = [float(i) for i in self.line_y.get().split(',')]
                    title = self.line_title.get()
                    xlabel = self.line_xlabel.get()
                    ylabel = self.line_ylabel.get()
                    color = self.line_color.get()
                    
                    ax = self.figure.add_subplot(111)
                    ax.plot(x, y, color=color)
                    ax.set_xlabel(xlabel)
                    ax.set_ylabel(ylabel)
                    ax.set_title(title)
                
                elif self.current_graph_type == "scatter":
                    # 散点图
                    x = [float(i) for i in self.scatter_x.get().split(',')]
                    y = [float(i) for i in self.scatter_y.get().split(',')]
                    title = self.scatter_title.get()
                    xlabel = self.scatter_xlabel.get()
                    ylabel = self.scatter_ylabel.get()
                    size = self.scatter_size.get()
                    
                    ax = self.figure.add_subplot(111)
                    ax.scatter(x, y, s=size)
                    ax.set_xlabel(xlabel)
                    ax.set_ylabel(ylabel)
                    ax.set_title(title)
                
                elif self.current_graph_type == "histogram":
                    # 直方图
                    data = [float(i) for i in self.hist_data.get().split(',')]
                    title = self.hist_title.get()
                    xlabel = self.hist_xlabel.get()
                    ylabel = self.hist_ylabel.get()
                    bins = int(self.hist_bins.get())
                    
                    ax = self.figure.add_subplot(111)
                    ax.hist(data, bins=bins)
                    ax.set_xlabel(xlabel)
                    ax.set_ylabel(ylabel)
                    ax.set_title(title)
                
                # 调整布局并绘制图形
                self.figure.tight_layout()
                self.canvas.draw()
            
            except Exception as e:
                messagebox.showerror("错误", f"生成图形时出错: {str(e)}")
        
        def reset_params(self):
            """重置当前图形的参数"""
            if self.current_graph_type == "pie":
                self.pie_labels.delete(0, tk.END)
                self.pie_labels.insert(0, "A,B,C,D,E")
                self.pie_values.delete(0, tk.END)
                self.pie_values.insert(0, "15,30,45,10,20")
                self.pie_title.delete(0, tk.END)
                self.pie_title.insert(0, "饼图示例")
                self.pie_show_percent.set(True)
            
            elif self.current_graph_type == "bar":
                self.bar_labels.delete(0, tk.END)
                self.bar_labels.insert(0, "一月,二月,三月,四月,五月")
                self.bar_values.delete(0, tk.END)
                self.bar_values.insert(0, "65,70,80,90,85")
                self.bar_title.delete(0, tk.END)
                self.bar_title.insert(0, "柱状图示例")
                self.bar_xlabel.delete(0, tk.END)
                self.bar_xlabel.insert(0, "月份")
                self.bar_ylabel.delete(0, tk.END)
                self.bar_ylabel.insert(0, "数值")
            
            elif self.current_graph_type == "line":
                self.line_x.delete(0, tk.END)
                self.line_x.insert(0, "1,2,3,4,5,6,7")
                self.line_y.delete(0, tk.END)
                self.line_y.insert(0, "65,59,80,81,56,55,70")
                self.line_title.delete(0, tk.END)
                self.line_title.insert(0, "折线图示例")
                self.line_xlabel.delete(0, tk.END)
                self.line_xlabel.insert(0, "X轴")
                self.line_ylabel.delete(0, tk.END)
                self.line_ylabel.insert(0, "Y轴")
                self.line_color.current(0)
            
            elif self.current_graph_type == "scatter":
                self.scatter_x.delete(0, tk.END)
                self.scatter_x.insert(0, "1,2,3,4,5,6,7")
                self.scatter_y.delete(0, tk.END)
                self.scatter_y.insert(0, "65,59,80,81,56,55,70")
                self.scatter_title.delete(0, tk.END)
                self.scatter_title.insert(0, "散点图示例")
                self.scatter_xlabel.delete(0, tk.END)
                self.scatter_xlabel.insert(0, "X轴")
                self.scatter_ylabel.delete(0, tk.END)
                self.scatter_ylabel.insert(0, "Y轴")
                self.scatter_size.set(50)
            
            elif self.current_graph_type == "histogram":
                random_data = [random.normalvariate(50, 15) for _ in range(100)]
                self.hist_data.delete(0, tk.END)
                self.hist_data.insert(0, ",".join([str(round(x, 1)) for x in random_data]))
                self.hist_title.delete(0, tk.END)
                self.hist_title.insert(0, "直方图示例")
                self.hist_xlabel.delete(0, tk.END)
                self.hist_xlabel.insert(0, "数值")
                self.hist_ylabel.delete(0, tk.END)
                self.hist_ylabel.insert(0, "频率")
                self.hist_bins.set(10)
            
            # 重新生成图形
            self.generate_graph()
        
        def show_about(self):
            """显示关于对话框"""
            messagebox.showinfo("关于", "图形可视化工具 v1.0\n\n这是一个使用Python的tkinter和matplotlib库开发的图形可视化应用程序。\n\n支持饼图、柱状图、折线图、散点图和直方图等多种图形类型。")
    
    if __name__ == "__main__":
        root = tk.Tk()
        app = GraphVisualizerApp(root)
        root.mainloop()    

    11.其他图形的效果如下

            这个应用程序提供了一个直观的界面,让用户可以轻松创建和定制各种图形,无需编写代码。每个图形类型的参数设置都经过精心设计,确保用户能够灵活调整图形的外观和数据。

    希望大家喜欢。有更多想要的,可以跟博主联系。        

    作者:搏博

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python使用tkinter库开发图形可视化工具的完整代码指南

    发表回复