解决 Tkinter 中 'Canvas' 对象没有 'draw' 属性的错误
这个错误是因为在Canvas上调用了不存在的方法draw()。正确的方法是使用FigureCanvasTkAgg对象的draw()方法来绘制图像。在update_plot()函数中,将canvas.draw()改为fig_canvas.draw()即可。
import tkinter as tk
from tkinter import ttk
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
# 加载数据集
data = pd.read_csv('性别分类数据集0.csv')
# 创建主窗口
root = tk.Tk()
root.title('数据可视化')
root.geometry('800x600')
# 创建下拉列表选择性别
gender_label = ttk.Label(root, text='请选择性别')
gender_label.pack(pady=10)
gender_var = tk.StringVar(value='1')
gender_combobox = ttk.Combobox(root, textvariable=gender_var, values=['男', '女'])
gender_combobox.pack()
# 创建下拉列表选择特征
feature_label = ttk.Label(root, text='请选择图的特征')
feature_label.pack(pady=10)
feature_var = tk.StringVar(value='forehead_width_cm')
feature_combobox = ttk.Combobox(root, textvariable=feature_var, values=['forehead_width_cm', 'forehead_height_cm', 'long_hair', 'nose_wide', 'nose_long', 'lips_thin', 'distance_nose_to_lip_long'])
feature_combobox.pack()
# 创建画布
canvas = tk.Canvas(root, width=600, height=400)
canvas.pack(pady=20)
# 定义更新图的函数
def update_plot():
# 获取选择的性别和特征
gender = int(gender_var.get() == '男')
feature = feature_var.get()
# 根据选择的特征绘制不同的图形
if feature in ['forehead_width_cm', 'forehead_height_cm']:
# 绘制散点图
df = data[data['gender'] == gender][feature]
# 计算分组间隔
bin_width = (df.max() - df.min()) / 10
# 绘制直方图
fig, ax = plt.subplots()
ax.hist(df, bins=np.arange(df.min(), df.max()+bin_width, bin_width), align='mid', histtype='bar', rwidth=0.8)
ax.set_xlabel(feature)
ax.set_ylabel('count')
plt.show()
else:
# 绘制柱状图
fig, ax = plt.subplots()
ax.bar([0, 1], [data[(data['gender'] == gender) & (data[feature] == 0)].shape[0], data[(data['gender'] == gender) & (data[feature] == 1)].shape[0]])
ax.set_xticks([0, 1])
ax.set_xticklabels(['0', '1'])
ax.set_xlabel(feature)
ax.set_ylabel('count')
ax.set_title(f'{feature} ({gender})')
# 清空画布并绘制新图
canvas.delete('all')
canvas.create_rectangle(0, 0, canvas.winfo_width(), canvas.winfo_height(), fill='white')
#canvas.draw() # 错误的调用方式
# 将图像转换为画布上的图片
fig_canvas = FigureCanvasTkAgg(fig, master=canvas)
fig_canvas.draw() # 正确的调用方式
fig_canvas.get_tk_widget().pack(side='top', fill='both', expand=1)
# 保存图像
plt.savefig('temp.png')
# 创建按钮,并绑定更新图的函数
update_button = ttk.Button(root, text='更新图', command=update_plot)
update_button.pack(pady=10)
# 运行主循环
root.mainloop()
原文地址: http://www.cveoy.top/t/topic/fYgz 著作权归作者所有。请勿转载和采集!