【问题标题】:Kivy On pressing a Button, a New Button is created which takes to Second ScreenKivy 按下按钮时,会创建一个新按钮,该按钮将进入第二个屏幕
【发布时间】:2021-08-13 18:02:01
【问题描述】:

我有一个代码,其中有两个屏幕:“主”和“第二”,当您在主屏幕中按下一个按钮时,会在同一屏幕中创建一个新按钮。我需要创建的新按钮将我带到第二个屏幕。请帮忙,因为我很快就需要它来完成一个更大的项目。

普通代码:

from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.label import Label
from kivy.uix.gridlayout import GridLayout
from kivy.lang import Builder
from kivy.uix.widget import Widget
from kivy.uix.screenmanager import Screen,ScreenManager

class Main(Screen):
   pass
class Second(Screen):
   pass
class Manager(ScreenManager):
   pass
kv=Builder.load_file("test1.kv")
movie=Manager()
movie.add_widget(Main(name="main"))
movie.add_widget(Second(name="second"))

class Movie(App):
   def build(self):
       return movie

Movie().run()

Kv 代码:

#: import Button kivy.uix.button.Button
<Main>:
    name: "main"
    GridLayout:
        id: GL
        cols: 1
        size_hint: (.5,.5)
        pos_hint: {"center_x":.5,"center_y":.5}
        Button:
            text: "Press Me"
            on_press:
                Btn=Button(text="Second",size_hint=(.5,.5),pos_hint= {"center_x":.5,"center_y":.5})
                GL.add_widget(Btn)
                #Btn.bind(on_press= ????)

<Second>:
    name: "second"
    Button:
        text: "Go Back!"
        size_hint: (.5,.5)
        pos_hint: {"center_x":.5,"center_y":.5}
        on_press:
            app.root.current="main"

【问题讨论】:

    标签: python button kivy


    【解决方案1】:

    最简单的方法是在 Main 类中定义一个方法来更改 Screen

    class Main(Screen):
        def switch(self, button_instance):
           self.manager.current = 'second'
    

    然后在kv中引用该方法:

        Button:
            text: "Press Me"
            on_press:
                Btn=Button(text="Second",size_hint=(.5,.5),pos_hint= {"center_x":.5,"center_y":.5}, on_press=root.switch)
                GL.add_widget(Btn)
    

    不需要任何额外方法的更复杂的方法是使用python setattr() 方法设置current ScreenScreenManager

        Button:
            text: "Press Me"
            on_press:
                Btn=Button(text="Second",size_hint=(.5,.5),pos_hint= {"center_x":.5,"center_y":.5})
                Btn.bind(on_press=lambda ins: partial(setattr, root.manager, 'current', 'second')())
                GL.add_widget(Btn)
    

    需要lambda 以避免将Button 实例传递给setattr() 方法。此外,partial 需要在 kv 中导入:

    #: import partial functools.partial
    

    【讨论】:

    • 天啊,非常感谢...我真的需要这个
    • 假设按钮是动态创建的......在主屏幕类本身......在一个函数下说 def add(self): ....我应该在 on_press 部分放什么...... . 会是 Btn.bind(on_press=self.switch()) (注意-我指的是你的简单方法)
    • 我会是 `Btn.bind(on_press=self.switch). Note the lack of ()`。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-25
    • 2015-04-04
    • 2023-01-27
    • 2022-07-06
    • 1970-01-01
    • 2018-04-04
    相关资源
    最近更新 更多