⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uicommon.py

📁 wxPython的基本示例程序
💻 PY
📖 第 1 页 / 共 2 页
字号:
#----------------------------------------------------------------------------# Name:         UICommon.py# Purpose:      Shared UI stuff## Author:       Matt Fryer, Morgan Hua## Created:      3/10/05# CVS-ID:       $Id: UICommon.py,v 1.7 2006/04/20 06:25:57 RD Exp $# Copyright:    (c) 2005-2006 ActiveGrid, Inc.# License:      wxWindows License#----------------------------------------------------------------------------import osimport os.pathimport wximport stringimport ProjectEditorimport activegrid.util.appdirs as appdirsimport activegrid.util.fileutils as fileutilsimport activegrid.util.strutils as strutilsimport activegrid.util.sysutils as sysutilsimport activegrid.util.xmlutils as xmlutils_ = wx.GetTranslationdef CreateDirectoryControl( parent, fileLabel=_("File Name:"), dirLabel=_("Directory:"), fileExtension="*", startingName="", startingDirectory=None, choiceDirs=None, appDirDefaultStartDir=False, returnAll=False, useDirDialog=False):    if not choiceDirs:        choiceDirs = []        projectDirs = []        if appDirDefaultStartDir:            appDirectory = wx.ConfigBase_Get().Read(ProjectEditor.PROJECT_DIRECTORY_KEY, ProjectEditor.NEW_PROJECT_DIRECTORY_DEFAULT)        else:            appDirectory = wx.ConfigBase_Get().Read(ProjectEditor.PROJECT_DIRECTORY_KEY)        if appDirectory:            choiceDirs.append(appDirectory)            if appDirDefaultStartDir and not startingDirectory:                startingDirectory = appDirectory        projectService = wx.GetApp().GetService(ProjectEditor.ProjectService)        if projectService:            curProjectDoc = projectService.GetCurrentProject()            if curProjectDoc:                homeDir = curProjectDoc.GetAppDocMgr().homeDir                if homeDir and (homeDir not in choiceDirs):                    choiceDirs.append(homeDir)                if not startingDirectory:                    startingDirectory = homeDir                                for projectDoc in projectService.GetOpenProjects():                if projectDoc == curProjectDoc:                    continue                homeDir = projectDoc.GetAppDocMgr().homeDir                if homeDir and (homeDir not in projectDirs):                    projectDirs.append(homeDir)                projectDirs.sort(CaseInsensitiveCompare)            for projectDir in projectDirs:                if projectDir not in choiceDirs:                    choiceDirs.append(projectDir)        if startingDirectory and (startingDirectory not in choiceDirs):            choiceDirs.insert(0, startingDirectory)                    if os.getcwd() not in choiceDirs:            choiceDirs.append(os.getcwd())                        if appdirs.getSystemDir() not in choiceDirs:            choiceDirs.append(appdirs.getSystemDir())     if not startingDirectory:        startingDirectory = os.getcwd()            nameControl = wx.TextCtrl(parent, -1, startingName, size=(-1,-1))    nameLabelText = wx.StaticText(parent, -1, fileLabel)    dirLabelText = wx.StaticText(parent, -1, dirLabel)    dirControl = wx.ComboBox(parent, -1, startingDirectory, size=(-1,-1), choices=choiceDirs)    dirControl.SetToolTipString(startingDirectory)    button = wx.Button(parent, -1, _("Browse..."))    allControls = [nameControl, nameLabelText, dirLabelText, dirControl, button]        def OnFindDirClick(event):         name = ""          nameCtrlValue = nameControl.GetValue()        if nameCtrlValue:            root, ext = os.path.splitext( nameCtrlValue )            if ext == '.' + fileExtension:                name = nameCtrlValue            else:                name = _("%s.%s") % (nameCtrlValue, fileExtension)                        if not useDirDialog:            dlg = wx.FileDialog(parent, _("Choose a filename and directory"),                       defaultDir = dirControl.GetValue().strip(),                       defaultFile = name,                       wildcard= "*.%s" % fileExtension,                       style=wx.SAVE|wx.CHANGE_DIR)        else:            dlg = wx.DirDialog(wx.GetApp().GetTopWindow(),                        _("Choose a directory:"),                        defaultPath=dirControl.GetValue().strip(),                        style=wx.DD_DEFAULT_STYLE|wx.DD_NEW_DIR_BUTTON)                    if dlg.ShowModal() != wx.ID_OK:            dlg.Destroy()            return        path = dlg.GetPath()        dlg.Destroy()                if path:            if not useDirDialog:                dir, filename = os.path.split(path)                if dirControl.FindString(dir) == wx.NOT_FOUND:                    dirControl.Insert(dir, 0)                dirControl.SetValue(dir)                dirControl.SetToolTipString(dir)                nameControl.SetValue(filename)            else:                dirControl.SetValue(path)                dirControl.SetToolTipString(path)    parent.Bind(wx.EVT_BUTTON, OnFindDirClick, button)        def Validate(allowOverwriteOnPrompt=False, infoString='', validClassName=False, ignoreFileConflicts=False):        projName = nameControl.GetValue().strip()        if projName == "":            wx.MessageBox(_("Please provide a %sfile name.") % infoString, _("Provide a File Name"))                        return False        if projName.find(' ') != -1:            wx.MessageBox(_("Please provide a %sfile name that does not contains spaces.") % infoString, _("Spaces in File Name"))                        return False        if validClassName:            if projName[0].isdigit():                wx.MessageBox(_("File name cannot start with a number.  Please enter a different name."), _("Invalid File Name"))                            return False            if projName.endswith(".agp"):                projName2 = projName[:-4]            else:                projName2 = projName            if not projName2.replace("_", "a").isalnum():  # [a-zA-Z0-9_]  note '_' is allowed and ending '.agp'.                wx.MessageBox(_("Name must be alphanumeric ('_' allowed).  Please enter a valid name."), _("Project Name"))                return False        dirName = dirControl.GetValue().strip()        if dirName == "":            wx.MessageBox(_("No directory.  Please provide a directory."), _("Provide a Directory"))                        return False        if os.sep == "\\" and dirName.find("/") != -1:            wx.MessageBox(_("Wrong delimiter '/' found in directory path.  Use '%s' as delimiter.") % os.sep, _("Provide a Valid Directory"))                        return False        if not os.path.exists(dirName):            wx.MessageBox(_("That %sdirectory does not exist.  Please choose an existing directory.") % infoString, _("Provide a Valid Directory"))                        return False        if not ignoreFileConflicts:            filePath = os.path.join(dirName, MakeNameEndInExtension(projName, "." + fileExtension))            if os.path.exists(filePath):                if allowOverwriteOnPrompt:                    res = wx.MessageBox(_("That %sfile already exists. Would you like to overwrite it.") % infoString, "File Exists", style=wx.YES_NO|wx.NO_DEFAULT)                    return (res == wx.YES)                  else:                                    wx.MessageBox(_("That %sfile already exists. Please choose a different name.") % infoString, "File Exists")                    return False        return True        HALF_SPACE = 5    flexGridSizer = wx.FlexGridSizer(cols = 3, vgap = HALF_SPACE, hgap = HALF_SPACE)    flexGridSizer.AddGrowableCol(1,1)    if not useDirDialog:        flexGridSizer.Add(nameLabelText, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_LEFT)        flexGridSizer.Add(nameControl, 2, flag=wx.ALIGN_CENTER_VERTICAL|wx.EXPAND)        flexGridSizer.Add(button, flag=wx.ALIGN_RIGHT|wx.LEFT, border=HALF_SPACE)                flexGridSizer.Add(dirLabelText, flag=wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_LEFT)        flexGridSizer.Add(dirControl, 2, flag=wx.ALIGN_CENTER_VERTICAL|wx.EXPAND)        flexGridSizer.Add(wx.StaticText(parent, -1, ""), 0)    else:        flexGridSizer.Add(nameLabelText, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_LEFT)        flexGridSizer.Add(nameControl, 2, flag=wx.ALIGN_CENTER_VERTICAL|wx.EXPAND)        flexGridSizer.Add(wx.StaticText(parent, -1, ""), 0)        flexGridSizer.Add(dirLabelText, flag=wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_LEFT)        flexGridSizer.Add(dirControl, 2, flag=wx.ALIGN_CENTER_VERTICAL|wx.EXPAND)        flexGridSizer.Add(button, flag=wx.ALIGN_RIGHT|wx.LEFT, border=HALF_SPACE)                    if returnAll:        return nameControl, dirControl, flexGridSizer, Validate, allControls    else:        return nameControl, dirControl, flexGridSizer, Validatedef CreateDirectoryOnlyControl( parent, dirLabel=_("Location:"), startingDirectory=None, choiceDirs=None, appDirDefaultStartDir=False):    if not choiceDirs:        choiceDirs = []        projectDirs = []        if appDirDefaultStartDir:            appDirectory = wx.ConfigBase_Get().Read(ProjectEditor.PROJECT_DIRECTORY_KEY, ProjectEditor.NEW_PROJECT_DIRECTORY_DEFAULT)        else:            appDirectory = wx.ConfigBase_Get().Read(ProjectEditor.PROJECT_DIRECTORY_KEY)        if appDirectory:            choiceDirs.append(appDirectory)            if appDirDefaultStartDir and not startingDirectory:                startingDirectory = appDirectory        projectService = wx.GetApp().GetService(ProjectEditor.ProjectService)        if projectService:            curProjectDoc = projectService.GetCurrentProject()            if curProjectDoc:                homeDir = curProjectDoc.GetAppDocMgr().homeDir                if homeDir and (homeDir not in choiceDirs):                    choiceDirs.append(homeDir)                if not startingDirectory:                    startingDirectory = homeDir                                for projectDoc in projectService.GetOpenProjects():                if projectDoc == curProjectDoc:                    continue                homeDir = projectDoc.GetAppDocMgr().homeDir                if homeDir and (homeDir not in projectDirs):                    projectDirs.append(homeDir)                projectDirs.sort(CaseInsensitiveCompare)            for projectDir in projectDirs:                if projectDir not in choiceDirs:                    choiceDirs.append(projectDir)        if startingDirectory and (startingDirectory not in choiceDirs):            choiceDirs.insert(0, startingDirectory)        if os.getcwd() not in choiceDirs:            choiceDirs.append(os.getcwd())                        if appdirs.getSystemDir() not in choiceDirs:            choiceDirs.append(appdirs.getSystemDir())                                if not startingDirectory:        startingDirectory = os.getcwd()                dirLabelText = wx.StaticText(parent, -1, dirLabel)    dirControl = wx.ComboBox(parent, -1, startingDirectory, size=(-1,-1), choices=choiceDirs)    dirControl.SetToolTipString(startingDirectory)    button = wx.Button(parent, -1, _("Browse..."))        def OnFindDirClick(event):             dlg = wx.DirDialog(wx.GetApp().GetTopWindow(),                                _("Choose a directory:"),                                defaultPath=dirControl.GetValue().strip(),                                style=wx.DD_DEFAULT_STYLE|wx.DD_NEW_DIR_BUTTON)            dlg.CenterOnParent()            if dlg.ShowModal() == wx.ID_OK:                dir = dlg.GetPath()                if dirControl.FindString(dir) == wx.NOT_FOUND:                    dirControl.Insert(dir, 0)                dirControl.SetValue(dir)                dirControl.SetToolTipString(dir)            dlg.Destroy()                parent.Bind(wx.EVT_BUTTON, OnFindDirClick, button)        def Validate(allowOverwriteOnPrompt=False):        dirName = dirControl.GetValue().strip()        if dirName == "":            wx.MessageBox(_("Please provide a directory."), _("Provide a Directory"))                        return False        if os.sep == "\\" and dirName.find("/") != -1:            wx.MessageBox(_("Wrong delimiter '/' found in directory path.  Use '%s' as delimiter.") % os.sep, _("Provide a Valid Directory"))                        return False        if not os.path.exists(dirName):            wx.MessageBox(_("That directory does not exist. Please choose an existing directory."), _("Provide a Valid Directory"))                        return False        return True                HALF_SPACE = 5    flexGridSizer = wx.FlexGridSizer(cols = 3, vgap = HALF_SPACE, hgap = HALF_SPACE)    flexGridSizer.AddGrowableCol(1,1)    flexGridSizer.Add(dirLabelText, flag=wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_LEFT|wx.RIGHT, border=HALF_SPACE)    flexGridSizer.Add(dirControl, 2, flag=wx.ALIGN_CENTER_VERTICAL|wx.EXPAND, border=HALF_SPACE)    flexGridSizer.Add(button, flag=wx.ALIGN_RIGHT|wx.LEFT, border=HALF_SPACE)            return dirControl, flexGridSizer, Validatedef CreateNameOnlyControl( parent, fileLabel, startingName="", startingDirectoryControl=None):    fileLabelText = wx.StaticText(parent, -1, fileLabel)    nameControl = wx.TextCtrl(parent, -1, startingName, size=(-1,-1))            def Validate(allowOverwriteOnPrompt=False, validClassName=False):        projName = nameControl.GetValue().strip()        if projName == "":            wx.MessageBox(_("Blank name.  Please enter a valid name."), _("Project Name"))                        return False        if projName.find(' ') != -1:            wx.MessageBox(_("Spaces in name.  Name cannot have spaces."), _("Project Name"))                        return False        if validClassName:            if projName[0].isdigit():                wx.MessageBox(_("Name cannot start with a number.  Please enter a valid name."), _("Project Name"))                            return False            if projName.endswith(".agp"):                projName2 = projName[:-4]            else:                projName2 = projName            if not projName2.replace("_", "a").isalnum():  # [a-zA-Z0-9_]  note '_' is allowed and ending '.agp'.                wx.MessageBox(_("Name must be alphanumeric ('_' allowed).  Please enter a valid name."), _("Project Name"))                return False        path = os.path.join(startingDirectoryControl.GetValue().strip(), projName)        if os.path.exists(path):            if os.path.isdir(path):                message = _("Project '%s' already exists.  Would you like to overwrite the contents of the project?") % projName            else: # os.path.isfile(path):                message = _("'%s' already exists as a file.  Would you like to replace it with the project?") % nameControl.GetValue().strip()                                yesNoMsg = wx.MessageDialog(wx.GetApp().GetTopWindow(),                          message,                          _("Project Directory Exists"),                          wx.YES_NO|wx.ICON_QUESTION                          )            yesNoMsg.CenterOnParent()            status = yesNoMsg.ShowModal()            yesNoMsg.Destroy()            if status == wx.ID_NO:                return False        return True                HALF_SPACE = 5    flexGridSizer = wx.FlexGridSizer(cols = 2, vgap = HALF_SPACE, hgap = HALF_SPACE)    flexGridSizer.AddGrowableCol(1,1)    flexGridSizer.Add(fileLabelText, flag=wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_LEFT|wx.TOP|wx.RIGHT, border=HALF_SPACE)    flexGridSizer.Add(nameControl, 2, flag=wx.ALIGN_CENTER_VERTICAL|wx.EXPAND, border=HALF_SPACE)            return nameControl, flexGridSizer, Validate    def ValidateName(name, ext=None, hint="name"):    """ Returns an error string if there is something wrong with the name.        Otherwise it returns None    """    if name == "":        return _("Blank %s.  Please enter a valid %s.") % (hint, hint)    if name.find(' ') != -1:        return _("Spaces in %s.  %s cannot have spaces.") % (hint, hint.title())    if name[0].isdigit():        return _("%s cannot start with a number.  Please enter a valid %s.") % (hint.title(), hint)    if ext and name.endswith(ext):  # strip extension if provided        lenExt = len(ext)        name = name[:-lenExt]            if not name.replace("_", "a").isalnum():  # [a-zA-Z0-9_]  note '_' is allowed and ext ending.        return _("%s must be alphanumeric ('_' allowed).  Please enter a valid %s.") % (hint.title(), hint)    return Nonedef GetCurrentProject():    projectDocument = None    projectService = wx.GetApp().GetService(ProjectEditor.ProjectService)    if projectService:        projectDocument = projectService.GetCurrentProject()    return projectDocumentdef AddFilesToCurrentProject(paths, folderPath=None, types=None, names=None, save=False):    projectService = wx.GetApp().GetService(ProjectEditor.ProjectService)    if projectService:        projectDocument = projectService.GetCurrentProject()        if projectDocument:            files = projectDocument.GetFiles()            for path in paths:                if path in files:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -