# Twisted, the Framework of Your Internet # Copyright (C) 2001 Matthew W. Lefkowitz # # This library is free software; you can redistribute it and/or # modify it under the terms of version 2.1 of the GNU Lesser General Public # License as published by the Free Software Foundation. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # """Implementation module for the graphical version of the `twistd` command. """ # System imports import os import Tkinter, tkFileDialog, tkMessageBox, tkCommonDialog # Sibling imports import twistd, tkmktap, tapconvert # Twisted imports from twisted.internet import tksupport, reactor FILE_TYPES = ( ('Twisted Application Pickle', '*.tap'), ('Twisted Application Source', '*.tas'), ('Twisted Application XML', '*.tax'), ('Encrypted Application Pickle', '*.etap'), ('Encrypted Application Source', '*.etas'), ('Encrypted Application XML', '*.etax'), ('All Files', '*') ) class TkTwistdMenu(Tkinter.Menu): def __init__(self, master, launch): Tkinter.Menu.__init__(self, master) cmdMenu = Tkinter.Menu(self) self.add_cascade(label="Actions", menu=cmdMenu) cmdMenu.add_command(label="Launch", command=launch) cmdMenu.add_separator() cmdMenu.add_command(label="Quit", command=reactor.crash) class TkTwistdFrame(Tkinter.Frame): def __init__(self, master, filename = ''): Tkinter.Frame.__init__(self, master) self.options = twistd.ServerOptions() type = tapconvert.guessType(filename) # XXXXXXXXXXXXX if type == 'pickle': # XXXXXXXXXXXXX type = 'file' # XXXXXXXXXXXXX Gah! # XXXXXXXXXXXXX self.options[type] = filename self.config = tkmktap.TkConfigFrame(self, self.options) self.config.pack() def launch(self): self.config.updateConfig(self.options) twistd.runApp(self.options) tkMessageBox.showinfo(title="Twisted Daemon", message="Daemon Started") self.withdraw() def destroy(self): reactor.crash() def pickOptions(master, filename): config = TkTwistdFrame(master, filename) menu = TkTwistdMenu(master, config.launch) master['menu'] = menu config.pack() # Define function so it works, if somewhat uncleanly for # Python2.1 users too def askdirectory(*args, **kw): d = tkCommonDialog.Dialog(*args, **kw) d.command = 'tk_chooseDirectory' return d.show() askdirectory = getattr(tkFileDialog, 'askdirectory', askdirectory) def run(): r = Tkinter.Tk() r.withdraw() tksupport.install(r) filename = tkFileDialog.askopenfilename( parent=r, title="Select Twisted APplication File", filetypes=FILE_TYPES ) working = askdirectory( parent=r, title="Select Working Directory" ) os.chdir(working) pickOptions(r, filename) from twisted.copyright import version r.title('Twisted Daemon Launcher ' + version) r.deiconify() reactor.run() if __name__ == '__main__': run()