2016-07-17 117 views
5

kivtテキスト入力で1行のテキストを中央に配置したい。 私はパディングkivyテキスト入力でテキストを水平に中央に配置する方法は?

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

を使用するつもりですが、私はラインの幅を見つけることができません。どのように計算したり、線の幅に達することができますか? enter image description here

+0

あなたは3x3のグリッドレイアウトの中央広場にそれを置くことができれば、私は疑問に思います? – RufusVS

答えて

3

あなたが適切なパディングを計算するために使用できる内部TextInput._get_text_width方法があります:

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() 
2

ボタンの後ろにテキスト入力を作成し、ボタンをテキスト入力として視覚化することができます。

ボタンを押すときに、フォーカスをテキスト入力に置き、ボタンのテキストを更新します。

ここでは例を挙げました。

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() 
+0

あなたの答えには大変感謝しています。あなたは本当に創造的です。 – mnrl

+0

@mnrl問題ありません、ありがとうございます。 – EL3PHANTEN

+0

@mnrlここに問題があります。カーソルを左に動かすと、視覚化されたカーソルはそれをしません。私はそれを修正し、答えを更新しようとします。 – EL3PHANTEN

2

は、上記の溶液はほとんど私のために働きました。時には、パディングが正しく更新されないことがあります。 Kivyで

:Pythonで

<[email protected]>: 
    multiline: False 
    on_text: root.update_padding() 
    padding_x: (self.width - self.text_width)/2 

を:ここでNumericPropertyとしてtext_width設定、私のわずかな変化である

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 
     ) 
関連する問題