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