1

I am writing a program that will eventually ask the user to input a filename and graph the data file. However, I'm having difficulty transferring the user input file name into the next page.

I have implemented both answers shown on this page (How to access variables from different classes in tkinter?) but unfortunately can't get this to work. I'm thinking that maybe PageOne is being rewritten or that entry_field_variable is getting rewritten or not saved. I'm new to tkinter so I may be making an obvious oversight but any help is appreciated.

import tkinter as tk


LARGE_FONT= ("Verdana", 12)
NORM_FONT= ("Verdana", 10)
SMALL_FONT= ("Verdana", 8)


class mGui(tk.Tk):  


    def __init__(self, *args, **kargs): 

       tk.Tk.__init__(self, *args, **kargs) 
       container = tk.Frame(self)
       container.grid_rowconfigure(0, weight=1)
       container.grid_columnconfigure(0, weight=1)
       container.grid()



       self.shared_data = {"entry_field_variable":tk.StringVar()}

       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 show_frame(self, cont):  
        frame = self.frames[cont]
        frame.tkraise()   


class StartPage(tk.Frame):  

    def __init__(self, parent, controller):  
        self.controller = controller
        tk.Frame.__init__(self, parent) 
        label_1 = tk.Label(self, text = "Start Page", font = LARGE_FONT)
        label_1.grid(row = 0, column = 0)


        entry1 = tk.Entry(self, textvariable = self.controller.shared_data["entry_field_variable"])
        entry1.grid(row = 1, column = 0)




        button1 = tk.Button(self,text = "Go", command = lambda: controller.show_frame(PageOne))
        button1.grid(row = 2, column = 0) 



class PageOne(tk.Frame):  

    def __init__(self, parent, controller): 
        self.controller = controller
        tk.Frame.__init__(self, parent) 

        label_1 = tk.Label(self, text = "Page One", font = LARGE_FONT)
        label_1.grid(row = 1, column = 4)  

        filename = self.controller.shared_data["entry_field_variable"].get()


        label_2 = tk.Label(self, text = filename, font = LARGE_FONT)
        label_2.grid(row = 2, column = 0)

        button1 = tk.Button(self, text = "Go Back", command = lambda: controller.show_frame(StartPage))
        button1.grid(row = 4, column = 1)              


app = mGui()
app.mainloop()
Micah Woodard
  • 15
  • 1
  • 6

1 Answers1

0

Your idea of using a tk.StringVar is good, but you are missing a few things:

  • you need to collect the value entered in the entry field of StartPage.
  • this value needs to be passed to the controller.
  • finally, PageOne must have access to it, therefore it is necessary to assign the tk.StringVar holding the filename to the label textvariable.

Here is how it can be done:

import tkinter as tk


LARGE_FONT= ("Verdana", 12)
NORM_FONT= ("Verdana", 10)
SMALL_FONT= ("Verdana", 8)


class mGui(tk.Tk):  

    def __init__(self, *args, **kwargs): 
        tk.Tk.__init__(self, *args, **kwargs) 
        container = tk.Frame(self)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)
        container.grid()

        self.shared_data = {"filename": tk.StringVar('')}

        self.frames = {}  
        for PageFrame in (StartPage, PageOne):
            frame = PageFrame(container, self)
            self.frames[PageFrame] = frame
            frame.grid(row=0, column=0, sticky="nsew")
        self.show_frame(StartPage)   

    def show_frame(self, cont):  
        frame = self.frames[cont]
        frame.tkraise()   


class StartPage(tk.Frame):  

    def __init__(self, parent, controller):  
        self.controller = controller
        tk.Frame.__init__(self, parent) 
        label_1 = tk.Label(self, text="Start Page", font=LARGE_FONT)
        label_1.grid(row=0, column=0)

        entry1 = tk.Entry(self, textvariable=self.controller.shared_data["filename"])
        entry1.grid(row=1, column=0)

        button1 = tk.Button(self, text="Go", command=lambda: self.controller.show_frame(PageOne))
        button1.grid(row=2, column = 0)


class PageOne(tk.Frame):  

    def __init__(self, parent, controller): 
        self.controller = controller
        tk.Frame.__init__(self, parent) 

        label_1 = tk.Label(self, text="Page One", font=LARGE_FONT)
        label_1.grid(row = 1, column = 4)  

        filename = self.controller.shared_data["filename"]

        label_2 = tk.Label(self, textvariable=filename, font=LARGE_FONT)
        label_2.grid(row = 2, column = 0)

        button1 = tk.Button(self, text="Go Back", command=lambda: self.controller.show_frame(StartPage))
        button1.grid(row=4, column=1)              


app = mGui()
app.mainloop()
Reblochon Masque
  • 35,405
  • 10
  • 55
  • 80