1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177
|
"""
@package wxgui
@brief Main Python application for GRASS wxPython GUI
Classes:
- wxgui::GMApp
(C) 2006-2015 by the GRASS Development Team
This program is free software under the GNU General Public License
(>=v2). Read the file COPYING that comes with GRASS for details.
@author Michael Barton (Arizona State University)
@author Jachym Cepicky (Mendel University of Agriculture)
@author Martin Landa <landa.martin gmail.com>
@author Vaclav Petras <wenzeslaus gmail.com> (menu customization)
"""
import os
import sys
import getopt
# i18n is taken care of in the grass library code.
# So we need to import it before any of the GUI code.
from grass.exceptions import Usage
from grass.script.core import set_raise_on_error, warning, error
from core import globalvar
from core.utils import registerPid, unregisterPid
from core.settings import UserSettings
import wx
# import adv and html before wx.App is created, otherwise
# we get annoying "Debug: Adding duplicate image handler for 'Windows bitmap file'"
# during start up, remove when not needed
import wx.adv
import wx.html
try:
import wx.lib.agw.advancedsplash as SC
except ImportError:
SC = None
class GMApp(wx.App):
def __init__(self, workspace=None):
"""Main GUI class.
:param workspace: path to the workspace file
"""
self.workspaceFile = workspace
# call parent class initializer
wx.App.__init__(self, False)
self.locale = wx.Locale(language=wx.LANGUAGE_DEFAULT)
def OnInit(self):
"""Initialize all available image handlers
:return: True
"""
# Internal and display name of the app (if supported by/on platform)
self.SetAppName("GRASS GIS")
self.SetVendorName("The GRASS Development Team")
# create splash screen
introImagePath = os.path.join(globalvar.IMGDIR, "splash_screen.png")
introImage = wx.Image(introImagePath, wx.BITMAP_TYPE_PNG)
introBmp = introImage.ConvertToBitmap()
wx.adv.SplashScreen(
bitmap=introBmp,
splashStyle=wx.adv.SPLASH_CENTRE_ON_SCREEN | wx.adv.SPLASH_TIMEOUT,
milliseconds=3000,
parent=None,
id=wx.ID_ANY,
)
wx.GetApp().Yield()
def show_main_gui():
# create and show main frame
single = UserSettings.Get(
group="appearance", key="singleWindow", subkey="enabled"
)
if single:
from main_window.frame import GMFrame
else:
from lmgr.frame import GMFrame
try:
mainframe = GMFrame(
parent=None, id=wx.ID_ANY, workspace=self.workspaceFile
)
except Exception as err:
min_required_wx_version = [4, 2, 0]
if not globalvar.CheckWxVersion(min_required_wx_version):
error(err)
warning(
_(
"Current version of wxPython {} is lower than "
"minimum required version {}".format(
wx.__version__,
".".join(map(str, min_required_wx_version)),
)
)
)
else:
raise
else:
mainframe.Show()
self.SetTopWindow(mainframe)
wx.CallAfter(show_main_gui)
return True
def OnExit(self):
"""Clean up on exit"""
unregisterPid(os.getpid())
return super().OnExit()
def printHelp():
"""Print program help"""
print("Usage:", file=sys.stderr)
print(" python wxgui.py [options]", file=sys.stderr)
print("%sOptions:" % os.linesep, file=sys.stderr)
print(" -w\t--workspace file\tWorkspace file to load", file=sys.stderr)
sys.exit(1)
def process_opt(opts, args):
"""Process command-line arguments"""
workspaceFile = None
for o, a in opts:
if o in ("-h", "--help"):
printHelp()
elif o in ("-w", "--workspace"):
if a != "":
workspaceFile = str(a)
else:
workspaceFile = args.pop(0)
return workspaceFile
def main(argv=None):
if argv is None:
argv = sys.argv
try:
try:
opts, args = getopt.getopt(argv[1:], "hw:", ["help", "workspace"])
except getopt.error as msg:
raise Usage(msg)
except Usage as err:
print(err.msg, file=sys.stderr)
print(sys.stderr, "for help use --help", file=sys.stderr)
printHelp()
workspaceFile = process_opt(opts, args)
app = GMApp(workspaceFile)
# suppress wxPython logs
q = wx.LogNull()
set_raise_on_error(True)
# register GUI PID
registerPid(os.getpid())
app.MainLoop()
if __name__ == "__main__":
sys.exit(main())
|