【问题标题】:Python - Kivy - Builtdozer : Having a button call the android keyboardPython - Kivy - Builtdozer:有一个按钮调用 android 键盘
【发布时间】:2017-07-04 16:57:55
【问题描述】:

框架:我说的是一个用 Python 2.7 编写并使用 Builtdozer 打包的 Android 应用

我在应用程序中有一个带有按钮的生成器

Builder.load_string('''
FloatLayout:
                    orientation: 'horizontal'
                    Button:
                        text: str(root.name)
                        font_size: '20sp'
                        pos_hint: {'x':.0, 'y':.3}
                        size_hint: .4, .8
''')

我想创建一个函数change_name,如果我按下上面的按钮,就会打开安卓键盘来接受用户raw_input

用户提供的raw_input要替换上面按钮的文字。

我的想法是:

1) 创建变量name = StringProperty('Me')

2) 创建函数:

def change_name(self):
    self.name = raw_input()

3) 使用on_release 调用按钮内的函数

Builder.load_string('''
    FloatLayout:
                        orientation: 'horizontal'
                        Button:
                            text: str(root.name)
                            font_size: '20sp'
                            pos_hint: {'x':.0, 'y':.3}
                            size_hint: .4, .8
                            on_release: root.change_name() 
    ''')

正确吗?因为实际上,在 Ubuntu 上运行该应用程序时,我试图单击该按钮,但该应用程序不要求输入(它似乎被阻止)。

因此,我相信它也无法在 Android 上运行。

你能帮我理解我哪里错了吗?

【问题讨论】:

    标签: android python kivy


    【解决方案1】:

    raw_input 允许从 stdin(终端)获取输入。在 Android 上,您将无法使用终端。另外,raw_input正在阻塞,这会导致您的应用程序的主事件循环被冻结并导致您的应用程序停止响应。

    您不应该使用raw_input,而是使用 Kivy 自己的方法。

    另一方面,您想让您的按钮可编辑(就好像它是TextInput)。您可以创建自己的自定义 Button 类或使用 WindowBase.request_keyboard() 手动请求键盘。但是,您可以通过隐藏 TextInput 并使用它来输入文本来做一些小技巧:

    from kivy.app import App
    from kivy.lang import Builder
    from kivy.uix.floatlayout import FloatLayout
    from kivy.uix.textinput import TextInput
    
    kv_text= ('''
    <MyWidget>:
        FloatLayout:
            orientation: 'horizontal'
            Button:
                text: 'Hello'
                font_size: '20sp'
                pos_hint: {'x':.0, 'y':.3}
                size_hint: .4, .8
                on_release: root.change_name(self)
    
            Button:
                text: 'World'
                font_size: '20sp'
                pos_hint: {'x':0.6, 'y':.3}
                size_hint: .4, 0.8
                on_release: root.change_name(self)
    ''')
    
    
    class MyWidget(FloatLayout):
    
        def __init__(self, **kwargs):
            super(MyWidget, self).__init__(**kwargs)
            self.hide_input = TextInput(size_hint=(None,  None),
                                        size = (0, 0),
                                        multiline = False)
            self.hide_input_bind = None
    
        def change_name(self,  instance):
            if self.hide_input_bind:
                self.hide_input.unbind_uid('text',  self.hide_input_bind)
    
            self.hide_input.text = instance.text
            self.hide_input.focus = True
            self.hide_input_bind = self.hide_input.fbind('text',  self._update_text,  instance)
    
        def _update_text(self, button,  instance,  value):
            button.text = value
    
    
    
    class MyKivyApp(App):
        def build(self):
            return MyWidget()
    
    def main():
        Builder.load_string(kv_text)
        app = MyKivyApp()
        app.run()
    
    if __name__ == '__main__':
        main()
    

    适用于 Android 的应用(Kivy Launcher):

    【讨论】:

      猜你喜欢
      • 2021-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-31
      • 1970-01-01
      相关资源
      最近更新 更多