以下是我的kivy应用的截图。我试图让左下方的TextInput
在其所在的BoxLayout
中居中,我不希望它与布局的大小相同,我希望它要小得多。有问题的BoxLayout
位于屏幕的下半部分。我尝试过设置TextInput
s属性center:self.parent.center
,但这不起作用。正如您所看到的,我使用正确的行self.parent.center将BoxLayout
中的中心坐标打印到TextInput
中,并获得了正确的结果。然而,将TextInput
的中心或位置设置为这些坐标并不是它的中心,它不会移动......我做错了什么?
py文件:
import kivy
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.label import Label
from kivy.uix.boxlayout import BoxLayout
class TimeTabler(Widget):
pass
class TimerApp(App):
def build(self):
return TimeTabler()
if __name__ == "__main__":
TimerApp().run()
**** kv档案:****
#:kivy 1.0
BoxLayout:
orientation: 'vertical'
size: root.size
BoxLayout:
orientation: 'vertical'
Label:
text: 'TimeTabler'
BoxLayout:
TextInput:
text: '%s' % (self.parent.center) # why does this work here
size_hint: None, None
width: sp(200)
height: sp(30)
center: self.parent.center # but not here
答案 0 :(得分:2)
您提供了TextInput size_hint: None, None
,因此BoxLayout不会尝试手动为其指定正确的大小,并假设默认大小为100, 100
。只需删除size_hint
行即可修复它。
此外,有几个小部件有像size: self.size
这样的行。这是没有意义的,self
指的是小部件本身,显然该行什么都不做,因为它只是试图将大小设置为它已经是什么。
如果你使TimeTabler继承自BoxLayout而不是Widget,事情也会变得更简单。这样你就不需要手动设置它的儿童BoxLayout的大小。
编辑:看起来我误解了你想要的东西,这里有一个使用AnchorLayout来集中TextInput的例子:
<TimeTabler>
BoxLayout:
orientation: 'vertical'
size: root.size
on_touch_down: print self.pos, self.size
canvas:
Color:
rgba: 0, 1, 1, .3
Rectangle:
size: self.size
pos: self.pos
BoxLayout:
orientation: 'vertical'
size: self.size
Label:
text: 'TimeTabler'
BoxLayout:
id: bl
on_touch_down: print 'center', self.center
canvas:
Color:
rgb: 1,1,1
Line:
rectangle: self.x, self.y, self.width, self.height
AnchorLayout:
TextInput:
size_hint: None, None
text: '%s, %s' % (self.get_center_x(), self.get_center_y())
我认为你的问题是BoxLayout自动设置TextInput的位置,即使它设置自己的大小。解决这个问题的一个简单方法就是在另一个小部件中接下来的TextInput,在这种情况下是一个AnchorLayout,负责为您进行居中。您也可以使用Widget和之前设置TextInput中心的机制。