"""Main Pynche (Pythonically Natural Color and Hue Editor) widget.This window provides the basic decorations, primarily including the menubar.It is used to bring up other windows."""import sysimport osfrom tkinter import *from tkinter import messagebox, filedialogimport ColorDB# Milliseconds between interrupt checksKEEPALIVE_TIMER = 500class PyncheWidget:def __init__(self, version, switchboard, master=None, extrapath=[]):self.__sb = switchboardself.__version = versionself.__textwin = Noneself.__listwin = Noneself.__detailswin = Noneself.__helpwin = Noneself.__dialogstate = {}modal = self.__modal = not not master# If a master was given, we are running as a modal dialog servant to# some other application. We rearrange our UI in this case (there's# no File menu and we get `Okay' and `Cancel' buttons), and we do a# grab_set() to make ourselves modalif modal:self.__tkroot = tkroot = Toplevel(master, class_='Pynche')tkroot.grab_set()tkroot.withdraw()else:# Is there already a default root for Tk, say because we're# running under Guido's IDE? :-) Two conditions say no, either the# import fails or _default_root is None.tkroot = Nonetry:from Tkinter import _default_roottkroot = self.__tkroot = _default_rootexcept ImportError:passif not tkroot:tkroot = self.__tkroot = Tk(className='Pynche')# but this isn't our top level widget, so make it invisibletkroot.withdraw()# create the menubarmenubar = self.__menubar = Menu(tkroot)## File menu#filemenu = self.__filemenu = Menu(menubar, tearoff=0)filemenu.add_command(label='Load palette...',command=self.__load,underline=0)if not modal:filemenu.add_command(label='Quit',command=self.__quit,accelerator='Alt-Q',underline=0)## View menu#views = make_view_popups(self.__sb, self.__tkroot, extrapath)viewmenu = Menu(menubar, tearoff=0)for v in views:viewmenu.add_command(label=v.menutext(),command=v.popup,underline=v.underline())## Help menu#helpmenu = Menu(menubar, name='help', tearoff=0)helpmenu.add_command(label='About Pynche...',command=self.__popup_about,underline=0)helpmenu.add_command(label='Help...',command=self.__popup_usage,underline=0)## Tie them all together#menubar.add_cascade(label='File',menu=filemenu,underline=0)menubar.add_cascade(label='View',menu=viewmenu,underline=0)menubar.add_cascade(label='Help',menu=helpmenu,underline=0)# now create the top level windowroot = self.__root = Toplevel(tkroot, class_='Pynche', menu=menubar)root.protocol('WM_DELETE_WINDOW',modal and self.__bell or self.__quit)root.title('Pynche %s' % version)root.iconname('Pynche')# Only bind accelerators for the File->Quit menu item if running as a# standalone appif not modal:root.bind('<Alt-q>', self.__quit)root.bind('<Alt-Q>', self.__quit)else:# We're a modal dialog so we have a new row of buttonsbframe = Frame(root, borderwidth=1, relief=RAISED)bframe.grid(row=4, column=0, columnspan=2,sticky='EW',ipady=5)okay = Button(bframe,text='Okay',command=self.__okay)okay.pack(side=LEFT, expand=1)cancel = Button(bframe,text='Cancel',command=self.__cancel)cancel.pack(side=LEFT, expand=1)def __quit(self, event=None):self.__tkroot.quit()def __bell(self, event=None):self.__tkroot.bell()def __okay(self, event=None):self.__sb.withdraw_views()self.__tkroot.grab_release()self.__quit()def __cancel(self, event=None):self.__sb.canceled()self.__okay()def __keepalive(self):# Exercise the Python interpreter regularly so keyboard interrupts get# through.self.__tkroot.tk.createtimerhandler(KEEPALIVE_TIMER, self.__keepalive)def start(self):if not self.__modal:self.__keepalive()self.__tkroot.mainloop()def window(self):return self.__rootdef __popup_about(self, event=None):from Main import __version__messagebox.showinfo('About Pynche ' + __version__,'''\Pynche %sThe PYthonically NaturalColor and Hue EditorFor informationcontact: Barry A. Warsawemail: bwarsaw@python.org''' % __version__)def __popup_usage(self, event=None):if not self.__helpwin:self.__helpwin = Helpwin(self.__root, self.__quit)self.__helpwin.deiconify()def __load(self, event=None):while 1:idir, ifile = os.path.split(self.__sb.colordb().filename())file = filedialog.askopenfilename(filetypes=[('Text files', '*.txt'),('All files', '*'),],initialdir=idir,initialfile=ifile)if not file:# cancel buttonreturntry:colordb = ColorDB.get_colordb(file)except IOError:messagebox.showerror('Read error', '''\Could not open file for reading:%s''' % file)continueif colordb is None:messagebox.showerror('Unrecognized color file type', '''\Unrecognized color file type in file:%s''' % file)continuebreakself.__sb.set_colordb(colordb)def withdraw(self):self.__root.withdraw()def deiconify(self):self.__root.deiconify()class Helpwin:def __init__(self, master, quitfunc):from Main import docstringself.__root = root = Toplevel(master, class_='Pynche')root.protocol('WM_DELETE_WINDOW', self.__withdraw)root.title('Pynche Help Window')root.iconname('Pynche Help Window')root.bind('<Alt-q>', quitfunc)root.bind('<Alt-Q>', quitfunc)root.bind('<Alt-w>', self.__withdraw)root.bind('<Alt-W>', self.__withdraw)# more elaborate help is available in the README filereadmefile = os.path.join(sys.path[0], 'README')try:fp = Nonetry:fp = open(readmefile)contents = fp.read()# wax the last page, it contains Emacs crufti = contents.rfind('\f')if i > 0:contents = contents[:i].rstrip()finally:if fp:fp.close()except IOError:sys.stderr.write("Couldn't open Pynche's README, "'using docstring instead.\n')contents = docstring()self.__text = text = Text(root, relief=SUNKEN,width=80, height=24)self.__text.focus_set()text.insert(0.0, contents)scrollbar = Scrollbar(root)scrollbar.pack(fill=Y, side=RIGHT)text.pack(fill=BOTH, expand=YES)text.configure(yscrollcommand=(scrollbar, 'set'))scrollbar.configure(command=(text, 'yview'))def __withdraw(self, event=None):self.__root.withdraw()def deiconify(self):self.__root.deiconify()import functools@functools.total_orderingclass PopupViewer:def __init__(self, module, name, switchboard, root):self.__m = moduleself.__name = nameself.__sb = switchboardself.__root = rootself.__menutext = module.ADDTOVIEW# find the underline characterunderline = module.ADDTOVIEW.find('%')if underline == -1:underline = 0else:self.__menutext = module.ADDTOVIEW.replace('%', '', 1)self.__underline = underlineself.__window = Nonedef menutext(self):return self.__menutextdef underline(self):return self.__underlinedef popup(self, event=None):if not self.__window:# class and module must have the same nameclass_ = getattr(self.__m, self.__name)self.__window = class_(self.__sb, self.__root)self.__sb.add_view(self.__window)self.__window.deiconify()def __eq__(self, other):return self.__menutext == other.__menutextdef __lt__(self, other):return self.__menutext < other.__menutextdef make_view_popups(switchboard, root, extrapath):viewers = []# where we are in the file systemdirs = [os.path.dirname(__file__)] + extrapathfor dir in dirs:if dir == '':dir = '.'for file in os.listdir(dir):if file[-9:] == 'Viewer.py':name = file[:-3]try:module = __import__(name)except ImportError:# Pynche is running from inside a package, so get the# module using the explicit path.pkg = __import__('pynche.'+name)module = getattr(pkg, name)if hasattr(module, 'ADDTOVIEW') and module.ADDTOVIEW:# this is an external viewerv = PopupViewer(module, name, switchboard, root)viewers.append(v)# sort alphabeticallyviewers.sort()return viewers
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。