2017-01-09 3 views
1

У меня есть экран, где я хочу задать вопрос, так на языке кв, у меня естьВ kivy, Как я могу контролировать высоту VKeyboard используемой TextInput

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. Выберите который VKeyboard макет по TextInput будет выскакивать (и это будет отличаться в других частях моего кода)
  2. Отрегулировать высоту VKeyboard.

Я не понимаю, откуда находится VKeyboard в Text Input; есть ли способ получить ссылку на него из 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() был вызванный немедленно, задолго до того, как мне понадобилась клавиатура. Похоже, что я не смогу что-либо контролировать по внешнему виду VKeyboard в get_vkeyboard(). Пожалуйста, поправьте меня, если я запутался (что я, безусловно, есть!).

Есть ли другой способ изменить внешний вид VKeyboard динамически?

P.S. Кажется, есть намек на Фокусное поведение:

input_type - это OptionProperty и по умолчанию используется текст. Может быть одним из 'text', 'number', 'url', 'mail', 'datetime', 'tel' или 'address'.

Я добавил «input_type: 'number» в TextInput в .kv, но это не повлияло.

+0

Тип ввода более подходит для таких платформ, как android, которые предоставляют встроенную клавиатуру (не kivy vkeyboard) с несколькими макетами в зависимости от использования. – Tshirtman

ответ

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) 

тестировался, но вы должны получить идею.

+0

Я все еще пытаюсь понять это, но я подозреваю, что последняя строка должна быть чем-то вроде Window.set_vkeyboard_class (app.get_keyboard()), и она должна быть включена в код где-то, например, в build() – rich

+0

Ouch, почти , крепление. – Tshirtman

Смежные вопросы