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

3

我有一个屏幕,在这个屏幕上我想问一个问题,因此在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的高度。

我不明白VKeyboard是从TextInput中来的;有没有一种方法可以从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的外观?
附言:焦点行为中似乎有一些提示:
input_type是OptionsProperty,默认为“text”。可以是以下之一:“text”,“number”,“url”,“mail”,“datetime”,“tel”或“address”。
我在.kv文件中的TextInput中添加了“input_type:'number'”,但没有任何影响。

输入类型在像Android这样提供本地键盘(而不是Kivy vkeyboard)的平台上更为相关,具体取决于使用情况的多个布局。 - Tshirtman
1个回答

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)

未经测试,但你应该能理解。


我仍在努力理解这个问题,但我怀疑最后一行应该是类似于Window.set_vkeyboard_class(app.get_keyboard())的内容,并且应该在代码中的某个位置包含它,比如在build()函数中。 - rich
哎呀,差点儿了,修复中。 - Tshirtman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接