我有一个屏幕,我想问一个问题,所以用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'
在此代码的某处,我想
我不明白文字输入中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,但它没有任何影响。
答案 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)
未经测试,但你应该明白这一点。