Почему моя круговая диаграмма в Tkinter не отображается?
Я создаю приложение, которое принимает входные данные, сохраняет их в файл CSV, и теперь последняя основная часть состоит в отображении круговой диаграммы содержимого столбца. Предполагается, что ввод будет о книгах. Таким образом, круговая диаграмма должна, например, отображать жанр всех книг в списке.
У меня нет проблем с созданием круговой диаграммы, я справился с этим в отдельном скрипте, я тоже не получаю сообщение об ошибке, а вместо этого имею только белое поле.
import csv
import os
import tkinter as tk
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
from tkinter import ttk
from tkinter import filedialog
from collections import Counter
class FrontFrames:
def __init__(self, master):
super().__init__()
#Split the screen horizontally in two parts
top_frame = tk.Frame(master, bg="green")
bottom_frame = tk.Frame(master, bg="yellow")
top_frame.pack(side="top", fill="both", expand=True)
bottom_frame.pack(side="top", fill="both", expand=True)
#Creating the three top widgets
self.tree = Label(top_frame)
column = ("Title", "author", "year", "others")
self.treeview = ttk.Treeview(top_frame, columns=column, show='headings')
self.treeview.heading("Title", text="Title")
self.treeview.heading("author", text="Author")
self.treeview.heading("year", text="Year")
self.treeview.heading("others", text="Others")
content = "./Note.csv"
with open(content, 'r') as file:
csv_reader = csv.DictReader(file, skipinitialspace=True)
for row in csv_reader:
self.treeview.insert('', '0', values=(f'{row["title"]}',
f'{row["author"]}',
f'{row["year"]}',
f'{row["others"]}'))
c = Counter(row["others"])
header = list(c.keys())
values = list(c.values())
colors = ['r', 'g', 'b', 'c', 'y']
f = plt.Figure(figsize=(4,4))
#a = f.add_subplot(111)
pie = plt.pie(values, labels=header, colors=colors, startangle=90, autopct='%.1f%%')
self.canvas = FigureCanvasTkAgg(f, top_frame)
self.tree.pack(side="left", fill="both", expand=True)
self.treeview.pack(side="left", fill="both", expand=True)
self.canvas.get_tk_widget().pack(side="right", fill="both")
#self.canvas.show()
Я закомментировал строку "self.canvas.show()", потому что в противном случае я получаю сообщение об ошибке "AttributeError:" объект FigureCanvasTkAgg "не имеет атрибута" show "". Всегда говорят, что команда должна быть включена для фактического отображения круговой диаграммы, но в отдельном тесте, где никакой другой виджет не создается, круговая диаграмма видна. Я предполагаю, что круговая диаграмма просто скрыта под другим виджетом.
Содержание CSV будет выглядеть следующим образом:
title, author, year, others, note
Everything,Nobody,2222,Fiction,This is just something of everything!
Nothing,Everybody,1111,Romance,This is nothing of anything!
Pokemon,Pikachu,1999,Fiction,Once upon time.
Lord of the rings, R.R. Jackson, 1972, Fantasy, A long story!
Harry Potter, Rowling, 1995, Fantasy, A detailed story.
Bible, Apostels, 0, Fiction, A story.
The Ring, Frank, 1980, Horror, A scary story.
1984, Orwell, 1932, Dystopia, A scary future for the past and scary present
for us.
Pirates of the Caribbean, Brandow, 1955, Fiction, A pirate story.
Я использую Python 3.7.0
Как всегда, большое спасибо за ваши полезные ответы.
1 ответ
Что касается self.canvas.show
мой интерпретатор Python говорит мне, что FigureCanvasTkAgg.show
устарела и что я должен использовать draw
вместо.
Что касается проблемы с графиком, мне удалось заставить круговую диаграмму появиться, раскомментировав a = f.add_subplot(111)
и заменив
plt.pie(values, labels=header, colors=colors, startangle=90, autopct='%.1f%%')
от
a.pie(values, labels=header, colors=colors, startangle=90, autopct='%.1f%%')
Поэтому я предполагаю, что ваш график отображался не на том рисунке, поскольку вы не указали оси явно.