Kaydet (Commit) e7a161e6 authored tarafından Kurt B. Kaiser's avatar Kurt B. Kaiser

M configDialog.py

M configHelpSourceEdit.py

1. Attach configHelpSourceEdit error dialogs to parent to avoid Tk root
   pop-ups.
2. Make configHelpSourceEdit OK button the default and bind <Return>.
3. Reformat configHelpSourceEdit.
4. ConfigDialog.SaveAllChangedConfig() had a bug which caused additional
   help sources to be deleted when other config items were changed.
4. Uniform capitalization in configDialog.
5. Update configDialog doc string.
üst 9149aeb8
""" """IDLE Configuration Dialog: support user customization of IDLE by GUI
configuration dialog
Customize font faces, sizes, and colorization attributes. Set indentation
defaults. Customize keybindings. Colorization and keybindings can be
saved as user defined sets. Select startup options including shell/editor
and default window size. Define additional help sources.
Note that tab width in IDLE is currently fixed at eight due to Tk issues.
Refer to comment in EditorWindow autoindent code for details.
""" """
from Tkinter import * from Tkinter import *
import tkMessageBox, tkColorChooser, tkFont import tkMessageBox, tkColorChooser, tkFont
...@@ -11,6 +19,7 @@ from tabpage import TabPageSet ...@@ -11,6 +19,7 @@ from tabpage import TabPageSet
from keybindingDialog import GetKeysDialog from keybindingDialog import GetKeysDialog
from configSectionNameDialog import GetCfgSectionNameDialog from configSectionNameDialog import GetCfgSectionNameDialog
from configHelpSourceEdit import GetHelpSourceDialog from configHelpSourceEdit import GetHelpSourceDialog
class ConfigDialog(Toplevel): class ConfigDialog(Toplevel):
""" """
configuration dialog for idle configuration dialog for idle
...@@ -336,11 +345,11 @@ class ConfigDialog(Toplevel): ...@@ -336,11 +345,11 @@ class ConfigDialog(Toplevel):
frameHelp=Frame(frame,borderwidth=2,relief=GROOVE) frameHelp=Frame(frame,borderwidth=2,relief=GROOVE)
#frameRun #frameRun
labelRunTitle=Label(frameRun,text='Startup Preferences') labelRunTitle=Label(frameRun,text='Startup Preferences')
labelRunChoiceTitle=Label(frameRun,text='On startup : ') labelRunChoiceTitle=Label(frameRun,text='On Startup : ')
radioStartupEdit=Radiobutton(frameRun,variable=self.startupEdit, radioStartupEdit=Radiobutton(frameRun,variable=self.startupEdit,
value=1,command=self.SetKeysType,text="open Edit Window") value=1,command=self.SetKeysType,text="Open Edit Window")
radioStartupShell=Radiobutton(frameRun,variable=self.startupEdit, radioStartupShell=Radiobutton(frameRun,variable=self.startupEdit,
value=0,command=self.SetKeysType,text='open Shell Window') value=0,command=self.SetKeysType,text='Open Shell Window')
#frameWinSize #frameWinSize
labelWinSizeTitle=Label(frameWinSize,text='Initial Window Size'+ labelWinSizeTitle=Label(frameWinSize,text='Initial Window Size'+
' (in characters)') ' (in characters)')
...@@ -354,7 +363,7 @@ class ConfigDialog(Toplevel): ...@@ -354,7 +363,7 @@ class ConfigDialog(Toplevel):
labelHelpTitle=Label(frameHelp,text='Help Options') labelHelpTitle=Label(frameHelp,text='Help Options')
frameHelpList=Frame(frameHelp) frameHelpList=Frame(frameHelp)
frameHelpListButtons=Frame(frameHelpList) frameHelpListButtons=Frame(frameHelpList)
labelHelpListTitle=Label(frameHelpList,text='Additional (html) Help Sources:') labelHelpListTitle=Label(frameHelpList,text='Additional Help Sources:')
scrollHelpList=Scrollbar(frameHelpList) scrollHelpList=Scrollbar(frameHelpList)
self.listHelp=Listbox(frameHelpList,height=5,takefocus=FALSE, self.listHelp=Listbox(frameHelpList,height=5,takefocus=FALSE,
exportselection=FALSE) exportselection=FALSE)
...@@ -840,11 +849,11 @@ class ConfigDialog(Toplevel): ...@@ -840,11 +849,11 @@ class ConfigDialog(Toplevel):
apply(self.textHighlightSample.tag_config,(element,),colours) apply(self.textHighlightSample.tag_config,(element,),colours)
self.SetColourSample() self.SetColourSample()
def OnCheckUserHelpBrowser(self): ## def OnCheckUserHelpBrowser(self):
if self.userHelpBrowser.get(): ## if self.userHelpBrowser.get():
self.entryHelpBrowser.config(state=NORMAL) ## self.entryHelpBrowser.config(state=NORMAL)
else: ## else:
self.entryHelpBrowser.config(state=DISABLED) ## self.entryHelpBrowser.config(state=DISABLED)
def HelpSourceSelected(self,event): def HelpSourceSelected(self,event):
self.SetHelpListButtonStates() self.SetHelpListButtonStates()
...@@ -890,7 +899,7 @@ class ConfigDialog(Toplevel): ...@@ -890,7 +899,7 @@ class ConfigDialog(Toplevel):
self.SetHelpListButtonStates() self.SetHelpListButtonStates()
def UpdateUserHelpChangedItems(self): def UpdateUserHelpChangedItems(self):
#clear and rebuild the HelpFiles secion in self.changedItems #clear and rebuild the HelpFiles section in self.changedItems
if self.changedItems['main'].has_key('HelpFiles'): if self.changedItems['main'].has_key('HelpFiles'):
del(self.changedItems['main']['HelpFiles']) del(self.changedItems['main']['HelpFiles'])
for num in range(1,len(self.userHelpList)+1): for num in range(1,len(self.userHelpList)+1):
...@@ -1069,19 +1078,18 @@ class ConfigDialog(Toplevel): ...@@ -1069,19 +1078,18 @@ class ConfigDialog(Toplevel):
return idleConf.userCfg[configType].SetOption(section,item,value) return idleConf.userCfg[configType].SetOption(section,item,value)
def SaveAllChangedConfigs(self): def SaveAllChangedConfigs(self):
""" "Save configuration changes to the user config file."
save all configuration changes to user config files.
"""
#this section gets completely replaced
idleConf.userCfg['main'].remove_section('HelpFiles')
idleConf.userCfg['main'].Save() idleConf.userCfg['main'].Save()
for configType in self.changedItems.keys(): for configType in self.changedItems.keys():
cfgTypeHasChanges=0 cfgTypeHasChanges = False
for section in self.changedItems[configType].keys(): for section in self.changedItems[configType].keys():
if section == 'HelpFiles':
#this section gets completely replaced
idleConf.userCfg['main'].remove_section('HelpFiles')
for item in self.changedItems[configType][section].keys(): for item in self.changedItems[configType][section].keys():
value=self.changedItems[configType][section][item] value = self.changedItems[configType][section][item]
if self.SetUserValue(configType,section,item,value): if self.SetUserValue(configType,section,item,value):
cfgTypeHasChanges=1 cfgTypeHasChanges = True
if cfgTypeHasChanges: if cfgTypeHasChanges:
idleConf.userCfg[configType].Save() idleConf.userCfg[configType].Save()
self.ResetChangedItems() #clear the changed items dict self.ResetChangedItems() #clear the changed items dict
......
""" "Dialog to specify or edit the parameters for a user configured help source."
Dialog that allows user to specify or edit the parameters for a user configured
help source.
"""
from Tkinter import * from Tkinter import *
import tkMessageBox import tkMessageBox
import os import os
class GetHelpSourceDialog(Toplevel): class GetHelpSourceDialog(Toplevel):
def __init__(self,parent,title,menuItem='',filePath=''): def __init__(self, parent, title, menuItem='', filePath=''):
""" """
menuItem - string, the menu item to edit, if any menuItem - string, the menu item to edit, if any
filePath - string, the help file path to edit, if any filePath - string, the help file path to edit, if any
""" """
Toplevel.__init__(self, parent) Toplevel.__init__(self, parent)
self.configure(borderwidth=5) self.configure(borderwidth=5)
self.resizable(height=FALSE,width=FALSE) self.resizable(height=FALSE, width=FALSE)
self.title(title) self.title(title)
self.transient(parent) self.transient(parent)
self.grab_set() self.grab_set()
self.protocol("WM_DELETE_WINDOW", self.Cancel) self.protocol("WM_DELETE_WINDOW", self.Cancel)
self.parent = parent self.parent = parent
self.result=None self.result = None
self.CreateWidgets() self.CreateWidgets()
self.menu.set(menuItem) self.menu.set(menuItem)
self.path.set(filePath) self.path.set(filePath)
self.withdraw() #hide while setting geometry self.withdraw() #hide while setting geometry
self.update_idletasks()
#needs to be done here so that the winfo_reqwidth is valid #needs to be done here so that the winfo_reqwidth is valid
self.update_idletasks()
#centre dialog over parent:
self.geometry("+%d+%d" % self.geometry("+%d+%d" %
((parent.winfo_rootx()+((parent.winfo_width()/2) ((parent.winfo_rootx() + ((parent.winfo_width()/2)
-(self.winfo_reqwidth()/2)), -(self.winfo_reqwidth()/2)),
parent.winfo_rooty()+((parent.winfo_height()/2) parent.winfo_rooty() + ((parent.winfo_height()/2)
-(self.winfo_reqheight()/2)) )) ) #centre dialog over parent -(self.winfo_reqheight()/2)))))
self.deiconify() #geometry set, unhide self.deiconify() #geometry set, unhide
self.bind('<Return>', self.Ok)
self.wait_window() self.wait_window()
def CreateWidgets(self): def CreateWidgets(self):
self.menu=StringVar(self) self.menu = StringVar(self)
self.path=StringVar(self) self.path = StringVar(self)
self.fontSize=StringVar(self) self.fontSize = StringVar(self)
self.frameMain = Frame(self,borderwidth=2,relief=SUNKEN) self.frameMain = Frame(self, borderwidth=2, relief=SUNKEN)
self.frameMain.pack(side=TOP,expand=TRUE,fill=BOTH) self.frameMain.pack(side=TOP, expand=TRUE, fill=BOTH)
labelMenu=Label(self.frameMain,anchor=W,justify=LEFT, labelMenu = Label(self.frameMain, anchor=W, justify=LEFT,
text='Menu Item:') text='Menu Item:')
self.entryMenu=Entry(self.frameMain,textvariable=self.menu,width=30) self.entryMenu = Entry(self.frameMain, textvariable=self.menu,
width=30)
self.entryMenu.focus_set() self.entryMenu.focus_set()
labelPath=Label(self.frameMain,anchor=W,justify=LEFT, labelPath = Label(self.frameMain, anchor=W, justify=LEFT,
text='Help File Path:') text='Help File Path:')
self.entryPath=Entry(self.frameMain,textvariable=self.path,width=40) self.entryPath = Entry(self.frameMain, textvariable=self.path,
width=40)
self.entryMenu.focus_set() self.entryMenu.focus_set()
labelMenu.pack(anchor=W,padx=5,pady=3) labelMenu.pack(anchor=W, padx=5, pady=3)
self.entryMenu.pack(anchor=W,padx=5,pady=3) self.entryMenu.pack(anchor=W, padx=5, pady=3)
labelPath.pack(anchor=W,padx=5,pady=3) labelPath.pack(anchor=W, padx=5, pady=3)
self.entryPath.pack(anchor=W,padx=5,pady=3) self.entryPath.pack(anchor=W, padx=5, pady=3)
frameButtons=Frame(self) frameButtons = Frame(self)
frameButtons.pack(side=BOTTOM,fill=X) frameButtons.pack(side=BOTTOM, fill=X)
self.buttonOk = Button(frameButtons,text='Ok', self.buttonOk = Button(frameButtons, text='OK',
width=8,command=self.Ok) width=8, default=ACTIVE, command=self.Ok)
self.buttonOk.grid(row=0,column=0,padx=5,pady=5) self.buttonOk.grid(row=0, column=0, padx=5,pady=5)
self.buttonCancel = Button(frameButtons,text='Cancel', self.buttonOk.bind('<Return>', self.Ok)
width=8,command=self.Cancel) #self.buttonOk.focus()
self.buttonCancel.grid(row=0,column=1,padx=5,pady=5) self.buttonCancel = Button(frameButtons, text='Cancel',
width=8, command=self.Cancel)
self.buttonCancel.grid(row=0, column=1, padx=5, pady=5)
def MenuOk(self): def MenuOk(self):
#simple validity check for a sensible "Simple validity check for a sensible menu item name"
#menu item name menuOk = True
menuOk=1 menu = self.menu.get()
menu=self.menu.get()
menu.strip() menu.strip()
if not menu: #no menu item specified if not menu:
tkMessageBox.showerror(title='Menu Item Error', tkMessageBox.showerror(title='Menu Item Error',
message='No menu item specified.') message='No menu item specified',
parent=self)
self.entryMenu.focus_set() self.entryMenu.focus_set()
menuOk=0 menuOk = False
elif len(menu)>30: #menu item name too long elif len(menu) > 30:
tkMessageBox.showerror(title='Menu Item Error', tkMessageBox.showerror(title='Menu Item Error',
message='Menu item too long. It should be no more '+ message='Menu item too long:'
'than 30 characters.') '\nLimit 30 characters.',
parent=self)
self.entryMenu.focus_set() self.entryMenu.focus_set()
menuOk=0 menuOk = False
return menuOk return menuOk
def PathOk(self): def PathOk(self):
#simple validity check for menu file path "Simple validity check for menu file path"
pathOk=1 pathOk = True
path=self.path.get() path = self.path.get()
path.strip() path.strip()
if not path: #no path specified if not path: #no path specified
tkMessageBox.showerror(title='File Path Error', tkMessageBox.showerror(title='File Path Error',
message='No help file path specified.') message='No help file path specified.',
parent=self)
self.entryPath.focus_set() self.entryPath.focus_set()
pathOk=0 pathOk = False
elif not os.path.exists(path): elif not os.path.exists(path):
tkMessageBox.showerror(title='File Path Error', tkMessageBox.showerror(title='File Path Error',
message='Help file path does not exist.') message='Help file path does not exist.',
parent=self)
self.entryPath.focus_set() self.entryPath.focus_set()
pathOk=0 pathOk = False
return pathOk return pathOk
def Ok(self, event=None): def Ok(self, event=None):
if self.MenuOk(): if self.MenuOk() and self.PathOk():
if self.PathOk(): self.result = (self.menu.get().strip(),
self.result=( self.menu.get().strip(),self.path.get().strip() ) self.path.get().strip())
self.destroy() self.destroy()
def Cancel(self, event=None): def Cancel(self, event=None):
self.result=None self.result = None
self.destroy() self.destroy()
if __name__ == '__main__': if __name__ == '__main__':
#test the dialog #test the dialog
root=Tk() root = Tk()
def run(): def run():
keySeq='' keySeq = ''
dlg=GetHelpSourceDialog(root,'Get Help Source') dlg = GetHelpSourceDialog(root, 'Get Help Source')
print dlg.result print dlg.result
Button(root,text='Dialog',command=run).pack() Button(root,text='Dialog', command=run).pack()
root.mainloop() root.mainloop()
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment