在kivy中,如何控制TextInput使用的VKeyboard的高度

时间:2017-01-09 23:58:03

标签: python kivy

我有一个屏幕,我想问一个问题,所以用kv语言,我有

Screen:
        name: 'keyb'
        BoxLayout:
            orientation: 'vertical'
            Label:
                id: rnl
                size_hint_y: .1
                text: ''
            TextInput:
                id: tinput
                hint_text: '.mid'
                size_hint: (.8, .1)
                pos_hint: {'x': .1}
                multiline: False
                on_focus: root.focusCallback(args[1])
            Widget:
                size_hint_y: .7

当我想问这个问题时,我选择了屏幕并将焦点设置为TextInput

 self.tinput.text = ""
 self.screens.current = 'keyb'
 Clock.schedule_once(self.focusKbd, .1)

然后级联这段代码:

def focusKbd(self, x):
    self.tinput.focus = True
def focusCallback(self, f):
    if not f:
        # Deal with input now
        self.screens.current = 'seq'

在此代码的某处,我想

  1. 选择要弹出TextInput的VKeyboard布局(在我的代码的其他部分会有所不同)
  2. 调整VKeyboard的高度。
  3. 我不明白文字输入中VKeyboard的来源;有什么方法可以从TextInput获取对它的引用吗?

    这是对https://stackoverflow.com/questions/36414654/how-can-i-change-the-size-of-kivys-vkeyboard的重述。那里有一个暗示,但还不足以让我离开!

    *********************编辑:************************ **

    试图理解Tshirtman的答案,我把它放在主要小部件的顶部:

    Window.set_vkeyboard_class(get_vkeyboard())
    

    然后添加

    def get_vkeyboard():
        print '>>>>>>>>>>>>>>>>>>>>>>>>>>in get_vkeyboard'
        return VKeyboard
    

    我发现在我需要键盘之前很久就调用了get_vkeyboard()。因此,我似乎无法在get_vkeyboard()中动态控制VKeyboard的外观。如果我感到困惑,请纠正我(我无疑是这样!)。

    还有其他方法可以动态修改VKeyboard的外观吗?

    P.S。焦点行为似乎有一个暗示:

      

    input_type是一个OptionsProperty,默认为'text'。可以是其中之一   'text','number','url','mail','datetime','tel'或'address'。

    我添加了" input_type:' number'"到.kv中的TextInput,但它没有任何影响。

1 个答案:

答案 0 :(得分:0)

您可以使用Window.set_vkeyboard_class设置键盘类,但没有什么可以阻止您注册任何返回键盘实例的函数,因此您可以使用上下文(您的应用程序的状态)来决定哪个类将动态使用。由于您在这种情况下自己返回实例,因此您可以决定其大小,位置和其他详细信息。我在一些应用程序中使用了这种技术,在实例上使用动画将它平滑地放置在屏幕的特定位置。

伪示例:

from kivy.core.window import Window
from kivy.uix.vkeyboard import VKeyboard
from kivy.animation import Animation
from kivy.uix.screenmanager import ScreenManager, Screen

class KeyboardA(VKeyboard):
    def place(self):
        self.center_x = Window.center_x
        self.top = 0
        Animation(y=100, t='out_elastic', d=.4).start(self)

class KeyboardB(VKeyboard):
     def place(self):
        self.opacity = 0
        Animation(opacity=1).start(self)

class MyApp(App):
     def build(self):
         sm = ScreenManger()
         sm.add_widget(Screen(name='a'))
         sm.add_widget(Screen(name='b'))
         return sm

     def get_keyboard(self, **kwargs):
         if self.root.current == 'a':
             kb = KeyboardA(**kwargs)

         else:
             kb = KeyboardB(**kwargs)

         kb.place()
         return kb

Window.set_vkeyboard_class(app.get_keyboard)

未经测试,但你应该明白这一点。