2024-06-26 16:58:07 发布
网友
我想知道如何使用绑定到按钮的on_press事件来更改屏幕,而不使用KV file/KV语言。
我已经阅读了Kivy文档,但是只能使用一个KV文件找到解决方案。
示例:
on_press: root.manager.current = 'screen2'
我还可以使用以下命令更改主python文件中的屏幕:
screenmanager.current = 'screen2'
但我不知道怎么用按钮来实现同样的效果。
另一个解决方案是,使用EventDispatcher的setter方法,来获取对screen\u manager.current的setter函数的引用
setter
button.bind(on_press=partial(sm.setter('current'), (sm, 'whatever'))
当然,这不是很性感,这就是为什么千伏往往是一个更清洁的解决方案,但它应该工作。
注:如果您不知道,那么partial来自functools模块,使用预加载的参数构建此类回调通常很有用。
partial
functools
一个有两个屏幕的工作示例,没有用Python完成的所有kv文件:
import kivy kivy.require('1.8.0') from kivy.app import App from kivy.uix.screenmanager import Screen, ScreenManager from kivy.uix.boxlayout import BoxLayout from kivy.uix.label import Label from kivy.uix.button import Button from kivy.properties import ObjectProperty class ScreenOne(Screen): def __init__ (self,**kwargs): super (ScreenOne, self).__init__(**kwargs) my_box1 = BoxLayout(orientation='vertical') my_label1 = Label(text="BlaBlaBla on screen 1", font_size='24dp') my_button1 = Button(text="Go to screen 2",size_hint_y=None, size_y=100) my_button1.bind(on_press=self.changer) my_box1.add_widget(my_label1) my_box1.add_widget(my_button1) self.add_widget(my_box1) def changer(self,*args): self.manager.current = 'screen2' class ScreenTwo(Screen): def __init__(self,**kwargs): super (ScreenTwo,self).__init__(**kwargs) my_box1 = BoxLayout(orientation='vertical') my_label1 = Label(text="BlaBlaBla on screen 2",font_size='24dp') my_button1 = Button(text="Go to screen 1",size_hint_y=None, size_y=100) my_button1.bind(on_press=self.changer) my_box1.add_widget(my_label1) my_box1.add_widget(my_button1) self.add_widget(my_box1) def changer(self,*args): self.manager.current = 'screen1' class TestApp(App): def build(self): my_screenmanager = ScreenManager() screen1 = ScreenOne(name='screen1') screen2 = ScreenTwo(name='screen2') my_screenmanager.add_widget(screen1) my_screenmanager.add_widget(screen2) return my_screenmanager if __name__ == '__main__': TestApp().run()
实现这一点的一个简单方法是定义自己的按钮子类:
class ScreenButton(Button): screenmanager = ObjectProperty() def on_press(self, *args): super(ScreenButton, self).on_press(*args) self.screenmanager.current = 'whatever'
当按下按钮时,会自动调用on press方法,因此屏幕管理器的current属性将被更改。
current
然后你可以有如下代码:
sm = ScreenManager() sc1 = Screen(name='firstscreen') sc1.add_widget(ScreenButton(screenmanager=sm)) sc2 = Screen(name='whatever') sc2.add_widget(Label(text='another screen')) sm.add_widget(sc1) sm.add_widget(sc2)
点击按钮应根据需要切换屏幕。
另一种方法(这可能就是kv语言的实际工作方式)是手动使用bind方法。
bind
def switching_function(*args): some_screen_manager.current = 'whatever' some_button.bind(on_press=switching_function)
这意味着只要按下some_button,就会调用switching_function。当然,在定义函数的方式和时间上有很大的灵活性,所以(例如)可以做一些更一般的事情,比如将screenmanager作为函数的第一个参数传递给函数。
some_button
switching_function
我没有测试这段代码,它也不是一个完整的应用程序,但希望意义是明确的。无论哪种方法都应该很好,你可以选择看起来最明智的方法。以后我可能会构造一个更完整的示例。
另一个解决方案是,使用EventDispatcher的
setter
方法,来获取对screen\u manager.current的setter函数的引用当然,这不是很性感,这就是为什么千伏往往是一个更清洁的解决方案,但它应该工作。
注:如果您不知道,那么
partial
来自functools
模块,使用预加载的参数构建此类回调通常很有用。一个有两个屏幕的工作示例,没有用Python完成的所有kv文件:
实现这一点的一个简单方法是定义自己的按钮子类:
当按下按钮时,会自动调用on press方法,因此屏幕管理器的
current
属性将被更改。然后你可以有如下代码:
点击按钮应根据需要切换屏幕。
另一种方法(这可能就是kv语言的实际工作方式)是手动使用
bind
方法。这意味着只要按下
some_button
,就会调用switching_function
。当然,在定义函数的方式和时间上有很大的灵活性,所以(例如)可以做一些更一般的事情,比如将screenmanager作为函数的第一个参数传递给函数。我没有测试这段代码,它也不是一个完整的应用程序,但希望意义是明确的。无论哪种方法都应该很好,你可以选择看起来最明智的方法。以后我可能会构造一个更完整的示例。
相关问题 更多 >
编程相关推荐