Source code for wbia.guitool.guitool_main
# -*- coding: utf-8 -*-
from __future__ import absolute_import, division, print_function
import sys
from wbia.guitool.__PYQT__ import QtCore
from wbia.guitool.__PYQT__ import QtWidgets # NOQA
from wbia.guitool.__PYQT__ import GUITOOL_PYQT_VERSION # NOQA
import utool as ut
ut.noinject(__name__, '[guitool.main]', DEBUG=False)
IS_ROOT_WINDOW = False
QAPP = None
VERBOSE = '--verbose' in sys.argv
QUIET = '--quiet' in sys.argv
[docs]def get_qtapp():
global QAPP
return QAPP
[docs]def ensure_qtapp():
global IS_ROOT_WINDOW
global QAPP
if QAPP is not None:
return QAPP, IS_ROOT_WINDOW
parent_qapp = QtCore.QCoreApplication.instance()
if parent_qapp is None: # if not in qtconsole
if not QUIET:
print('[guitool] Init new QApplication')
QAPP = GuitoolApplication(sys.argv)
if GUITOOL_PYQT_VERSION == 4:
QAPP.setStyle('plastique')
else:
# http://stackoverflow.com/questions/38154702/how-to-install-new-qstyle-for-pyqt
# QAPP.setStyle('Windows')
# QAPP.setStyle('WindowsXP')
# QAPP.setStyle('WindowsVista')
# available_styles = QtWidgets.QStyleFactory().keys()
# print('available_styles = %r' % (available_styles,))
# QAPP.setStyle('Fusion')
QAPP.setStyle('GTK+')
# QAPP.setStyle('windows')
# QAPP.setStyle('cleanlooks')
# QAPP.setStyle('motif')
# QAPP.setDesktopSettingsAware(True)
# QAPP.setStyle('cde')
# "windows", "motif", "cde", "plastique" and "cleanlooks" and depending on the platform, "windowsxp", "windowsvista" and "macintosh"
# print('QAPP = %r' % QAPP)
assert QAPP is not None
IS_ROOT_WINDOW = True
else:
if not QUIET:
print('[guitool] Using parent QApplication')
QAPP = parent_qapp
IS_ROOT_WINDOW = False
return QAPP, IS_ROOT_WINDOW
ensure_qapp = ensure_qtapp
[docs]def activate_qwindow(qwin):
global QAPP
if not QUIET:
print('[guitool] qapp.setActiveWindow(qwin)')
qwin.show()
QAPP.setActiveWindow(qwin)
[docs]def qtapp_loop_nonblocking(qwin=None, **kwargs):
"""
Fixme:
In order to have a non-blocking qt application then the app must have been started
with IPython.lib.inputhook.enable_gui
import IPython.lib.inputhook
IPython.lib.inputhook.enable_gui('qt4')
Actually lib.inputhook is depricated
Maybe IPython.terminal.pt_inputhooks
import IPython.terminal.pt_inputhooks
inputhook = IPython.terminal.pt_inputhooks.get_inputhook_func('qt4')
"""
global QAPP
# from IPython.lib.inputhook import enable_qt4
import IPython.lib.guisupport
if not QUIET:
print('[guitool] Starting ipython qt hook')
# enable_qt4()
if GUITOOL_PYQT_VERSION == 4:
IPython.lib.guisupport.start_event_loop_qt4(QAPP)
else:
IPython.lib.guisupport.start_event_loop_qt5(QAPP)
# if '__PYQT__' in sys.modules:
# from wbia.guitool.__PYQT__ import QtCore
# from IPython.lib.inputhook import enable_qt4
# from IPython.lib.guisupport import start_event_loop_qt4
# qapp = QtCore.QCoreApplication.instance()
##qapp.exec_()
# print('[ut.dbg] Starting ipython qt4 hook')
# enable_qt4()
# start_event_loop_qt4(qapp)
[docs]def qtapp_loop(
qwin=None,
ipy=False,
enable_activate_qwin=True,
frequency=420,
init_signals=True,
**kwargs,
):
r"""
Args:
qwin (None): (default = None)
ipy (bool): set to True if running with IPython (default = False)
enable_activate_qwin (bool): (default = True)
frequency (int): frequency to ping python interpreter (default = 420)
init_signals (bool): if False, handle terminal signals yourself (default = True)
CommandLine:
python -m wbia.guitool.guitool_main --test-qtapp_loop
"""
global QAPP
# if not QUIET and VERBOSE:
if not QUIET:
print('[guitool.qtapp_loop()] ENTERING')
print('[guitool.qtapp_loop()] starting qt app loop: qwin=%r' % (qwin,))
if enable_activate_qwin and (qwin is not None):
activate_qwindow(qwin)
qwin.timer = ping_python_interpreter(frequency=frequency)
elif qwin is None:
print('[guitool] Warning: need to specify qwin for ctrl+c to work')
if init_signals:
# allow ctrl+c to exit the program
_init_signals()
if IS_ROOT_WINDOW:
if not QUIET:
print('[guitool.qtapp_loop()] qapp.exec_() # runing main loop')
if not ipy:
# old_excepthook = sys.excepthook
# def qt_excepthook(type_, value, traceback):
# print('QT EXCEPTION HOOK')
# old_excepthook(type_, value, traceback)
# #QAPP.quit()
# exit_application()
# sys.exit(1)
# sys.excepthook = qt_excepthook
try:
retcode = QAPP.exec_()
print('QAPP retcode = %r' % (retcode,))
QAPP.exit(retcode)
except Exception as ex:
print('QException: %r' % ex)
raise
else:
if not QUIET:
print('[guitool.qtapp_loop()] not execing')
if not QUIET:
print('[guitool.qtapp_loop()] EXITING')
[docs]def ping_python_interpreter(frequency=420): # 4200):
""" Create a QTimer which lets the python catch ctrl+c """
if not QUIET and VERBOSE:
print('[guitool] pinging python interpreter for ctrl+c freq=%r' % frequency)
timer = QtCore.QTimer()
def ping_func():
# print('lub dub')
return None
timer.ping_func = ping_func
timer.timeout.connect(timer.ping_func)
timer.start(frequency)
return timer
# @atexit.register
[docs]def exit_application():
if ut.NOT_QUIET:
print('[guitool] exiting application')
QtWidgets.qApp.quit()
def _on_ctrl_c(signal, frame):
print('[guitool.guitool_main] Caught ctrl+c. sys.exit(0)...')
sys.exit(0)
# -----------------------
# private init functions
def _init_signals():
import signal
# print('initializing qt ctrl+c signal')
signal.signal(signal.SIGINT, _on_ctrl_c)