Home > Mobile >  tkinter Treeview: pass variable from window in different module
tkinter Treeview: pass variable from window in different module

Time:10-06

I have problem with returning a variable from custom pop-up, when the pop-up is in different .py file. As already answered on Stack Overflow, this can be solved with global variables. However this solution works only if all functions are in a single .py. Code representing the issue is following:

main.py:

from tkinter import *
import main_popups as main_popups

def main_screen():
    global screen
    screen = Tk()   
    main_btn= Button(screen, text = "Press me")
    main_btn.pack()  
    main_btn.configure(command = pressed)

    screen.mainloop()

def pressed():
    main_popups.input_box(screen)
    print(output_variable)

main_screen()

main_popups.py:

def input_box(screen):
    global input_box_screen
    
    def btn_press():
        global output_variable
        output_variable = entry.get()
        input_box_screen.destroy()
        input_box_screen.update()
        print(output_variable)
        
    input_box_screen = Toplevel(screen)
    
    entry = Entry(input_box_screen)
    entry.pack()   
    btn = Button (input_box_screen, text = "Confirm")
    btn.pack()
    btn.configure(command = btn_press)     
    
    screen.wait_window(input_box_screen)

This raises error at print(output_variable), as output_variable is not returned from btn_press in main_popups.py. My question is how to return the text from Entry in main_popups.py to main.py? I tried to return(output_variable) at the end of def btn_press():, but that does not return anything.

CodePudding user response:

For your case, you don't need global variable, just return output_variable at the end of main_popups.input_box():

main.py

from tkinter import *
import main_popups

def main_screen():
    global screen
    screen = Tk()
    main_btn= Button(screen, text = "Press me")
    main_btn.pack()
    main_btn.configure(command = pressed)

    screen.mainloop()

def pressed():
    output_variable = main_popups.input_box(screen)
    print(output_variable)

main_screen()

main_popups.py

from tkinter import *

def input_box(screen):
    output_variable = None

    def btn_press():
        nonlocal output_variable
        output_variable = entry.get()
        input_box_screen.destroy()
        input_box_screen.update()

    input_box_screen = Toplevel(screen)

    entry = Entry(input_box_screen)
    entry.pack()
    btn = Button (input_box_screen, text = "Confirm")
    btn.pack()
    btn.configure(command = btn_press)

    screen.wait_window(input_box_screen)

    return output_variable

CodePudding user response:

You can just import output_variable with from main_popups import output_variable after you executed main_popups.py (between line 14 and 15)

PS.: Maybe you shouldnt have used the tag tkinter, because its a very specific tag and you would have gotten a faster replie.

  • Related