def main(delay): from PyQt4.QtCore import QTimer app = AnkiApp(sys.argv) QCoreApplication.setApplicationName("Anki") if app.secondInstance(): print('Anki is already running') return from aqt.profiles import ProfileManager pm = ProfileManager('', '') setupLang(pm, app) pm.load('bz') pm.profile['autoSync'] = True pm.ensureProfile() def dummy(*args, **kwargs): pass # load the main window import aqt.main mw = aqt.main.AnkiQt(app, pm, []) # prevent Anki from showing main window mw.show = dummy mw.activateWindow = dummy mw.raise_ = dummy def handler(): if mw.state == 'sync': # print('state sync') set_timer() return else: # print('state NOT sync') mw.onClose() mw.close() app.closeAllWindows() app.quit() def set_timer(): timer = QTimer(mw) timer.setSingleShot(True) timer.connect(timer, SIGNAL('timeout()'), handler) timer.start(delay) def start_sync(): # print('timer start_sync') mw.onSync(auto=True) set_timer() QTimer.singleShot(5000, start_sync) # print(dir(mw)) #print('executing app') #mw.setupProgress() #mw.progress.start(immediate=True) #mw.progress._lastUpdate = time.time() #mw.onSync() app.exec_()
def run(): global mw from anki.utils import isWin, isMac # on osx we'll need to add the qt plugins to the search path if isMac and getattr(sys, 'frozen', None): rd = os.path.abspath(moduleDir + "/../../..") QCoreApplication.setLibraryPaths([rd]) # create the app app = AnkiApp(sys.argv) QCoreApplication.setApplicationName("Anki") if app.secondInstance(): # we've signaled the primary instance, so we should close return # parse args opts, args = parseArgs(sys.argv) opts.base = unicode(opts.base or "", sys.getfilesystemencoding()) opts.profile = unicode(opts.profile or "", sys.getfilesystemencoding()) # profile manager from aqt.profiles import ProfileManager pm = ProfileManager(opts.base, opts.profile) # i18n setupLang(pm, app, opts.lang) # remaining pm init pm.ensureProfile() # load the main window import aqt.main mw = aqt.main.AnkiQt(app, pm, args) app.exec_()
def run(): global mw from anki.utils import isMac # parse args opts, args = parseArgs(sys.argv) opts.base = unicode(opts.base or "", sys.getfilesystemencoding()) opts.profile = unicode(opts.profile or "", sys.getfilesystemencoding()) # on osx we'll need to add the qt plugins to the search path if isMac and getattr(sys, "frozen", None): rd = os.path.abspath(moduleDir + "/../../..") QCoreApplication.setLibraryPaths([rd]) # create the app app = AnkiApp(sys.argv) QCoreApplication.setApplicationName("Anki") if app.secondInstance(): # we've signaled the primary instance, so we should close return # we must have a usable temp dir try: tempfile.gettempdir() except: QMessageBox.critical( None, "Error", """\ No usable temporary folder found. Make sure C:\\temp exists or TEMP in your \ environment points to a valid, writable folder.""", ) return # qt version must be up to date if qtmajor <= 4 and qtminor <= 6: QMessageBox.warning( None, "Error", "Your Qt version is known to be buggy. Until you " "upgrade to a newer Qt, you may experience issues such as images " "failing to show up during review.", ) # profile manager from aqt.profiles import ProfileManager pm = ProfileManager(opts.base, opts.profile) # i18n setupLang(pm, app, opts.lang) # remaining pm init pm.ensureProfile() # load the main window import aqt.main mw = aqt.main.AnkiQt(app, pm, args) app.exec_()
def run(): global mw from anki.utils import isWin, isMac # on osx we'll need to add the qt plugins to the search path if isMac and getattr(sys, 'frozen', None): rd = os.path.abspath(moduleDir + "/../../..") QCoreApplication.setLibraryPaths([rd]) # create the app app = AnkiApp(sys.argv) QCoreApplication.setApplicationName("Anki") if app.secondInstance(): # we've signaled the primary instance, so we should close return # parse args opts, args = parseArgs(sys.argv) opts.base = unicode(opts.base or "", sys.getfilesystemencoding()) opts.profile = unicode(opts.profile or "", sys.getfilesystemencoding()) # profile manager from aqt.profiles import ProfileManager pm = ProfileManager(opts.base, opts.profile) # i18n setupLang(pm, app, opts.lang) # remaining pm init pm.ensureProfile() # load the main window import aqt.main mw = aqt.main.AnkiQt(app, pm, args) app.exec_()
def _run(): global mw # parse args opts, args = parseArgs(sys.argv) opts.base = unicode(opts.base or "", sys.getfilesystemencoding()) opts.profile = unicode(opts.profile or "", sys.getfilesystemencoding()) # on osx we'll need to add the qt plugins to the search path if isMac and getattr(sys, 'frozen', None): rd = os.path.abspath(moduleDir + "/../../..") QCoreApplication.setLibraryPaths([rd]) if isMac: QFont.insertSubstitution(".Lucida Grande UI", "Lucida Grande") # create the app app = AnkiApp(sys.argv) QCoreApplication.setApplicationName("Anki") if app.secondInstance(): # we've signaled the primary instance, so we should close return # disable icons on mac; this must be done before window created if isMac: app.setAttribute(Qt.AA_DontShowIconsInMenus) # we must have a usable temp dir try: tempfile.gettempdir() except: QMessageBox.critical( None, "Error", """\ No usable temporary folder found. Make sure C:\\temp exists or TEMP in your \ environment points to a valid, writable folder.""") return # qt version must be up to date if qtmajor <= 4 and qtminor <= 6: QMessageBox.warning( None, "Error", "Your Qt version is known to be buggy. Until you " "upgrade to a newer Qt, you may experience issues such as images " "failing to show up during review.") # profile manager from aqt.profiles import ProfileManager pm = ProfileManager(opts.base, opts.profile) # i18n setupLang(pm, app, opts.lang) # remaining pm init pm.ensureProfile() # load the main window import aqt.main mw = aqt.main.AnkiQt(app, pm, args) app.exec_()
def _run(): global mw # parse args opts, args = parseArgs(sys.argv) opts.base = opts.base or "" opts.profile = opts.profile or "" # work around pyqt loading wrong GL library if isLin: import ctypes ctypes.CDLL('libGL.so.1', ctypes.RTLD_GLOBAL) # opt in to full hidpi support QCoreApplication.setAttribute(Qt.AA_EnableHighDpiScaling) # create the app app = AnkiApp(sys.argv) QCoreApplication.setApplicationName("Anki") if app.secondInstance(): # we've signaled the primary instance, so we should close return # disable icons on mac; this must be done before window created if isMac: app.setAttribute(Qt.AA_DontShowIconsInMenus) # we must have a usable temp dir try: tempfile.gettempdir() except: QMessageBox.critical( None, "Error", """\ No usable temporary folder found. Make sure C:\\temp exists or TEMP in your \ environment points to a valid, writable folder.""") return # profile manager from aqt.profiles import ProfileManager pm = ProfileManager(opts.base, opts.profile) # i18n setupLang(pm, app, opts.lang) # remaining pm init pm.ensureProfile() print( "This is an BETA build - please do not package it up for Linux distributions" ) # load the main window import aqt.main mw = aqt.main.AnkiQt(app, pm, args) app.exec_()
def _run(): global mw # parse args opts, args = parseArgs(sys.argv) opts.base = opts.base or "" opts.profile = opts.profile or "" # on osx we'll need to add the qt plugins to the search path if isMac and getattr(sys, 'frozen', None): rd = os.path.abspath(moduleDir + "/../../../plugins") QCoreApplication.setLibraryPaths([rd]) # work around pyqt loading wrong GL library if isLin: import ctypes ctypes.CDLL('libGL.so.1', ctypes.RTLD_GLOBAL) # create the app app = AnkiApp(sys.argv) QCoreApplication.setApplicationName("Anki") if app.secondInstance(): # we've signaled the primary instance, so we should close return # disable icons on mac; this must be done before window created if isMac: app.setAttribute(Qt.AA_DontShowIconsInMenus) # we must have a usable temp dir try: tempfile.gettempdir() except: QMessageBox.critical( None, "Error", """\ No usable temporary folder found. Make sure C:\\temp exists or TEMP in your \ environment points to a valid, writable folder.""") return # profile manager from aqt.profiles import ProfileManager pm = ProfileManager(opts.base, opts.profile) # i18n setupLang(pm, app, opts.lang) # remaining pm init pm.ensureProfile() # load the main window import aqt.main mw = aqt.main.AnkiQt(app, pm, args) app.exec_()
def _run(): global mw # parse args opts, args = parseArgs(sys.argv) opts.base = opts.base or "" opts.profile = opts.profile or "" # work around pyqt loading wrong GL library if isLin: import ctypes ctypes.CDLL('libGL.so.1', ctypes.RTLD_GLOBAL) # opt in to full hidpi support QCoreApplication.setAttribute(Qt.AA_EnableHighDpiScaling) # create the app app = AnkiApp(sys.argv) QCoreApplication.setApplicationName("Anki") if app.secondInstance(): # we've signaled the primary instance, so we should close return # disable icons on mac; this must be done before window created if isMac: app.setAttribute(Qt.AA_DontShowIconsInMenus) # we must have a usable temp dir try: tempfile.gettempdir() except: QMessageBox.critical( None, "Error", """\ No usable temporary folder found. Make sure C:\\temp exists or TEMP in your \ environment points to a valid, writable folder.""") return # profile manager from aqt.profiles import ProfileManager pm = ProfileManager(opts.base, opts.profile) # i18n setupLang(pm, app, opts.lang) # remaining pm init pm.ensureProfile() print("This is an BETA build - please do not package it up for Linux distributions") # load the main window import aqt.main mw = aqt.main.AnkiQt(app, pm, args) app.exec_()
def _run(): global mw # parse args opts, args = parseArgs(sys.argv) opts.base = opts.base or "" opts.profile = opts.profile or "" # on osx we'll need to add the qt plugins to the search path if isMac and getattr(sys, 'frozen', None): rd = os.path.abspath(moduleDir + "/../../../plugins") QCoreApplication.setLibraryPaths([rd]) # create the app app = AnkiApp(sys.argv) QCoreApplication.setApplicationName("Anki") if app.secondInstance(): # we've signaled the primary instance, so we should close return # disable icons on mac; this must be done before window created if isMac: app.setAttribute(Qt.AA_DontShowIconsInMenus) # we must have a usable temp dir try: tempfile.gettempdir() except: QMessageBox.critical( None, "Error", """\ No usable temporary folder found. Make sure C:\\temp exists or TEMP in your \ environment points to a valid, writable folder.""") return # profile manager from aqt.profiles import ProfileManager pm = ProfileManager(opts.base, opts.profile) # i18n setupLang(pm, app, opts.lang) # remaining pm init pm.ensureProfile() # load the main window import aqt.main mw = aqt.main.AnkiQt(app, pm, args) app.exec_()
def run(): global mw from anki.utils import isWin, isMac # on osx we'll need to add the qt plugins to the search path if isMac and getattr(sys, 'frozen', None): rd = os.path.abspath(moduleDir + "/../../..") QCoreApplication.setLibraryPaths([rd]) # create the app app = AnkiApp(sys.argv) QCoreApplication.setApplicationName("Anki") if app.secondInstance(): # we've signaled the primary instance, so we should close return # we must have a usable temp dir try: tempfile.gettempdir() except: QMessageBox.critical( None, "Error", """\ No usable temporary folder found. Make sure C:\\temp exists or TEMP in your \ environment points to a valid, writable folder.""") return # parse args opts, args = parseArgs(sys.argv) opts.base = unicode(opts.base or "", sys.getfilesystemencoding()) opts.profile = unicode(opts.profile or "", sys.getfilesystemencoding()) # profile manager from aqt.profiles import ProfileManager pm = ProfileManager(opts.base, opts.profile) # i18n setupLang(pm, app, opts.lang) # remaining pm init pm.ensureProfile() # load the main window import aqt.main mw = aqt.main.AnkiQt(app, pm, args) app.exec_()
def run(): global mw from anki.utils import isWin, isMac # on osx we'll need to add the qt plugins to the search path if isMac and getattr(sys, "frozen", None): rd = os.path.abspath(moduleDir + "/../../..") QCoreApplication.setLibraryPaths([rd]) # create the app app = AnkiApp(sys.argv) QCoreApplication.setApplicationName("Anki") # parse args import optparse parser = optparse.OptionParser() parser.usage = "%prog [OPTIONS]" parser.add_option("-b", "--base", help="path to base folder") parser.add_option("-p", "--profile", help="profile name to load") parser.add_option("-l", "--lang", help="interface language (en, de, etc)") (opts, args) = parser.parse_args(sys.argv[1:]) opts.base = unicode(opts.base or "", sys.getfilesystemencoding()) opts.profile = unicode(opts.profile or "", sys.getfilesystemencoding()) # profile manager from aqt.profiles import ProfileManager pm = ProfileManager(opts.base, opts.profile) # i18n setupLang(pm, app, opts.lang) # remaining pm init pm.checkPid() pm.ensureProfile() # load the main window import aqt.main mw = aqt.main.AnkiQt(app, pm) app.exec_()
def run(): global mw from anki.utils import isWin, isMac # on osx we'll need to add the qt plugins to the search path if isMac and getattr(sys, 'frozen', None): rd = os.path.abspath(moduleDir + "/../../..") QCoreApplication.setLibraryPaths([rd]) # create the app app = AnkiApp(sys.argv) QCoreApplication.setApplicationName("Anki") # parse args import optparse parser = optparse.OptionParser() parser.usage = "%prog [OPTIONS]" parser.add_option("-b", "--base", help="path to base folder") parser.add_option("-p", "--profile", help="profile name to load") parser.add_option("-l", "--lang", help="interface language (en, de, etc)") (opts, args) = parser.parse_args(sys.argv[1:]) opts.base = unicode(opts.base or "", sys.getfilesystemencoding()) opts.profile = unicode(opts.profile or "", sys.getfilesystemencoding()) # profile manager from aqt.profiles import ProfileManager pm = ProfileManager(opts.base, opts.profile) # i18n setupLang(pm, app, opts.lang) # remaining pm init pm.checkPid() pm.ensureProfile() # load the main window import aqt.main mw = aqt.main.AnkiQt(app, pm) app.exec_()
def _run(argv=None, exec=True): """Start AnkiQt application or reuse an existing instance if one exists. If the function is invoked with exec=False, the AnkiQt will not enter the main event loop - instead the application object will be returned. The 'exec' and 'argv' arguments will be useful for testing purposes. If no 'argv' is supplied then 'sys.argv' will be used. """ global mw if argv is None: argv = sys.argv # parse args opts, args = parseArgs(argv) opts.base = opts.base or "" opts.profile = opts.profile or "" # profile manager from aqt.profiles import ProfileManager pm = ProfileManager(opts.base) # gl workarounds setupGL(pm) # opt in to full hidpi support? if not os.environ.get("ANKI_NOHIGHDPI"): QCoreApplication.setAttribute(Qt.AA_EnableHighDpiScaling) # create the app app = AnkiApp(argv) QCoreApplication.setApplicationName("Anki") if app.secondInstance(): # we've signaled the primary instance, so we should close return # disable icons on mac; this must be done before window created if isMac: app.setAttribute(Qt.AA_DontShowIconsInMenus) # we must have a usable temp dir try: tempfile.gettempdir() except: QMessageBox.critical( None, "Error", """\ No usable temporary folder found. Make sure C:\\temp exists or TEMP in your \ environment points to a valid, writable folder.""") return pm.setupMeta() if opts.profile: pm.openProfile(opts.profile) # i18n setupLang(pm, app, opts.lang) # remaining pm init pm.ensureProfile() # load the main window import aqt.main mw = aqt.main.AnkiQt(app, pm, opts, args) if exec: app.exec() else: return app
def _run(argv=None, exec=True): """Start AnkiQt application or reuse an existing instance if one exists. If the function is invoked with exec=False, the AnkiQt will not enter the main event loop - instead the application object will be returned. The 'exec' and 'argv' arguments will be useful for testing purposes. If no 'argv' is supplied then 'sys.argv' will be used. """ global mw if argv is None: argv = sys.argv # parse args opts, args = parseArgs(argv) opts.base = opts.base or "" opts.profile = opts.profile or "" # profile manager from aqt.profiles import ProfileManager pm = ProfileManager(opts.base) # gl workarounds setupGL(pm) # opt in to full hidpi support? if not os.environ.get("ANKI_NOHIGHDPI"): QCoreApplication.setAttribute(Qt.AA_EnableHighDpiScaling) # create the app app = AnkiApp(argv) QCoreApplication.setApplicationName("Anki") if app.secondInstance(): # we've signaled the primary instance, so we should close return # disable icons on mac; this must be done before window created if isMac: app.setAttribute(Qt.AA_DontShowIconsInMenus) # proxy configured? from urllib.request import proxy_bypass, getproxies if 'http' in getproxies(): # if it's not set up to bypass localhost, we'll # need to disable proxies in the webviews if not proxy_bypass("127.0.0.1"): print("webview proxy use disabled") proxy = QNetworkProxy() proxy.setType(QNetworkProxy.NoProxy) QNetworkProxy.setApplicationProxy(proxy) # we must have a usable temp dir try: tempfile.gettempdir() except: QMessageBox.critical( None, "Error", """\ No usable temporary folder found. Make sure C:\\temp exists or TEMP in your \ environment points to a valid, writable folder.""") return pm.setupMeta() if opts.profile: pm.openProfile(opts.profile) # i18n setupLang(pm, app, opts.lang) if isLin and pm.glMode() == "auto": from aqt.utils import gfxDriverIsBroken if gfxDriverIsBroken(): pm.nextGlMode() QMessageBox.critical( None, "Error", "Your video driver is incompatible. Please start Anki again, and Anki will switch to a slower, more compatible mode." ) sys.exit(1) # remaining pm init pm.ensureProfile() # load the main window import aqt.main mw = aqt.main.AnkiQt(app, pm, opts, args) if exec: app.exec() else: return app
class RogueAnki: def __init__(self, base, profile): self.base = unicode(base or "", sys.getfilesystemencoding()) self.profile = unicode(profile or "", sys.getfilesystemencoding()) self.pm = ProfileManager(self.base, self.profile) if self.profile: self.pm.ensureProfile() else: # defaulting to first frofile found name = self.pm.profiles()[0]; self.pm = ProfileManager(self.base, name) self.pm.ensureProfile() self.collection = Collection(self.pm.collectionPath()) def add(self, front, back, deck_name, model_name): default_deck = self.collection.decks.allNames()[0] default_model = self.collection.models.allNames()[0] deck_name = unicode(deck_name or default_deck, sys.getfilesystemencoding()) model_name = unicode(model_name or default_model, sys.getfilesystemencoding()) model = self.collection.models.byName(model_name) if not model: mm = ModelManager(self.collection) model = mm.new(model_name) mm.save(model) model['did'] = did = self.collection.decks.id(deck_name) self.collection.models.save() note = self.collection.newNote() note['Front']= unicode(front or "", sys.getfilesystemencoding()) note['Back']= unicode(back or "", sys.getfilesystemencoding()) note.model()['did']= did self.collection.addNote(note) self.collection.save() self.collection.genCards(self.collection.models.nids(model)) def list_decks(self): print "decks:" for x in self.collection.decks.allNames(): print x print "models:" for x in self.collection.models.allNames(): print x def sync(self): server= RemoteServer(self.pm.profile['syncKey']) client = Syncer(self.collection, server) ret = None try: print client.sync() except Exception, e: log = traceback.format_exc() try: err = unicode(e[0], "utf8", "ignore") except: # number, exception with no args, etc err = "" if "Unable to find the server" in err: print "offline" return else: if not isinstance(log, unicode): err = unicode(log, "utf8", "replace") print "error", log return if ret == "badAuth": print "badAuth" return elif ret == "clockOff": print "clockOff" return if ret == "fullSync": print "fullSync" return self.fullSync(server) # save and note success state self.collection.save() if ret == "noChanges": print "noChanges" else: print "success"
def _run(argv=None, exec=True): """Start AnkiQt application or reuse an existing instance if one exists. If the function is invoked with exec=False, the AnkiQt will not enter the main event loop - instead the application object will be returned. The 'exec' and 'argv' arguments will be useful for testing purposes. If no 'argv' is supplied then 'sys.argv' will be used. """ global mw if argv is None: argv = sys.argv # parse args opts, args = parseArgs(argv) opts.base = opts.base or "" opts.profile = opts.profile or "" # work around pyqt loading wrong GL library if isLin: import ctypes ctypes.CDLL('libGL.so.1', ctypes.RTLD_GLOBAL) # opt in to full hidpi support QCoreApplication.setAttribute(Qt.AA_EnableHighDpiScaling) # create the app app = AnkiApp(argv) QCoreApplication.setApplicationName("Anki") if app.secondInstance(): # we've signaled the primary instance, so we should close return # disable icons on mac; this must be done before window created if isMac: app.setAttribute(Qt.AA_DontShowIconsInMenus) # we must have a usable temp dir try: tempfile.gettempdir() except: QMessageBox.critical( None, "Error", """\ No usable temporary folder found. Make sure C:\\temp exists or TEMP in your \ environment points to a valid, writable folder.""") return # profile manager from aqt.profiles import ProfileManager pm = ProfileManager(opts.base, opts.profile) # i18n setupLang(pm, app, opts.lang) # remaining pm init pm.ensureProfile() print("This is an BETA build - please do not package it up for Linux distributions") # load the main window import aqt.main mw = aqt.main.AnkiQt(app, pm, args) if exec: app.exec() else: return app
def _run(argv=None, exec=True): """Start AnkiQt application or reuse an existing instance if one exists. If the function is invoked with exec=False, the AnkiQt will not enter the main event loop - instead the application object will be returned. The 'exec' and 'argv' arguments will be useful for testing purposes. If no 'argv' is supplied then 'sys.argv' will be used. """ global mw if argv is None: argv = sys.argv # parse args opts, args = parseArgs(argv) opts.base = opts.base or "" opts.profile = opts.profile or "" if opts.dev: os.environ["ANKIDEV"] = "1" print("running in dev mode") if isMac: if getattr(sys, 'frozen', None): # on osx we'll need to add the qt plugins to the search path rd = os.path.abspath(moduleDir + "/../../..") QCoreApplication.setLibraryPaths([rd]) QFont.insertSubstitution(".Lucida Grande UI", "Lucida Grande") # create the app QCoreApplication.setApplicationName("Anki") app = AnkiApp(argv) if app.secondInstance(): # we've signaled the primary instance, so we should close return # disable icons on mac; this must be done before window created if isMac: app.setAttribute(Qt.AA_DontShowIconsInMenus) # disable help button in title bar on qt versions that support it if isWin and qtminor >= 10: QApplication.setAttribute(Qt.AA_DisableWindowContextHelpButton) # we must have a usable temp dir try: tempfile.gettempdir() except: QMessageBox.critical( None, "Error", """\ No usable temporary folder found. Make sure C:\\temp exists or TEMP in your \ environment points to a valid, writable folder.""") return # qt version must be up to date if qtmajor <= 4 and qtminor <= 6: QMessageBox.warning( None, "Error", "Your Qt version is known to be buggy. Until you " "upgrade to a newer Qt, you may experience issues such as images " "failing to show up during review.") # profile manager from aqt.profiles import ProfileManager pm = ProfileManager(opts.base, opts.profile) # i18n setupLang(pm, app, opts.lang) # remaining pm init pm.ensureProfile() # load the main window import aqt.main mw = aqt.main.AnkiQt(app, pm, args) if exec: app.exec_() else: return app