【问题标题】:(Kivy) How do I display new content on my canvas in Kivy?(Kivy) 如何在 Kivy 的画布上显示新内容?
【发布时间】:2021-05-30 10:20:51
【问题描述】:

这应该是一个很容易解决的问题。我是基维的新手。我试图在按下按钮时清除画布,然后显示一个新的小部件以基本上移动到另一个页面。当我运行它并按下按钮时,画布被清除,但我没有从 IntroPage 得到任何东西。

Python 脚本:

import kivy
kivy.require('2.0.0')

from kivy.app import App

from kivy.uix.label import Label

from kivy.uix.gridlayout import GridLayout
from kivy.uix.button import Button
from kivy.uix.image import Image
from kivy.uix.widget import Widget
from kivy.properties import ObjectProperty


class ABT(App):
    def build(self):
        return WelcomePage()


class WelcomePage(Widget):
    def btn(self):
        self.canvas.clear()
        print('pressed')
        return IntroPage()


class IntroPage(Widget):
    def __init__(self):
    pass


if __name__ == '__main__':
    ABT().run()

KV 文件:

<WelcomePage>
    canvas.before:
        Color:
            rgba: (.43,.51,.92,.26)
        Rectangle:
            pos: self.pos
            size: self.size
    GridLayout:
        cols:1
        size: root.width, root.height
        Image:
            source: 'abt1t.png'
            size_hint: (1,.8)

        Button:
            text:"begin"
            background_color: (.43,.51,.92,.26)
            size_hint: (1,.2)
            on_press: root.btn()

<IntroPage>
    GridLayout:
        cols:1
        Label:
            text:"This won't show up!"

【问题讨论】:

    标签: python kivy kivy-language


    【解决方案1】:

    btn 返回 IntroPage 将不起作用,因为 btn 不是构建方法。

    实现多页的最佳方式大概是使用ScreenManager

    from kivy.uix.screenmanager import ScreenManager, Screen
    
    
    class ABT(App):
        def build(self):
            sm = ScreenManager()
            sm.add_widget(WelcomePage(name="welcome"))
            sm.add_widget(IntroPage(name="intro"))
            return sm
    
    
    class WelcomePage(Screen):
        def btn(self):
            print('pressed')
            self.manager.current = "intro"
    
    
    class IntroPage(Screen):
        def __init__(self):
            pass
    

    【讨论】:

    • 感谢您的快速回复。我已经实现了这个并得到了一个错误。 (kivy.uix.screenmanager.ScreenManagerException: No Screen with name "intro") 我也试过class ABT(App): def build(self): sm = ScreenManager() welcome_screen = Screen(name="welcome") sm.add_widget(welcome_screen) intro_screen = Screen(name="intro") sm.add_widget(intro_screen) return sm 应该达到同样的效果(我认为),但是当我运行它时这也不起作用。
    • 玩了一会儿,让它工作了。我所做的最大改变是使用Builder.load_string('&lt;contents of my kv file&gt;') 而不是将它们分开,这有点烦人,但它确实有效。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2015-02-22
    • 1970-01-01
    • 1970-01-01
    • 2013-01-07
    • 2021-10-30
    相关资源
    最近更新 更多