Jun-29-2020, 01:26 PM
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:
Am I doing something wrong (well obviously, but what
)?
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):
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

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()