我正在尝试使用一些自定义小部件来构建一个kivy应用程序。然而,每当我尝试使用它们时,它们永远不会与我的布局一起工作。使用普通按钮:
import kivy
kivy.require('1.8.0')
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.properties import ListProperty
class RootWidget(Widget):pass
class myApp(App):
def build(self):
global rw
rw = RootWidget()
return rw
if __name__ == '__main__':
myApp().run()
#:kivy 1.8.0
<RootWidget>:
BoxLayout:
size: root.size
orientation: 'horizontal'
spacing: 10
padding: 10
Button:
id: abut
text: "Custom Button"
这和预期的一样,我的按钮基本上占据了整个窗口。但是,当我尝试用自定义按钮替换Button时
import kivy
kivy.require('1.8.0')
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.properties import ListProperty
class MyWidget(Widget):
pressed = ListProperty([0, 0])
def on_touch_down(self, touch):
if self.collide_point(*touch.pos):
self.pressed = touch.pos
return True
return super(MyWidget, self).on_touch_down(touch)
def on_pressed(self, instance, pos):
print ('pressed at {pos}'.format(pos=pos))
class RootWidget(Widget):pass
class someApp(App):
def build(self):
global rw
rw = RootWidget()
return rw
if __name__ == '__main__':
someApp().run()
#:kivy 1.8.0
<MyWidget>:
BoxLayout:
orientation: 'horizontal'
spacing: 10
Button:
id: abut
text: "Custom Button"
<RootWidget>:
BoxLayout:
size: root.size
orientation: 'horizontal'
spacing: 10
padding: 10
MyWidget:
它只出现在窗口的左下角,并不像一个按钮。我遗漏了什么?
此外,是否有必要以这种方式创建自定义按钮?kivy教程使用这种方法来制作他们的自定义按钮,但我不能这样做吗
Button:
on_press: root.do_action()
让每个按钮都有不同的行为?
发布于 2014-04-01 22:32:26
您的实际问题是,尽管您的MyWidget
被放置在kv文件中的BoxLayout
中,但它的子BoxLayout
没有将其大小设置为MyWidget
大小,因此仅保持屏幕左下角(100, 100)
的默认大小和位置。
你可以通过给它额外的size: root.size
规则来解决这个问题,就像你在<RootWidget>
规则中所做的那样,或者实际上通常只使用一个BoxLayout (例如,子类BoxLayout
而不是Widget
)更容易,这当然可以免费给你自动调整大小/定位。
此外,正如Joran所说,如果你只是想在按钮被按下的时候做一些事情,你可以使用第二种方法……这就是你想要做的!我不知道你在看什么例子,但你通常不需要像你这样复杂的安排。
您可能还想知道,在最新的发行版(1.8)中,按钮行为已被抽象为一个ButtonBehavior
类,用于适当地处理检测触摸和分派on_press
等。该行为不是一个小部件,所以您可以使用任何其他小部件对其进行子类化,以将任何内容转换为按钮!
https://stackoverflow.com/questions/22796142
复制相似问题