摘要:我打算设计一个界面,可以直接生成一个简单的图表,不需要输入数据,点击直接生成,每次点击都发生变化,当你找到需要的图标样式,可以点击保存,还设置一个清除图表的功能,比如折线图、柱状图等。
我打算设计一个界面,可以直接生成一个简单的图表,不需要输入数据,点击直接生成,每次点击都发生变化,当你找到需要的图标样式,可以点击保存,还设置一个清除图表的功能,比如折线图、柱状图等。
预想设计效果
用自带tkinter建立窗口,图表就matplotlib绘图库,没有的就要去P下,我的之前安装过了就不pip,已经安装了就不会安装,有必要可以更新
已经安装
我们可以先把要用到的都搞进来
import tkinter as tk#还是用自带的
from tkinter import ttk, filedialog
import matplotlib.pyplot as plt #没有就需要安装
from matplotlib.figure import Figure
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import numpy as np
然后初始化点,
class PlotApp:
def __init__(self, root):
self.root = root
self.root.title("设计一个简单随机生成图界面 v0.1")
self.setup_ui
self.current_figure = None
def setup_ui(self):
"""初始化界面组件"""
# 主框架布局
main_frame = ttk.Frame(self.root)
main_frame.pack(fill=tk.BOTH, expand=True)
# 左侧控制面板,控制主要操作
control_panel = ttk.Frame(main_frame, width=150)
control_panel.pack(side=tk.LEFT, fill=tk.Y)
# 右侧生成图标区域
plot_frame = ttk.Frame(main_frame)
plot_frame.pack(side=tk.RIGHT, fill=tk.BOTH, expand=True)
搞几个按钮吧
# 根据你的思路添加按钮
ttk.Button(control_panel, text="点我生成折线图", command=self.plot_line).pack(pady=5, fill=tk.X)
ttk.Button(control_panel, text="点我生成柱状图", command=self.plot_bar).pack(pady=5, fill=tk.X)
ttk.Button(control_panel, text="点我生成散点图", command=self.plot_scatter).pack(pady=5, fill=tk.X)
ttk.Button(control_panel, text="点我清除生成的图表", command=self.clear_plot).pack(pady=5, fill=tk.X)
ttk.Button(control_panel, text="点我保存图表", command=self.save_plot).pack(pady=5, fill=tk.X)
生成的图标,初始化下,下笔从哪开始总要告诉它
# 初始化绘图区域
self.figure = Figure(figsize=(6, 4), dpi=100)
self.canvas = FigureCanvasTkAgg(self.figure, master=plot_frame)
self.canvas.get_tk_widget.pack(fill=tk.BOTH, expand=True)
自动生成的,搞点数据来,你也可以通过输入数据,还是先搞点简单的。
def generate_sample_data(self):
"""自动的么,就搞点数据生成,不能就要设置一些输入框输入数据生成"""
x = np.linspace(0, 10, 50)
y = np.sin(x) + np.random.normal(0, 0.2, 50)
return x, y
现在我们通过上面的数据,开始生成
def plot_line(self):
"""通过生成的数据,绘制折线图"""
self._prepare_plot
ax = self.figure.add_subplot(111)
x, y = self.generate_sample_data
ax.plot(x, y, color='blue', marker='o', linestyle='--')
ax.set_title("折线图示例")
self.canvas.draw
def plot_bar(self):
"""通过生成的数据,绘制柱状图"""
self._prepare_plot
x = ['1', '2', '3', '4', '5']
y = np.random.randint(10, 50, 5)
ax.bar(x, y, color='green', alpha=0.7)
ax.set_title("柱状图示例")
self.canvas.draw
def plot_scatter(self):
"""通过生成的数据,绘制散点图"""
self._prepare_plot
ax.scatter(x, y, color='red', s=50, alpha=0.6)
ax.set_title("散点图示例")
self.canvas.draw
def _prepare_plot(self):
"""通过生成的数据,准备绘图区域"""
self.figure.clear
self.figure.subplots_adjust(left=0.1, right=0.9, top=0.9, bottom=0.1)
生成图片
还有清除、保存功能,不要忘记了
"""清除图表"""
def clear_plot(self):
self.figure.clear
self.canvas.draw
def save_plot(self):
"""保存图表"""
if not self.figure.axes:
tk.messagebox.showwarning("警告", "请先生成图表!")
return
file_path = filedialog.asksaveasfilename(
defaultextension=".png",
filetypes=[("PNG文件", "*.png"), ("PDF文件", "*.pdf"), ("所有文件", "*.*")]
if file_path:
self.figure.savefig(file_path)
tk.messagebox.showinfo("保存成功", f"图表已保存至:\n{file_path}")
保存PNG
if __name__ == "__main__":
root = tk.Tk
root.geometry("800x600")
app = PlotApp(root)
root.mainloop
附上代码截图
代码截图1
代码截图2
代码截图3
代码截图4
来源:Sug科技聚焦