Python Forum

Full Version: updating tkinter chart from within function
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Hello,

I got a tkinter application with a "chart page".
My user has to click a button to point me to the location of an SPSS file, after which a calculation is triggered.
This calculation returns x- and y-values for a scatter plot, that I want to display to my users.

Now, my best bet was to create an initial blank scatter plot with blank x- and y-values, and then update these values from within my function.
So I first do this:
self.x_values = []
self.y_values = []
And then I do this from within my function:
self.x_values = contacts_main.iloc[:, 1]
self.y_values = contacts_main.iloc[:, 2]
The calculatun runs, but my scatter plot never updates.
Am I doing something wrong (well obviously, but what Smile )?
Is creating a blank scatter plot and then updating the values bad practice?
Any help is vastly appreciated!

Regards,
Mikis

The full code (or at least the part with the relevant page):
class MainProgram(tk.Tk):
    def __init__(self, *args, **kwargs):   
        tk.Tk.__init__(self, *args, **kwargs)
        container = tk.Frame(self)
        container.pack(side="top", fill = "both", expand = True)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)
        
        self.frames = {}
        
        for F in (PageOne, PageTwo, PageThree):
            frame = F(container, self)    
            self.frames[F] = frame
            frame.grid(row=0, column= 0, sticky="nsew")
        
        self.show_frame(PageOne)
        
    def show_frame(self, cont):
        frame_to_activate = self.frames[cont]
        frame_to_activate.tkraise()
        
    def get_page(self, page_class):
        return self.frames[page_class]
    
class PageThree(tk.Frame):
    
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller
        self.x_values = []
        self.y_values = []
        label = tk.Label(self, text= "Chart page")
        label.pack(pady=10, padx=10)
        button1 = ttk.Button(self, text = "Back to first page",
                            command = lambda: controller.show_frame(PageOne))
        
        launch_calculation = tk.Button(self, text = "generate scatter"
                                        , command = self.contact_cluster)
        f = Figure(figsize=(5,5), dpi=100)
        a = f.add_subplot(111) # meaning there is only one chart
        a.scatter(self.x_values, self.y_values)
        a.set_title ("sales rep contacts vs all promo channel contacts", fontsize=16)
        a.set_ylabel("all promo channel contacts", fontsize=14)
        a.set_xlabel("avg sales rep contacts", fontsize=14)
        canvas = FigureCanvasTkAgg(f, self)
        canvas.draw()
        canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=True)
        toolbar = NavigationToolbar2Tk(canvas, self)
        toolbar.update()
        canvas._tkcanvas.pack(side=tk.TOP, fill=tk.BOTH, expand=True)
        
        button1.pack()
        launch_calculation.pack()
        
    def contact_cluster(self):
        page1 = self.controller.get_page(PageOne) #To get the file location entered on page 1
        df, meta = pyreadstat.read_sav(page1.spss_file_location.get(), encoding='latin1')
        # Run the calculation
        contacts = country_cluster_calc(df)
        # Attempt to update the chart
        self.x_values = contacts .iloc[:, 1]
        self.y_values = contacts .iloc[:, 2]
        
app = MainProgram()
app.geometry("700x650")
app.mainloop()
How many dots do you expect to see on the scatter plot when this program is run? 2 or 102?
import matplotlib.pyplot as plt
from random import randint

x = [5, 10]
y = [5, 10]
plt.scatter(x, y)
for i in range(100):
    x.append(randint(0,100))
    y.append(randint(0,100))
plt.show()