So the question title pretty much sums it up. I apologise in advance if I have too much information as I don’t know exactly where the problem arises but the issue is in the transition between class StartPage
and class PageOne.
I basically want to get the text from first_button
(I will add more of these later) and grab data from a file which has a name matching to the button text. This data will then be added in the for-loop in PageOne
. However, it seems like PageOne
is at its initial state despite the function transition()
from tempSimulator import lasdata
import tkinter as tk
class SalladBar:
def __init__(self,master):
self.master=master
master.geometry("1300x700")
container = tk.Frame(self.master)
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 (startPage, PageOne):
frame = F(container, self)
self.frames[F] = frame
frame.grid(row=0, column=0, sticky="nsew")
self.show_frame(startPage)
def update_frame(self, page):
frame = self.frames[page]
frame.update()
def show_frame(self, page):
frame = self.frames[page]
frame.tkraise()
class variables:
data1=[]
data2=[]
class startPage(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
f1 = tk.Frame(self, width="1300", height="200", bd=6, relief="raise")
f1.pack()
label = tk.Label(f1, text="xxxx")
label.pack(pady=10, padx=10)
#Add more buttons
first_button= tk.Button(f1, text="Source",
command=lambda: self.transition(controller,first_button.cget("text")))
first_button.pack()
def transition(self,controller,source):
data1,data2=lasdata(source)
variables.data1=data1
variables.data2=data2
controller.update_frame(PageOne) #I thought this would do the trick
controller.show_frame(PageOne)
class PageOne(tk.Frame):
print("PageOne initialised")
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
f1=tk.Frame(self, width="1300", height="200", bd=6, relief="raise")
f1.pack()
label = tk.Label(f1, text="Title2")
label.pack(pady=10, padx=10)
for d in variables.data1:
sld_label= tk.Label(f1, text= d.givename() + "n" + d.givedet())
sld_label.pack()
button1 = tk.Button(self, text="Back to Home",
command=lambda: controller.show_frame(startPage))
button1.pack()
root = tk.Tk()
app = SalladBar(root)
root.mainloop()
Advertisement
Answer
You need to move the data adding code to a separate method if you want to call it later. Things that are in the __init__
method are executed when the instance is created, and never again.
class PageOne(tk.Frame):
print("PageOne initialised")
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.f1=tk.Frame(self, width="1300", height="200", bd=6, relief="raise")
self.f1.pack()
label = tk.Label(self.f1, text="Title2")
label.pack(pady=10, padx=10)
button1 = tk.Button(self, text="Back to Home",
command=lambda: controller.show_frame(startPage))
button1.pack()
def add_data(self):
for d in variables.data1:
sld_label= tk.Label(self.f1, text= d.givename() + "n" + d.givedet())
sld_label.pack()
Once you have done that you can call that method from another class like this:
def transition(self,controller,source):
data1,data2=lasdata(source)
variables.data1=data1
variables.data2=data2
controller.frames[PageOne].add_data() # update the other page
controller.show_frame(PageOne)