tkinter global variable

David Kolovratník david at kolovratnik.net
Fri Nov 13 12:40:53 EST 2020


On Fri, Nov 13, 2020 at 05:12:10PM +0000, ChalaoAdda wrote:
> On Fri, 13 Nov 2020 12:04:53 -0500, Richard Damon wrote:
> 
> > On 11/13/20 11:42 AM, ChalaoAdda wrote:
> >> On Fri, 13 Nov 2020 16:04:03 +0000, Stefan Ram wrote:
> >>
> >>> ChalaoAdda <chalao.adda at gmail.com> writes:
> >>>> On Fri, 13 Nov 2020 15:41:20 +0000, Stefan Ram wrote:
> >>>>> ChalaoAdda <chalao.adda at gmail.com> writes:
> >>>>>> I am trying to read a file from askopenfilename outside the
> >>>>>> function.
> >>>>>> I am getting blank file name. What am I doing wrong? Here is my
> >>>>>> code.
> >>>>> It is possible that you try to read from "pic" before "on_openfile"
> >>>>> ever was executed.
> >>>> I didn't get you. I click on the menu item "Open" and then from the
> >>>> filedialog select a file. And then outside that function I am trying
> >>>> to read and print the file.
> >>>   I have added two additional statements to your source code:
> >>>   print( "A" ) and print( "B" ).
> >>>
> >>>   If you now execute this new source code, you might observe that "B"
> >>>   is being printed before "A" is being printed.
> >>>
> >>> from tkinter import *
> >>> from tkinter import filedialog
> >>>
> >>> def on_openfile():
> >>>     print( "A" )
> >>>     global pic pic = filedialog.askopenfilename()
> >>>
> >>>
> >>> root = Tk()
> >>>
> >>> menubar = Menu(root)
> >>> root.config(menu=menubar)
> >>> file_menu = Menu(menubar) file_menu.add_command(label="Open",
> >>> command=on_openfile) file_menu.add_command(label="Exit",
> >>> command=root.destroy)
> >>> menubar.add_cascade(label="File", menu=file_menu)
> >>>
> >>>
> >>> print( "B" )
> >>> f = open(pic)
> >>> print(f.read())
> >>>
> >>> root.mainloop()
> >> Ok. I got the point. So what do I need to do access the variable? How
> >> do I return a value from that function?
> >>
> >> Thanks.
> > 
> > The problem is that you are accessing the variable BEFORE the box has
> > been put up and the user clicking on it. That doesn't happen until the
> > mainloop() call. You need to delay the opening and reading of the file
> > till the filedialog has been used and returned.
> > 
> > Perhaps on_openfile could open and read the file.
> 
> Ok. Then how do I access the content of the file from outside the 
> function? How can I access return value?
> Thanks.
What about

def on_printfilename():
    global pic
    try:
        print( f"C: {pic}" )
    except NameError:
        print( f"C! pic not set yet" )

together with

file_menu.add_command(label="Print filename", command=on_printfilename)

Or move your print("B") block behind the mainloop().

David



More information about the Python-list mailing list