问题
I am trying to display numeric keyboard in bubble for TextInput in Kivy. Is it possible? So far I have:
Builder.load_string('''
<NumericKeyboard>
size_hint: (None, None)
size: (160, 120)
pos_hint: {'center_x': .5, 'y': .6}
BubbleButton:
text: 'Cut'
BubbleButton:
text: 'Copy'
BubbleButton:
text: 'Paste'
''')
class NumericKeyboard(Bubble):
pass
class CustomTextInput(TextInput):
def __init__(self, **kwargs):
super(CustomTextInput, self).__init__(**kwargs)
def on_focus(self, instance, value):
self.bubb = NumericKeyboard()
self.add_widget(self.bubb)
But the bubble will not display.
回答1:
Yes, it is possible to display numeric key pad using Kivy Bubble for TextInput widget. Please refer to the example below for details.
Note: The text input is not filtered.
Example
main.py
from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.bubble import Bubble, BubbleButton
from kivy.uix.label import Label
from kivy.properties import ObjectProperty
from kivy.lang import Builder
class CustomBubbleButton(BubbleButton):
pass
class NumericKeyboard(Bubble):
layout = ObjectProperty(None)
def __init__(self, **kwargs):
super(NumericKeyboard, self).__init__(**kwargs)
self.create_bubble_button()
def create_bubble_button(self):
numeric_keypad = ['7', '8', '9', '4', '5', '6', '1', '2', '3', '', '0', '.']
for x in numeric_keypad:
if len(x) == 0:
self.layout.add_widget(Label(text=""))
else:
bubb_btn = CustomBubbleButton(text=str(x))
self.layout.add_widget(bubb_btn)
class BubbleShowcase(FloatLayout):
text_input = ObjectProperty(None)
def show_bubble(self, *l):
if not hasattr(self, 'bubb'):
self.bubb = bubb = NumericKeyboard()
self.bubb.arrow_pos = "bottom_mid"
self.add_widget(bubb)
Builder.load_file("test.kv")
class TestBubbleApp(App):
title = "Numeric Key Pad - Using Bubble"
def build(self):
return BubbleShowcase()
if __name__ == '__main__':
TestBubbleApp().run()
test.kv
#:kivy 1.10.0
<CustomBubbleButton>:
on_release:
app.root.text_input.text += self.text
<NumericKeyboard>:
layout: layout
size_hint: (None, None)
size: (160, 120)
pos_hint: {'center_x': .5, 'y': .6}
GridLayout:
id: layout
cols: 3
<BubbleShowcase>:
text_input: text_input
canvas:
Color:
rgba: 0, 1, 1, 1
Rectangle:
size: self.width, self.height
TextInput:
id: text_input
pos_hint: {'center_x': .5, 'y': .54}
size_hint: (0.2, 0.06)
cursor_blink: True
font_size: 20
multiline: False
on_focus:
root.show_bubble()
Output
回答2:
You cannot add a widget to a text input because it is not a layout. You should add your text input to a layout then add your bubble to this layout. Try this:
from kivy.app import App
from kivy.uix.bubble import Bubble
from kivy.uix.textinput import TextInput
from kivy.lang import Builder
from kivy.uix.floatlayout import FloatLayout
Builder.load_string('''
<NumericKeyboard>
size_hint: (None, None)
size: (160, 120)
pos_hint: {'center_x': .5, 'y': .6}
BubbleButton:
text: 'Cut'
BubbleButton:
text: 'Copy'
BubbleButton:
text: 'Paste'
''')
class NumericKeyboard(Bubble):
pass
class CustomTextInputLayout(FloatLayout):
def __init__(self, **kwargs):
super(CustomTextInputLayout, self).__init__(**kwargs)
self.add_widget(CustomTextInput(self))
class CustomTextInput(TextInput):
def __init__(self, layout,**kwargs):
super(CustomTextInput, self).__init__(**kwargs)
self.layout = layout
def on_focus(self, instance, value):
self.bubb = NumericKeyboard()
self.layout.add_widget(self.bubb)
class MyTestApp(App):
def build(self):
return CustomTextInputLayout()
if __name__ == '__main__':
MyTestApp().run()
来源:https://stackoverflow.com/questions/47552735/kivy-python-textinput-display-bubble