from kivy.app import App
from kivy.uix.popup import Popup
from kivy.uix.widget import Widget
from kivy.uix.dropdown import DropDown
class MyPracticeApp(App):
def build(self):
return Debit()
class Debit(Widget):
def debit(self):
return Hello()
class Hello(Widget):
pass
if __name__ == "__main__":
MyPracticeApp().run()
<Debit>
Button:
text : 'popup'
size_hint : 0.2,0.2
on_press : root.debit()
<Hello>:
Button:
text : 'popup2'
size_hint : 0.2,0.2
# on_press : root.debit()
有一个按钮弹出窗口,当我按下这个按钮时,我正在调用debit()
函数。我在借记函数里面调用Hello()
,但是我无法从这个类中得到任何东西。我究竟做错了什么?
每当我点击一个按钮,我想要一个新的屏幕,但没有屏幕导航。我该怎么做呢 ?
什么是工厂在kivy的概念
当在项目中的任何地方使用关键字Factory
(例如kv文件或Python脚本)时,它将自动注册任何类或模块并实例化它们。
以下示例说明了在kv文件中使用Factory
来注册和实例化Popup
小部件,Hello。 Hello脚本没有类定义,Python脚本中没有方法debit()
的定义。
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.lang import Builder
Builder.load_string("""
#:import Factory kivy.factory.Factory
<Debit>:
Button:
text : 'popup'
size_hint : 0.2,0.2
on_press : Factory.Hello().open()
<Hello@Popup>:
title: 'Popup2'
auto_dismiss: False
BoxLayout:
orientation: 'vertical'
Label:
text: 'Hello Kivy'
Button:
text : 'Close Popup'
size_hint : 1,0.2
on_press : root.dismiss()
""")
class Debit(Widget):
pass
class MyPracticeApp(App):
def build(self):
return Debit()
if __name__ == "__main__":
MyPracticeApp().run()
有一个按钮弹出窗口,当我按下这个按钮时,我正在调用debit()函数。借记函数里面我调用Hello(),但是我无法从这个类中得到任何东西。我究竟做错了什么?
没有显示第二个按钮,因为应用程序没有关于如何处理实例化对象的说明,Hello
包含子窗口小部件Button
。
其中一个解决方案是使用add_widget()
函数添加新对象。
def debit(self):
return self.add_widget(Hello())
每当我点击一个按钮,我想要一个新的屏幕,但没有屏幕导航。我该怎么做呢 ?
你可以使用Kivy Popup
小部件。
from kivy.app import App
from kivy.uix.popup import Popup
from kivy.uix.widget import Widget
from kivy.lang import Builder
Builder.load_string("""
<Debit>:
Button:
text : 'popup'
size_hint : 0.2,0.2
on_press : root.debit()
<Hello>:
title: 'Hello Popup2'
auto_dismiss: False
Button:
text : 'Close Popup'
size_hint : 0.2,0.2
on_press : root.dismiss()
""")
class Debit(Widget):
def debit(self):
return Hello().open()
class Hello(Popup):
pass
class MyPracticeApp(App):
def build(self):
return Debit()
if __name__ == "__main__":
MyPracticeApp().run()
你可以使用ScreenManager
。
一个小例子:
from kivy.app import App
from kivy.lang import Builder
KV = """
#:import NoTransition kivy.uix.screenmanager.NoTransition
BoxLayout:
orientation: "vertical"
Label:
text: "top"
ScreenManager:
id: sm
transition: NoTransition()
Screen:
name: "screen1"
Button:
text: "screen 2"
on_release: sm.current = "screen2"
Screen:
name: "screen2"
Button:
text: "screen 1"
on_release: sm.current = "screen1"
Label:
text: "bottom"
"""
class TestApp(App):
def build(self):
return Builder.load_string(KV)
TestApp().run()