How to change a space when a button is pressed with kivy?

巧了我就是萌 提交于 2019-12-11 04:15:37

问题


I am trying create a GUI by implementing the template of the ComicCreator GUI sample as a template for my own project. The code is easy to follow, but I would like to be able to reconfigure the drawingspace.kv, each time a button is pushed, say for example something like this:

Q: How could I configure the drawingspace.kv to have a different layout with different widgets for each button that is pressed?


回答1:


A neat way to do this is to use screen.

Since I allready have an example of this app from you earlier question, it was easy to implement the screens, and rewrite the classes a bit.

When a button is pressed, you set the screenmanager's current to whatever the name you named the screen you want.

Then you just edit the layouts as you want inside of each screen, in the kv file, or python file.

I choose to make most of the layout stuff in kv language here. Because I find it easier to develop a layout the way I want it this way. Later I could rewrite it to python if I want that.

So my python file looks like this now:

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import StringProperty
from kivy.clock import Clock
from kivy.uix.screenmanager import Screen,ScreenManager,NoTransition
from kivy.lang import Builder
import time


Builder.load_file("kv.kv")


class MyLayout(BoxLayout):

    def __init__(self,**kwargs):
        super(MyLayout,self).__init__(**kwargs)
        self.orientation = "vertical"
        self.padding = 10


class MainScreen(Screen):
    pass


class RemoveScreen(Screen):
    pass


class GroupScreen(Screen):
    pass


class MyLogo(BoxLayout):

    your_time = StringProperty()
    def __init__(self,**kwargs):
        super(MyLogo,self).__init__(**kwargs)
        Clock.schedule_interval(self.set_time, 0.1)

    def set_time(self,dt):
        self.your_time = time.strftime("%m/%d/%Y %H:%M")




class MyApp(App):
    def __init__(self,**kwargs):
        super(MyApp,self).__init__(**kwargs)
        self.sm = ScreenManager(transition=NoTransition())

        self.sm.add_widget(MainScreen(name = "main"))
        self.sm.add_widget(RemoveScreen(name = "remove"))
        self.sm.add_widget(GroupScreen(name = "group"))

        self.sm.current = "main"

    def build(self):
        return self.sm


if __name__ == "__main__":
    MyApp().run()

And kv.kv file looks like this:

#:kivy 1.9.1

<MyButtons@BoxLayout>:
    padding: 10,10,10,0
    spacing: 10
    size_hint: 1,0.3
    orientation: "horizontal"
    Button:
        text: "Clear"
        on_press: app.sm.current = "main"
    Button:
        text: "Remove"
        on_press: app.sm.current = "remove"
    Button:
        text: "Group"
        on_press: app.sm.current = "group"
    Button:
        text: "Color"
    Button:
        text: "Gestures"

<MyLogo>:
    spacing: 10
    padding: 10,10,10,0
    orientation: "horizontal"
    BoxLayout:
        orientation: "vertical"
        size_hint: 0.3,1
        canvas:
            Rectangle:
                pos: self.pos
                size: self.size
        AsyncImage
            source: 'http://lmsotfy.com/so.png'
        Label:
            size_hint: 1,0.3
            text: root.your_time
            color: [0,0,0,1]
        Label:
            size_hint: 1,0.3
            text: "NYC, New York, USA"
            color: [0,0,0,1]


<MainScreen>:
    MyLayout:
        MyLogo:
            #Button:
            #    text: "main"

        MyButtons:
            #buttons

        BoxLayout:
            padding: 10,10,10,10
            size_hint: 1,0.3
            Button:
                text: "Total figures: 1          Kivy Started"


<RemoveScreen>:
    MyLayout:
        MyLogo:
            BoxLayout:
                orientation: "horizontal"
                Label:
                    font_size: "40sp"
                    text: "Remove"
                Button:
                    font_size: "20sp"
                    text: "Remove this or something"

        MyButtons:
            #buttons

        BoxLayout:
            padding: 10,10,10,10
            size_hint: 1,0.3
            Button:
                text: "Total figures: 1          Kivy Started"


<GroupScreen>:
    MyLayout:
        MyLogo:
            BoxLayout:
                orientation: "vertical"
                Label:
                    font_size: "40sp"
                    text: "Group"
                Button:
                    font_size: "20sp"
                    text: "Something groups stuff"

        MyButtons:
            #buttons

        BoxLayout:
            padding: 10,10,10,10
            size_hint: 1,0.3
            Button:
                text: "Total figures: 1          Kivy Started"



回答2:


The layout frame should be a screen manager, and each layout a screen. Screen transitions would be then triggered by pressing the buttons. You can also watch a tutorial here if you don't know how to do this, but the documentation should be enough.



来源:https://stackoverflow.com/questions/38388782/how-to-change-a-space-when-a-button-is-pressed-with-kivy

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!