kivtテキスト入力で1行のテキストを中央に配置したい。 私はパディングkivyテキスト入力でテキストを水平に中央に配置する方法は?
widget.padding = [ (self.textinput.width - width of line)/2, 20, 0, 0]
を使用するつもりですが、私はラインの幅を見つけることができません。どのように計算したり、線の幅に達することができますか?
kivtテキスト入力で1行のテキストを中央に配置したい。 私はパディングkivyテキスト入力でテキストを水平に中央に配置する方法は?
widget.padding = [ (self.textinput.width - width of line)/2, 20, 0, 0]
を使用するつもりですが、私はラインの幅を見つけることができません。どのように計算したり、線の幅に達することができますか?
あなたが適切なパディングを計算するために使用できる内部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()
ボタンの後ろにテキスト入力を作成し、ボタンをテキスト入力として視覚化することができます。
ボタンを押すときに、フォーカスをテキスト入力に置き、ボタンのテキストを更新します。
ここでは例を挙げました。
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()
あなたの答えには大変感謝しています。あなたは本当に創造的です。 – mnrl
@mnrl問題ありません、ありがとうございます。 – EL3PHANTEN
@mnrlここに問題があります。カーソルを左に動かすと、視覚化されたカーソルはそれをしません。私はそれを修正し、答えを更新しようとします。 – EL3PHANTEN
は、上記の溶液はほとんど私のために働きました。時には、パディングが正しく更新されないことがあります。 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
)
あなたは3x3のグリッドレイアウトの中央広場にそれを置くことができれば、私は疑問に思います? – RufusVS