如何将小部件尺寸传递给 __init__
how to pass widget dimensions to __init__
如果这个问题有明显的答案,我深表歉意,但我已经有一段时间找不到解决方案了。我的应用程序中的一个小部件有一个 'graph' 是根据小部件的尺寸定义的。我可以从 kv 动态更新 'graph' 因为我可以在那里访问小部件的尺寸。但是,我想定义一个默认值 'graph',也是根据小部件的大小,它出现在启动时。我不知道如何将小部件的尺寸传递给 __init__ 函数。这是我总结的例子:
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.lang import Builder
from kivy.properties import ListProperty
Builder.load_string('''
#:kivy 1.9.2
<MainWidget>:
BoxLayout:
size_hint_x: 20
orientation: 'vertical'
ToggleButton:
text: 'WF1'
state: 'down'
allow_no_selection: False
on_press:
root.line_points = [waveform.x, waveform.top, waveform.right, waveform.y]
root.event_handler()
group: 'lhs_buttons'
ToggleButton:
text: 'WF2'
allow_no_selection: False
on_press:
root.line_points = [waveform.x, waveform.y, waveform.right, waveform.top]
root.event_handler()
group: 'lhs_buttons'
BoxLayout:
size_hint_x: 80
Button:
id: waveform
canvas:
Line:
points: root.line_points
''')
class MainWidget(BoxLayout):
line_points = ListProperty()
def __init__(self, **kwargs):
super(MainWidget, self).__init__(**kwargs)
#self.line_points = [waveform.x, waveform.top, waveform.right, waveform.y]
def event_handler(self):
print "event"
class MyApp(App):
def build(self):
return MainWidget()
if __name__ == '__main__':
MyApp().run()
我想部分解决方案是在 __init__ 中为其中一个按钮触发 on_press 事件,但我一直无法弄清楚该怎么做。我是 Python 和 Kivy 的新手。
一种方法是像这样绑定 line_points:
<MainWidget>:
line_points: self.calc_line_points(waveform.x, waveform.y, waveform.right, waveform.top)
...
和calc_line_points将被定义为:
def calc_line_points(self, x, y, right, top):
return [ x, top, right, y] #put more logic here ...
如果这个问题有明显的答案,我深表歉意,但我已经有一段时间找不到解决方案了。我的应用程序中的一个小部件有一个 'graph' 是根据小部件的尺寸定义的。我可以从 kv 动态更新 'graph' 因为我可以在那里访问小部件的尺寸。但是,我想定义一个默认值 'graph',也是根据小部件的大小,它出现在启动时。我不知道如何将小部件的尺寸传递给 __init__ 函数。这是我总结的例子:
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.lang import Builder
from kivy.properties import ListProperty
Builder.load_string('''
#:kivy 1.9.2
<MainWidget>:
BoxLayout:
size_hint_x: 20
orientation: 'vertical'
ToggleButton:
text: 'WF1'
state: 'down'
allow_no_selection: False
on_press:
root.line_points = [waveform.x, waveform.top, waveform.right, waveform.y]
root.event_handler()
group: 'lhs_buttons'
ToggleButton:
text: 'WF2'
allow_no_selection: False
on_press:
root.line_points = [waveform.x, waveform.y, waveform.right, waveform.top]
root.event_handler()
group: 'lhs_buttons'
BoxLayout:
size_hint_x: 80
Button:
id: waveform
canvas:
Line:
points: root.line_points
''')
class MainWidget(BoxLayout):
line_points = ListProperty()
def __init__(self, **kwargs):
super(MainWidget, self).__init__(**kwargs)
#self.line_points = [waveform.x, waveform.top, waveform.right, waveform.y]
def event_handler(self):
print "event"
class MyApp(App):
def build(self):
return MainWidget()
if __name__ == '__main__':
MyApp().run()
我想部分解决方案是在 __init__ 中为其中一个按钮触发 on_press 事件,但我一直无法弄清楚该怎么做。我是 Python 和 Kivy 的新手。
一种方法是像这样绑定 line_points:
<MainWidget>:
line_points: self.calc_line_points(waveform.x, waveform.y, waveform.right, waveform.top)
...
和calc_line_points将被定义为:
def calc_line_points(self, x, y, right, top):
return [ x, top, right, y] #put more logic here ...