Обновление цвета встраиваемого сюжета matplotlib в tkinter - PullRequest
0 голосов
/ 18 октября 2019

Я попытался добавить некоторые опции для встроенного сюжета matplotlib в tkinter. Стиль графика (то есть сплошная линия или пунктирная линия) изменяется правильно, а цвет - нет. Однако, изменяя размеры окна tkinter, цвет обновлялся. Связанная часть моего кода показана ниже:

import tkinter as tk
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
from matplotlib.figure import Figure
from tkinter.colorchooser import askcolor
import numpy as np



class Ploter:
    DEFAULT_PEN_SIZE = 5.0
    DEFAULT_COLOR = 'black'
    DEFAULT_STYLE = '-'
    def __init__(self, master, size = (5,4), dpi = 100):
        self.master = master
        self.size = size
        self.dpi = dpi
        self.color = self.DEFAULT_COLOR
        self.style = self.DEFAULT_STYLE
        self.fig = Figure(figsize = self.size, dpi=self.dpi)
        self.canvas = FigureCanvasTkAgg(self.fig , master=self.master)
        self.ax = self.fig.add_subplot(111)
        self.t = np.arange(0, 3, 0.01)
        self.tf = 2 * np.sin(2 * np.pi * self.t)

    def PlotWidgets(self):

        toolbar = NavigationToolbar2TkAgg(self.canvas, self.master)
        toolbar.update()
        self.canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=1)



        list1 = ["Solid", "Dashed", "Dash-dot", 'Dotted'] 
        self.line_style = tk.StringVar()
        self.line_style.set('Line Style')
        self.line_style.trace("w", self.choose_style)
        droplist = tk.OptionMenu(self.master, self.line_style, *list1)
        droplist.config(width=10)
        droplist.pack(side = tk.LEFT , padx = 10 , pady = 10)

        color_button = tk.Button(master = self.master, text='color',
                                 command = self.choose_color)
        color_button.pack(side = tk.LEFT , padx = 10 , pady = 10)

        self.ploter()

    def ploter(self):
        self.ax.clear()
        style = self.style
        self.ax.plot(self.t, self.tf, style , color = self.color)
        self.canvas.draw()


    def choose_color(self):
        style = self.style
        self.color = askcolor(color=self.color)[1]
        self.ax.plot(self.t, self.tf, style , color = self.color)
        #self.canvas.draw()
    def choose_style(self, * args):
        if self.line_style.get() == "Solid":
            self.style = '-'
            self.ploter()
        if self.line_style.get() == "Dashed":
            self.style = '--'
            self.ploter()
        if self.line_style.get() == "Dash-dot":
            self.style = '-.'
            self.ploter()
        if self.line_style.get() == "Dotted":
            self.style = ':'
            self.ploter()




root = tk.Tk()
root.wm_title("Embedding in tkinter")
pp = Ploter(root)
pp.PlotWidgets()
root.mainloop()

Я попытался перезагрузить компьютер, использовать другую среду IDE или запустить скрипт из терминала, и ни один из них не помог исправить ситуацию.

ЭтоСтоит отметить, что я использую Linux Mint 19.2 (рабочий стол MATE, сервер отображения x11), Python 3.6.8, Matplotlib 2.1.1, Tkinter 8.6.

1 Ответ

1 голос
/ 18 октября 2019

Добавьте canvas.draw_idle() к вашим ploter и choose_color функциям:

def ploter(self):
    self.ax.clear()
    style = self.style
    self.ax.plot(self.t, self.tf, style , color = self.color)
    self.canvas.draw_idle()

def choose_color(self):
    style = self.style
    self.color = askcolor(color=self.color)[1]
    self.ax.plot(self.t, self.tf, style , color = self.color)
    self.canvas.draw_idle()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...