def _setup_window(self): ShowBase.__init__(self, windowType="none") frame = tkinter.Tk() try: frame.state("zoomed") except: frame.attributes("-zoomed", True) frame.title("Bloom") frame.bind("<Configure>", self._handle_resize) frame.protocol("WM_DELETE_WINDOW", self._handle_exit) self.wantTk = True self.tkRoot = frame init_app_for_gui() tk_frame_rate = core.ConfigVariableDouble("tk-frame-rate", 60.0) self._tk_delay = int(1000.0 / tk_frame_rate.get_value()) self.tkRoot.after(self._tk_delay, self._tk_timer_callback) self.run = self.tkRun self.taskMgr.run = self.tkRun if self.appRunner: self.appRunner.run = self.tkRun props = self._window_props() self.make_default_pipe() self.open_default_window(props=props)
def setP3DFilename(self, p3dFilename, tokens, argv, instanceId, interactiveConsole, p3dOffset=0, p3dUrl=None): """ Called by the browser to specify the p3d file that contains the application itself, along with the web tokens and/or command-line arguments. Once this method has been called, the application is effectively started. """ # One day we will have support for multiple instances within a # Python session. Against that day, we save the instance ID # for this instance. self.instanceId = instanceId self.tokens = tokens self.argv = argv # We build up a token dictionary with care, so that if a given # token appears twice in the token list, we record only the # first value, not the second or later. This is consistent # with the internal behavior of the core API. self.tokenDict = {} for token, keyword in tokens: self.tokenDict.setdefault(token, keyword) # Also store the arguments on sys, for applications that # aren't instance-ready. sys.argv = argv # That means we now know the altHost in effect. self.altHost = self.tokenDict.get('alt_host', None) # Tell the browser that Python is up and running, and ready to # respond to queries. self.notifyRequest('onpythonload') # Now go load the applet. fname = Filename.fromOsSpecific(p3dFilename) vfs = VirtualFileSystem.getGlobalPtr() if not vfs.exists(fname): raise ArgumentError, "No such file: %s" % (p3dFilename) fname.makeAbsolute() fname.setBinary() mf = Multifile() if p3dOffset == 0: if not mf.openRead(fname): raise ArgumentError, "Not a Panda3D application: %s" % ( p3dFilename) else: if not mf.openRead(fname, p3dOffset): raise ArgumentError, "Not a Panda3D application: %s at offset: %s" % ( p3dFilename, p3dOffset) # Now load the p3dInfo file. self.p3dInfo = None self.p3dPackage = None self.p3dConfig = None self.allowPythonDev = False i = mf.findSubfile('p3d_info.xml') if i >= 0 and hasattr(core, 'readXmlStream'): stream = mf.openReadSubfile(i) self.p3dInfo = core.readXmlStream(stream) mf.closeReadSubfile(stream) if self.p3dInfo: self.p3dPackage = self.p3dInfo.FirstChildElement('package') if self.p3dPackage: self.p3dConfig = self.p3dPackage.FirstChildElement('config') xhost = self.p3dPackage.FirstChildElement('host') while xhost: self.__readHostXml(xhost) xhost = xhost.NextSiblingElement('host') if self.p3dConfig: allowPythonDev = self.p3dConfig.Attribute('allow_python_dev') if allowPythonDev: self.allowPythonDev = int(allowPythonDev) guiApp = self.p3dConfig.Attribute('gui_app') if guiApp: self.guiApp = int(guiApp) trueFileIO = self.p3dConfig.Attribute('true_file_io') if trueFileIO: self.trueFileIO = int(trueFileIO) # The interactiveConsole flag can only be set true if the # application has allow_python_dev set. if not self.allowPythonDev and interactiveConsole: raise StandardError, "Impossible, interactive_console set without allow_python_dev." self.interactiveConsole = interactiveConsole if self.allowPythonDev: # Set the fps text to remind the user that # allow_python_dev is enabled. ConfigVariableString('frame-rate-meter-text-pattern').setValue( 'allow_python_dev %0.1f fps') if self.guiApp: init_app_for_gui() self.initPackedAppEnvironment() # Mount the Multifile under self.multifileRoot. vfs.mount(mf, self.multifileRoot, vfs.MFReadOnly) self.p3dMultifile = mf VFSImporter.reloadSharedPackages() self.loadMultifilePrcFiles(mf, self.multifileRoot) self.gotP3DFilename = True self.p3dFilename = fname if p3dUrl: # The url from which the p3d file was downloaded is # provided if available. It is only for documentation # purposes; the actual p3d file has already been # downloaded to p3dFilename. self.p3dUrl = core.URLSpec(p3dUrl) # Send this call to the main thread; don't call it directly. messenger.send('AppRunner_startIfReady', taskChain='default')
def addPackageInfo(self, name, platform, version, hostUrl, hostDir=None, recurse=False): """ Called by the browser for each one of the "required" packages that were preloaded before starting the application. If for some reason the package isn't already downloaded, this will download it on the spot. Raises OSError on failure. """ host = self.getHost(hostUrl, hostDir=hostDir) if not host.hasContentsFile: # Always pre-read these hosts' contents.xml files, even if # we have P3DVCForce in effect, since presumably we've # already forced them on the plugin side. host.readContentsFile() if not host.downloadContentsFile(self.http): # Couldn't download? Must have failed to download in the # plugin as well. But since we launched, we probably have # a copy already local; let's use it. message = "Host %s cannot be downloaded, cannot preload %s." % ( hostUrl, name) if not host.hasContentsFile: # This is weird. How did we launch without having # this file at all? raise OSError, message # Just make it a warning and continue. self.notify.warning(message) if name == 'panda3d' and not self.pandaHostUrl: # A special case: in case we don't have the PackageHostUrl # compiled in, infer it from the first package we # installed named "panda3d". self.pandaHostUrl = hostUrl if not platform: platform = None package = host.getPackage(name, version, platform=platform) if not package: if not recurse: # Maybe the contents.xml file isn't current. Re-fetch it. if host.redownloadContentsFile(self.http): return self.addPackageInfo(name, platform, version, hostUrl, hostDir=hostDir, recurse=True) message = "Couldn't find %s %s on %s" % (name, version, hostUrl) raise OSError, message package.checkStatus() if not package.downloadDescFile(self.http): message = "Couldn't get desc file for %s" % (name) raise OSError, message if not package.downloadPackage(self.http): message = "Couldn't download %s" % (name) raise OSError, message if not package.installPackage(self): message = "Couldn't install %s" % (name) raise OSError, message if package.guiApp: self.guiApp = True init_app_for_gui()
def setP3DFilename(self, p3dFilename, tokens, argv, instanceId, interactiveConsole, p3dOffset = 0, p3dUrl = None): """ Called by the browser to specify the p3d file that contains the application itself, along with the web tokens and/or command-line arguments. Once this method has been called, the application is effectively started. """ # One day we will have support for multiple instances within a # Python session. Against that day, we save the instance ID # for this instance. self.instanceId = instanceId self.tokens = tokens self.argv = argv # We build up a token dictionary with care, so that if a given # token appears twice in the token list, we record only the # first value, not the second or later. This is consistent # with the internal behavior of the core API. self.tokenDict = {} for token, keyword in tokens: self.tokenDict.setdefault(token, keyword) # Also store the arguments on sys, for applications that # aren't instance-ready. sys.argv = argv # That means we now know the altHost in effect. self.altHost = self.tokenDict.get('alt_host', None) # Tell the browser that Python is up and running, and ready to # respond to queries. self.notifyRequest('onpythonload') # Now go load the applet. fname = Filename.fromOsSpecific(p3dFilename) vfs = VirtualFileSystem.getGlobalPtr() if not vfs.exists(fname): raise ArgumentError, "No such file: %s" % (p3dFilename) fname.makeAbsolute() fname.setBinary() mf = Multifile() if p3dOffset == 0: if not mf.openRead(fname): raise ArgumentError, "Not a Panda3D application: %s" % (p3dFilename) else: if not mf.openRead(fname, p3dOffset): raise ArgumentError, "Not a Panda3D application: %s at offset: %s" % (p3dFilename, p3dOffset) # Now load the p3dInfo file. self.p3dInfo = None self.p3dPackage = None self.p3dConfig = None self.allowPythonDev = False i = mf.findSubfile('p3d_info.xml') if i >= 0 and hasattr(core, 'readXmlStream'): stream = mf.openReadSubfile(i) self.p3dInfo = core.readXmlStream(stream) mf.closeReadSubfile(stream) if self.p3dInfo: self.p3dPackage = self.p3dInfo.FirstChildElement('package') if self.p3dPackage: self.p3dConfig = self.p3dPackage.FirstChildElement('config') xhost = self.p3dPackage.FirstChildElement('host') while xhost: self.__readHostXml(xhost) xhost = xhost.NextSiblingElement('host') if self.p3dConfig: allowPythonDev = self.p3dConfig.Attribute('allow_python_dev') if allowPythonDev: self.allowPythonDev = int(allowPythonDev) guiApp = self.p3dConfig.Attribute('gui_app') if guiApp: self.guiApp = int(guiApp) trueFileIO = self.p3dConfig.Attribute('true_file_io') if trueFileIO: self.trueFileIO = int(trueFileIO) # The interactiveConsole flag can only be set true if the # application has allow_python_dev set. if not self.allowPythonDev and interactiveConsole: raise StandardError, "Impossible, interactive_console set without allow_python_dev." self.interactiveConsole = interactiveConsole if self.allowPythonDev: # Set the fps text to remind the user that # allow_python_dev is enabled. ConfigVariableString('frame-rate-meter-text-pattern').setValue('allow_python_dev %0.1f fps') if self.guiApp: init_app_for_gui() self.initPackedAppEnvironment() # Mount the Multifile under self.multifileRoot. vfs.mount(mf, self.multifileRoot, vfs.MFReadOnly) self.p3dMultifile = mf VFSImporter.reloadSharedPackages() self.loadMultifilePrcFiles(mf, self.multifileRoot) self.gotP3DFilename = True self.p3dFilename = fname if p3dUrl: # The url from which the p3d file was downloaded is # provided if available. It is only for documentation # purposes; the actual p3d file has already been # downloaded to p3dFilename. self.p3dUrl = core.URLSpec(p3dUrl) # Send this call to the main thread; don't call it directly. messenger.send('AppRunner_startIfReady', taskChain = 'default')
def addPackageInfo(self, name, platform, version, hostUrl, hostDir = None, recurse = False): """ Called by the browser for each one of the "required" packages that were preloaded before starting the application. If for some reason the package isn't already downloaded, this will download it on the spot. Raises OSError on failure. """ host = self.getHost(hostUrl, hostDir = hostDir) if not host.hasContentsFile: # Always pre-read these hosts' contents.xml files, even if # we have P3DVCForce in effect, since presumably we've # already forced them on the plugin side. host.readContentsFile() if not host.downloadContentsFile(self.http): # Couldn't download? Must have failed to download in the # plugin as well. But since we launched, we probably have # a copy already local; let's use it. message = "Host %s cannot be downloaded, cannot preload %s." % (hostUrl, name) if not host.hasContentsFile: # This is weird. How did we launch without having # this file at all? raise OSError, message # Just make it a warning and continue. self.notify.warning(message) if name == 'panda3d' and not self.pandaHostUrl: # A special case: in case we don't have the PackageHostUrl # compiled in, infer it from the first package we # installed named "panda3d". self.pandaHostUrl = hostUrl if not platform: platform = None package = host.getPackage(name, version, platform = platform) if not package: if not recurse: # Maybe the contents.xml file isn't current. Re-fetch it. if host.redownloadContentsFile(self.http): return self.addPackageInfo(name, platform, version, hostUrl, hostDir = hostDir, recurse = True) message = "Couldn't find %s %s on %s" % (name, version, hostUrl) raise OSError, message package.checkStatus() if not package.downloadDescFile(self.http): message = "Couldn't get desc file for %s" % (name) raise OSError, message if not package.downloadPackage(self.http): message = "Couldn't download %s" % (name) raise OSError, message if not package.installPackage(self): message = "Couldn't install %s" % (name) raise OSError, message if package.guiApp: self.guiApp = True init_app_for_gui()