在猕猴桃中,如何控制TextInput使用的VKeyboard的高度 [英] In kivy, How can I control the height of the VKeyboard used by TextInput

查看:62
本文介绍了在猕猴桃中,如何控制TextInput使用的VKeyboard的高度的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have a Screen where I want to ask a question, so in the kv language, I have

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

When I want to ask the question, I select the screen and set the focus to the TextInput

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

然后通过以下代码进行级联:

which then cascades through this code:

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获得对其的引用?

I don't understand where the VKeyboard comes from in Text Input; is there some way I can get a reference to it from the TextInput?

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

This is a restatement of https://stackoverflow.com/questions/36414654/how-can-i-change-the-size-of-kivys-vkeyboard There is a hint there, but not enough to get me going!

********************************************* **

********************* **************************

试图理解Tshirtman的答案,我将其放在主窗口小部件的顶部:

Trying to understand the answer from Tshirtman, I put this at the top of my main widget:

Window.set_vkeyboard_class(get_vkeyboard())

然后添加

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

我发现get_vkeyboard()在需要键盘之前就被立即调用.因此,似乎我将无法在get_vkeyboard()中动态控制有关VKeyboard外观的任何内容.如果我感到困惑,请纠正我(我无疑是!).

I found that get_vkeyboard() was called immediately, long before I needed a keyboard. So it seems that I'm not going to be able to control anything about the appearance of the VKeyboard dynamically in get_vkeyboard(). Please correct me if I'm confused (which I undoubtedly am!).

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

Is there some other way to modify the appearance of the VKeyboard dynamically?

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

P.S. There seems to be a hint in Focus Behavior:

input_type是一个OptionsProperty,默认为文本".可以是以下之一 文本",数字","URL",邮件",日期时间",电话"或地址".

input_type is an OptionsProperty and defaults to ‘text’. Can be one of ‘text’, ‘number’, ‘url’, ‘mail’, ‘datetime’, ‘tel’ or ‘address’.

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

I added "input_type: 'number'" to a TextInput in .kv, but it didn't have any affect.

推荐答案

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

You can set keyboard class using Window.set_vkeyboard_class, but nothing prevents you from registering any function that returns a keyboard instance there, so you could use the context (your app's state) to decide which class will be used, dynamically. Since you are returning an instance yourself in this case, you can decide of its size, pos, and other details. I used this technique in a few app to use Animation on the instance to place it in a particular spot of the screen smoothly.

伪示例:

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)

未经测试,但您应该明白.

untested, but you should get the idea.

这篇关于在猕猴桃中,如何控制TextInput使用的VKeyboard的高度的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆