How to center text horizontally when entering Kivy text?

I want to center one line of text while entering text in Kivy. I'm going to use a gasket

widget.padding = [ (self.textinput.width - width of line) / 2, 20, 0, 0] 

but I can not find the line width. How can I calculate or access the line width? enter image description here

+5
source share
3 answers

There is an internal TextInput._get_text_width method that you can use to calculate the correct fill:

 from kivy.app import App from kivy.uix.floatlayout import FloatLayout from kivy.lang import Builder Builder.load_string(''' <MyWidget>: TextInput: multiline: False on_text: root.update_padding(args[0]) padding_x: self.width/2 # initial padding ''') class MyWidget(FloatLayout): def update_padding(self, text_input, *args): text_width = text_input._get_text_width( text_input.text, text_input.tab_width, text_input._label_cached ) text_input.padding_x = (text_input.width - text_width)/2 class MyApp(App): def build(self): return MyWidget() if __name__ == '__main__': MyApp().run() 
+3
source

The solution above almost worked for me. Sometimes the filling was not updated correctly. Here is my small change setting text_width as a numeric property:

In Qiwi:

 < CenteredTextInput@TextInput >: multiline: False on_text: root.update_padding() padding_x: (self.width - self.text_width) / 2 

In Python:

 class CenteredTextInput(TextInput): ''' A centered TextInput. ''' text_width = NumericProperty() '''The text width ''' def update_padding(self, *args): ''' Update the padding so the text is centered ''' self.text_width = self._get_text_width( self.text, self.tab_width, self._label_cached ) 
+3
source

You can make textinput behind the button and make the button render as text input.

When you click a button, put the focus in the text line and refresh the button text.

I gave an example here.

 from kivy.uix.textinput import TextInput from kivy.uix.boxlayout import BoxLayout from kivy.uix.floatlayout import FloatLayout from kivy.uix.button import Button from kivy.uix.label import Label from kivy.clock import Clock from kivy.app import App from kivy import require require('1.9.1') class MyWidget(BoxLayout): def __init__(self,**kwargs): super(MyWidget,self).__init__(**kwargs) self.orientation = "vertical" self.cur = False self.textinput = TextInput(text='',halign="center",multiline=False) self.textinput.bind(text=self.on_text) self.button = Button(background_normal="",background_color=[0,0,0.1,1],font_size="40sp") self.button.bind(on_release=self.button_click) self.my_float_layout = FloatLayout() self.my_float_layout.add_widget(self.textinput) self.my_float_layout.add_widget(self.button) self.add_widget(Label(text="type text below",font_size="40sp")) self.add_widget(self.my_float_layout) Clock.schedule_interval(self.cursor, 0.5) def cursor(self,dt): # function to visualize a cursor if self.textinput.focus: cur_pos = self.textinput.cursor[0] if not self.cur: self.button.text = self.textinput.text[:cur_pos] + "|" + self.textinput.text[cur_pos:] self.cur = True else: self.button.text = self.textinput.text[:cur_pos] + " " + self.textinput.text[cur_pos:] self.cur = False elif self.cur: self.button.text = self.textinput.text + " " self.cur = False def on_text(self, *args): # function to set the button text self.button.text = self.textinput.text def button_click(self,*args): # function to focus the input self.textinput.focus = True class MyApp(App): def build(self): return MyWidget() if __name__ == "__main__": MyApp().run() 
+2
source

All Articles