Оба кода не эквивалентны, в случае с python вы только устанавливаете, что позиция линии основана на центре виджета в то время, то есть в начале, а не в .kv, это указываетчто позиция линии всегда будет относительно центра виджета.
TL;DR;
Объяснение:
В kv привязка является естественным и неявным процессом, который в python не делает, кроме того, что его реализация проще, например, следующий код:
Foo:
property_i: other_object.property_j
В этом случае его эквивалент в python:
foo = ...
other_object = ...
other_object.bind(property_j=foo.setter("property_i"))
И это не так:
foo.property_i = other_object.property_j
Поскольку с привязкой вы указываете перед изменением property_j
обновить property_i
этим значением, но в последнем коде, который вы указали только в этот момент, скопируйте значение property_j
в property_i
.
В вашем конкретном случае центр, который вы выбираете, находится передотображая виджет и киви, принимая во внимание конфигурации по умолчанию и другие свойства, изменяет геометрию виджета после его отображения.
Решение
Внесение необходимых изменений с учетом предыдущего объяснения следующеекод является эквивалентом кода .kv
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.graphics import Line
class TestWidget(Widget):
def __init__(self, **kwargs):
super(TestWidget, self).__init__(**kwargs)
with self.canvas:
self.line = Line(width=2)
self.bind(center=lambda *args: self.draw())
def draw(self):
self.line.points = [
self.center_x,
self.center_y,
self.center_x,
self.center_y + 100,
]
class TestApp(App):
def build(self):
test = TestWidget()
return test
if __name__ == "__main__":
TestApp().run()