<p>根据我之前的评论,重构版本:</p>
<pre><code>import urllib
import subprocess
import os
import Tkinter as tk
class ProgramInstaller(object):
def __init__(self, name, descr, do_install):
self.name = name
self.descr = descr
self.do_install = do_install # can be function or list of strings
def install(self):
if callable(self.do_install):
self.do_install()
else:
for s in self.do_install:
subprocess.call(s)
TEMP_DIR = r"c:\MGInstall"
def makeTempDir(dir=TEMP_DIR):
# need to expand on this - what if dir already exists, etc
os.mkdir(dir)
def removeTempDir(dir=TEMP_DIR):
# need to expand on this - del files in dir before rmdir, etc
os.rmdir(dir)
def installGoToMeeting():
makeTempDir()
url = "http://www.gotomeeting.com/download/something"
fname = os.path.join(TEMP_DIR, "gotomeeting.exe")
urllib.urlretrieve(url, fname)
subprocess.call(fname)
removeTempDir()
def installTortoiseSVN():
makeTempDir()
if is64bit(): url = "http://www.tortoisesvn.net/download/something/64bit"
else: url = "http://www.tortoisesvn.net/download/something/32bit"
fname = os.join(TEMP_DIR, "tortoisesvn.exe")
urllib.urlretrieve(url, fname)
subprocess.call(fname)
removeTempDir()
installers = (
ProgramInstaller("SnagIt", "Take screen-shots", [r"net use w: \\it01\files", r"w:\software\snagitup.exe"]),
ProgramInstaller("Camtasia", "Record your desktop", [r"net use w: \\it01\files", r"w:\software\camtasia.exe"]),
ProgramInstaller("GoToMeeting", "Web conferencing", installGoToMeeting),
ProgramInstaller("TortoiseSVN", "(Sub)Version control client", installTortoiseSVN),
ProgramInstaller("Printer", "HP4020 Printer drivers", [r"net use w: \\it01\files", r"w:\printers\installer\printer.exe"])
)
def doInstall(): # install-button callback
for inst in installers:
if inst.cbvar.get():
inst.install()
def main():
app = tk.Tk()
tk.Label(app, text="IT Automatic Installer").pack()
# need to fiddle with a grid layout to make this look right
for inst in installers:
inst.cbvar = tk.IntVar()
tk.Checkbutton(text=inst.name, variable=inst.cbvar).pack()
tk.Label(text=inst.descr).pack()
tk.Button(text="Install", command=doInstall()).pack()
app.mainloop()
if __name__=="__main__":
main()
</code></pre>