123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163 |
- """
- @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)
- """
- from __future__ import print_function
- 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
- 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="general", key="singleWindow", subkey="enabled"
- )
- if single:
- from main_window.frame import GMFrame
- else:
- from lmgr.frame import GMFrame
- mainframe = GMFrame(parent=None, id=wx.ID_ANY, workspace=self.workspaceFile)
- 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())
|