Forum Archive

Disable on screen printing in Scene/SceneView

Oscar

I've looked but I can't find anything about this. Does anyone know if there is a way to disable the on screen printing in a Scene/SceneView?

I'm referring to this: For debugging purposes, a SceneView will show standard output and exceptions in a “status line” at the bottom, so you can use print statements during development, even if your scene covers the whole screen.

(Actually this is only documented in SceneView, even though the feature is available when using Scene.run() to show a Scene. )

Sometimes printing stuff when running a script is useful, even when you don't want to see it directly on screen.

omz

There isn't really a supported way to turn this off, but you could do it via ObjC by putting something like this in your setup method:

from objc_util import ObjCInstance
ObjCInstance(self.view).statusLabel().alpha = 0
Oscar

Not only is Pythonista amazing, the level of support is equally crazy! Thank you @omz.

ObjC is nifty for all sorts of things.

robnee

Can one also disable, move or alter the application close "X" in SceneView using a similar technique?

ccc

@robnee View.present(hide_title_bar=True) ?

robnee

I should have mentioned that I am using Pythonista 3.0. I thought the hide_title_bar trick only worked in 2.0? I'll have to try...

Webmaster4o

@robnee if you're using ui, it's the same.

robnee

hide_title_bar doesn't seem to work for me. I stripped it down to the example below. Am I doing something silly? I still get the close X in the upper right. I've even tried to figure this out by looking at the scene module source but no luck so I thought I'd ask here.

from scene import *

def run2(scn):
    sv = SceneView()
    sv.scene = scn
    sv.present(hide_title_bar=True)

run2(Scene())
abcabc

SceneView may override some of the attributes. May be try this.

import scene, ui

class MyScene(scene.Scene):
    def setup(self):
        self.label = scene.LabelNode('Test hide title bar', 
        position=self.size/2, parent=self)

#scene.run(MyScene())

'''
# This does not hide the close button
scene_view = scene.SceneView()
scene_view.scene = MyScene()
scene_view.present('fullscreen', hide_title_bar=True)
'''

# This works
v = ui.View()
scene_view = scene.SceneView()
scene_view.flex= 'WH'
scene_view.scene = MyScene()
v.add_subview(scene_view)
v.present('fullscreen', hide_title_bar=True)

robnee

abcabc, this does work although it's not exactly what I want because now the iOS titlebar is visible.

In the spirit of the answer to the original question I have managed to hack together a solution. It's ugly but I'm sure someone with more iOS and objective C experience can improve it. hide_close can both hide and show the close button. Note: once hidden the two finger swipe down does not seem to work so there is no way to close the scene.

class MyScene(scene.Scene):
    def setup(self):
        self.label = scene.LabelNode('Test hide title bar', 
        position=self.size/2, parent=self)
        self.hide_close()

    def hide_close(self, state=True):
        from obj_util import ObjCInstance
        v = ObjCInstance(self.view)
        # Find close button.  I'm sure this is the worst way to do it
        for x in v.subviews():
            if str(x.description()).find('UIButton) >= 0:
                x.setHidden(state)

scene.run(MyScene())

abcabc

You can add a line to hide the ios status bar (discussed in a separate thread few days before) and you could have your own button to close the view. Here is the code to do these things.

Your solution also looks good.

import scene, ui
from objc_util import UIApplication

def close_view():
    v.close() 

class MyScene(scene.Scene):
    def setup(self):
        self.test_label = scene.LabelNode('Test hide title bar', 
            position=self.size/2.0, parent=self)
        self.close_label = scene.LabelNode('Close view',
            position=(self.size[0]/2, self.size[1]/2-100),
            parent=self)

    def touch_began(self, touch):
        if touch.location in self.close_label.frame:
            close_view()

w, h = ui.get_window_size()
frame = (0, 0, w, h)
v = ui.View(frame=frame)
scene_view = scene.SceneView(frame=frame)
scene_view.flex= 'WH'
scene_view.scene = MyScene()
v.add_subview(scene_view)                
v.present('fullscreen', hide_title_bar=True)
UIApplication.sharedApplication().statusBar().hidden = True


robnee

abcabc,

Interesting. I will give this a try as well. Thanks for your help!

Being able to twiddle with the objective C under the hood in Pythonista is fascinating.

Rob