Calling function from another module

C

craf

Hi.

The query code is as follows:

------------------------------------------------------
import Tkinter
import tkMessageBox


class App:
def __init__(self, master):
master.protocol("WM_DELETE_WINDOW",quit)


def quit():
if tkMessageBox.askyesno('','Exit'):
master.quit()


master =Tkinter.Tk()
app = App(master)
master.mainloop()
-------------------------------------------------------

As you can see, when I run and close the main window displays
a text box asking if you want to quit, if so, closes
application.

Question:

Is it possible to define the quit() function in another separate
module?.
I tried it, but it throws the error that the global name
'master' is not defined.

Thanks in advance.

Regards

Cristian Abarzúa
 
R

rantingrick

Hi.

The query code is as follows:

------------------------------------------------------
import Tkinter
import tkMessageBox

class App:
    def __init__(self, master):
        master.protocol("WM_DELETE_WINDOW",quit)

def quit():
    if tkMessageBox.askyesno('','Exit'):
        master.quit()

master =Tkinter.Tk()
app = App(master)
master.mainloop()
-------------------------------------------------------

As you can see, when I run and close the main window displays
a text box asking if you want to quit, if so, closes
application.

Question:

Is it possible to define the quit() function in another separate
module?.
I tried it, but it throws the error that the global name
'master' is not defined.

Please explain in detail what the "other module" is doing. And as
written this class "app" looks pretty useless to me. Why subclass Tk
(well it appears you "tried" to subclass it anyway) just to override
capabilities that are already available within Tk?

Also i see many mistakes in this very small code sample. Using my
deductive logic leads me to believe that many mistakes in a small code
sample translates to enormous mistakes in a larger code base. So feel
free to ramble incessantly about the intricate workings of this jewel
of Python scripting you are soon to drop on this malnourished group of
coders.
 
P

Peter Otten

craf said:
Hi.

The query code is as follows:

------------------------------------------------------
import Tkinter
import tkMessageBox


class App:
def __init__(self, master):
master.protocol("WM_DELETE_WINDOW",quit)


def quit():
if tkMessageBox.askyesno('','Exit'):
master.quit()


master =Tkinter.Tk()
app = App(master)
master.mainloop()
-------------------------------------------------------

As you can see, when I run and close the main window displays
a text box asking if you want to quit, if so, closes
application.

Question:

Is it possible to define the quit() function in another separate
module?.
I tried it, but it throws the error that the global name
'master' is not defined.

You can have the modules import each other and then access the master as
<module>.master where you'd have to replace <module> with the actual name of
the module, but that's a bad design because

(1) you create an import circle
(2) functions relying on global variables already are a bad idea

Your other option is to pass 'master' explicitly and then wrap it into a
lambda function (or functools.partial):

$ cat tkquitlib.py
import tkMessageBox

def quit(master):
if tkMessageBox.askyesno('','Exit'):
master.quit()


$ cat tkquit_main.py
import Tkinter

import tkquitlib

class App:
def __init__(self, master):
master.protocol("WM_DELETE_WINDOW", lambda: tkquitlib.quit(master))

master = Tkinter.Tk()
app = App(master)
master.mainloop()

Peter
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,995
Messages
2,570,230
Members
46,819
Latest member
masterdaster

Latest Threads

Top