問題描述
我正在嘗試使用一些自定義小部件構建一個 kivy 應用程序.但是,每當我嘗試使用它們時,它們都不會與我的布局一起使用.使用普通按鈕:
I'm trying to build a kivy app using some custom widgets. However whenever I try to use them they never work with my layout. Using a normal 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 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 基本上占據了整個窗口.但是,當我嘗試用我的自定義按鈕替換 Button 時
This works as expected, my Button basically takes up the entire window. However when I try replacing the Button with my custom 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:
它只出現在窗口的左下角,不像一個按鈕.我錯過了什么?
it only appears in the bottom left-hand corner of the window and doesn't behave like a button. What am I missing?
此外,是否有必要以這種方式創建自定義按鈕?kivy 教程使用這種方法來制作他們的自定義按鈕,但我不能只做這樣的事情
Furthermore, is it even necessary to create a custom button this way? The kivy tutorials used this sort of method to make their custom button but can't I just do something like this
Button:
on_press: root.do_action()
讓每個按鈕的行為不同?
to make each button behave differently?
推薦答案
你的實際問題是,雖然你的 MyWidget
放在了 kv 文件中的一個 BoxLayout
中,但它的子 BoxLayout
確實 not 將其大小設置為 MyWidget
大小,因此只保持 (100,100)
在屏幕的左下方.
Your actual problem is that although your MyWidget
is placed in a BoxLayout
in the kv file, its child BoxLayout
does not have its size set to the MyWidget
size, and therefore just maintains the default size and position of (100, 100)
in the bottom left of the screen.
你可以通過給它額外的 size: root.size
規則來解決這個問題,就像你在 <RootWidget>
規則中所做的那樣,或者實際上通常更容易使用 BoxLayout(即子類 BoxLayout
而不是 Widget
)當然可以免費自動調整大小/定位.
You can fix this by giving it the extra size: root.size
rule as you did within the <RootWidget>
rule, or actually normally it's easier to just use a BoxLayout (i.e. subclass BoxLayout
instead of Widget
) which of course gives you the automatic resizing/positioning for free.
另外,正如 Joran 所說,如果您只想在按下按鈕時做某事,您可以使用第二種方法……這就是您想要做的!我不知道你在看什么例子,但你通常不需要像你這樣的復雜安排.
Also, as Joran said, if you just want to do something when the button is pressed you can use the second method...that's what you're intended to do! I don't know what example you are looking at, but you wouldn't normally need a complex arrangement like yours.
您可能還想知道,在最新版本 (1.8) 中,按鈕行為已被抽象為處理檢測觸摸和調度 on_press
的 ButtonBehavior
類等適當.Behavior 不是小部件,因此您可以將其與任何其他小部件子類化以將任何東西變成按鈕!
You might also be interested to know that in the most recent release (1.8) the button behavior has been abstracted to a ButtonBehavior
class that handles detecting touches and dispatching on_press
etc. appropriately. The Behavior isn't a widget, so you can subclass it with any other widget to make anything into a button!
這篇關于使用自定義小部件 kivy的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!