Home > OS >  Collecting variables from a GUI
Collecting variables from a GUI

Time:01-05

I have a simple GUI where the user selects a file, which becomes a variable for my main code. Here, my variable output should be the database path (gui_db_path) which the user inputs. When I run this code, called gui_test.py, the variable is printable, and prints to the console.

class GUI:

    def __init__(self, window): 
        # 'StringVar()' is used to get the instance of input field
        self.input_db_text = StringVar()

  window.title("HyPep 1.0")
        window.geometry("700x700")

        ttk.Label(window, text='Database sequences .csv:').grid(row=1,column=0)
        ttk.Button(window, text = "Browse", command = lambda: self.set_path_database_field()).grid(row = 1,column=2, ipadx=5, ipady=0) 
        ttk.Entry(window, textvariable = self.input_db_text, width = 70).grid( row = 1, column = 1, ipadx=1, ipady=1) 

        ttk.Button(window, text = "Analyze").grid(row = 10,column=1, ipadx=5, ipady=15) 

    def set_path_database_field(self):
        self.path_db = askopenfilename() 
        self.input_db_text.set(self.path_db)

    def get_database_path(self): 
        """ Function provides the database full file path."""
        return self.path_db

if __name__ == '__main__':
    window = tkinter.Tk()
    gui = GUI(window)
    window.mainloop()

    print(gui.path_db, '\n', gui.path_qu)
    
    gui_db_path = gui.path_db
    print(gui_db_path)

My issue is that I need to retrieve this variable for use in another file, user_input.py, but is no longer callable. My code for user_input.py is:

from gui_test import gui_db_path

print(gui_db_path)

Instead of printing to the console in this instance, I get:

ImportError: cannot import name 'gui_db_path' from 'gui_test'

I'm sure there is a simple solution that I am missing, can anyone shed some light?

... Update: much closer, need to expand the solution:

How would I go about expanding this to retrieve multiple paths? I have been trying this:

gui_test.py:

...
def get_db_path():
    window = tkinter.Tk()
    gui = GUI(window)
    window.mainloop()

    return gui.get_database_path()

def get_qu_path():
    window = tkinter.Tk()
    gui = GUI(window)
    window.mainloop()

    return gui.get_query_path()

user_input.py:

from gui_test import get_db_path
from gui_test import get_qu_path

gui_db_path = get_db_path()
gui_qu_path = get_qu_path()

CodePudding user response:

Note that the code inside if __name__ == '__main__' block will not be executed when the file is imported. You need to put those code inside a function instead and returns the path at the end of the function:

gui_test.py
...
def get_db_path():
    window = tkinter.Tk()
    gui = GUI(window)
    window.mainloop()

    return gui.get_database_path()

Then import this function inside user_input.py:

from gui_test import get_db_path

gui_db_path = get_db_path()
print(gui_db_path)
  •  Tags:  
  • Related