Calling function from another module

Peter Otten __peter__ at web.de
Thu Dec 16 07:16:30 EST 2010


craf wrote:

> 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



More information about the Python-list mailing list