Welcome!
This is the community forum for my apps Pythonista and Editorial.
For individual support questions, you can also send an email. If you have a very short question or just want to say hello — I'm @olemoritz on Twitter.
How to get key pressing in scene module?
-
@yaley Ho no. This is not so simple. You have to create a custom UIViewController and configure the used methods and protocols. And one method could be the new one which should be called at each key down
You could check this topic where a such ViewController is used with a user method
CustomViewController_touchesBegan_withEvent_
Only to show it is not so easy
-
@cvp ok Thanks for your helping!
-
@yaley Sorry that I can't help more...
-
@cvp oh sorry, i have another question, what are presses and event?
Is presses like [“a”, “b”, “c”] and is event like a function? -
@yaley presses is a set of UIPress objects and event is an UIPressesEvent object. Both are ObjectiveC classes
-
@yaley see Apple doc UIPressesEvent and UIPress
-
@cvp thank you ❤️ you helped me a lot
-
@yaley I hoped that some code like this could work, but not true. Thus, sure this is too complex for me. We will wait availability of @JonB
from objc_util import * import ui UIViewController = ObjCClass('UIViewController') # Some callback definitions used by create_objc_class def pressesBegan_withEvent(_cmd, _presses, _event): print('pressesBegan_withEvent') presses = ObjCInstance(_presses) # The main class... class MyView(ui.View): def __init__(self): super().__init__(self) self.background_color = 'gray' @on_main_thread def initialize(self): v = ui.View() v.frame = self.frame tf = ui.TextField() tf.frame = (10,10,200,32) v.add_subview(tf) vo = ObjCInstance(v) #print(vo) #print(dir(vo)) # set up the custom view controller methods = [pressesBegan_withEvent] protocols = [] CustomViewController = create_objc_class('CustomViewController', UIViewController, methods=methods, protocols=protocols) cvc = CustomViewController.alloc().init() cvc.view = vo # internal scheming... self_objc = ObjCInstance(self) self_objc.nextResponder().addChildViewController_(cvc) self_objc.addSubview_(vo) cvc.didMoveToParentViewController_(self_objc) tf.begin_editing() if __name__ == '__main__': v = MyView() v.present('fullscreen') v.initialize()
-
@cvp it doesn’t work….. but really thanks for your helping
-
-
I don't have an iOS device with me for a few more days...but I suspect this only works with Bluetooth keyboard, and in view controllers without textfields. If you begin_editing, the textfields will become first responder, and steal any keystrokes.
-
@JonB I've tried with Bluetooth keyboard (my Mac's one) and with another view controller without TextField, without success (this script where I've added this method
# Some callback definitions used by create_objc_class def pressesBegan_withEvent(_cmd, _presses, _event): print('pressesBegan_withEvent') presses = ObjCInstance(_presses) . . . methods = [share, goBack, goForward, searchBarSearchButtonClicked_, pressesBegan_withEvent]
-
@JonB said
I don't have an iOS device with me for a few more days
No stress, enjoy a life without iDevice
-
@cvp Can you make me an working example, please?
-
-
@JonB I also have tried this code, always without success
from objc_util import * import ui UIViewController = ObjCClass('UIViewController') # Some callback definitions used by create_objc_class def pressesBegan_withEvent(_cmd, _presses, _event): print('pressesBegan_withEvent') presses = ObjCInstance(_presses) # The main class... class MyView(ui.View): def __init__(self): super().__init__(self) self.background_color = 'gray' @on_main_thread def initialize(self): # set up the custom view controller methods = [pressesBegan_withEvent] protocols = [] CustomViewController = create_objc_class('CustomViewController', UIViewController, methods=methods, protocols=protocols) cvc = CustomViewController.alloc().init() #The first thing you'll need is a view controller you can present from. In most cases, the root view controller of the key window will do. You can get it like this: root_vc = UIApplication.sharedApplication().keyWindow().rootViewController() #Note however that presenting from the root view controller will fail if it is already presenting some other view controller. This may be the case if the settings are shown or something like that. You could get around it like this: while root_vc.presentedViewController(): root_vc = root_vc.presentedViewController() #Once you have a presenting view controller, you can call presentViewController_animated_completion_: root_vc.presentViewController_animated_completion_(cvc, True, None) #For now, just always pass None for the completion parameter. animated can be True or False, depending on whether you want a transition animation. #You can tweak the presentation by setting your view controller's modalPresentationStyle and modalTransitionStyle properties. E.g. to present the view controller in the "form sheet" style, use cvc.setModalPresentationStyle_(2) if __name__ == '__main__': v = MyView() v.present('fullscreen') v.initialize()
-
@cvp I think the signature needs to include TWO dummy arguments:
pressesBegan_withEvent(_self, _sel, presses, Event)
What happens if you create a generic responder, with no overloaded methods, then check the .encoding of that method, along with beginTouches_withEvent, which should look thr same.
-
@JonB said
pressesBegan_withEvent(_self, _sel, presses, Event)
I had already tried that but it gives an error
ValueError: <function pressesBegan_withEvent at 0x117d28158> has 4 arguments (expected 3)
-
@JonB said
What happens if you create a generic responder, with no overloaded methods, then check the .encoding of that method, along with beginTouches_withEvent, which should look thr same.
Sorry, but I don't know how to do that
-
@cvp what about if you try
def pressesBegan_withEvent_(_self, _cmd, presses, Event):
(Note trailing underscore)
Also, in console, try checking
cvc.touchesBegan_withEvent_.encoding
Then compare that to your new responder's ```
pressesBegan_withEvent_.encoding