首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Kivy中通过函数实现向新屏幕的过渡?

如何在Kivy中通过函数实现向新屏幕的过渡?
EN

Stack Overflow用户
提问于 2018-08-01 03:12:50
回答 1查看 1.1K关注 0票数 2

我想在单击按钮后实现到新屏幕的转换,并且我想通过函数来实现这一点。我有这个kv代码

代码语言:javascript
运行
复制
<ScreenFrame@BoxLayout>:
    orientation: 'vertical'
    cols: 3

    ActionBar:
        ActionView:
            pos_hint: {'top':1}
            use_separator: True
            ActionPrevious:
                title: "Title"
                with_previous: False
            ActionButton:
                text: "+"


    Label:
        text: "Content"


    BoxLayout:
        orientation: 'horizontal'
        cols: 4
        size_hint: 1, 0.15

        Button:
            text: "Notes"
            #don't work
            on_press: root.manager.current = 'nts'
        Button:
            text: "Docs"
            #don't work
            on_release: root.go_to_dcs()

        Button:
            text: "Videos"
            #don't work
            on_release: root.manager.current = "vds"
        Button:
            text: "Pictures"
            # don't work
            on_release: root.manager.current = 'pctrs'

<NtsScreen>:
    BoxLayout:
        orientation: "vertical"
        cols: 2

        ScreenFrame:
        Button:
            text: "f"
            #work, but me need implementaion through function
            on_press: root.manager.current = "vds"

<DocsScreen>:
    ScreenFrame:

<VdsScreen>:
    ScreenFrame:

<PctrsScreen>:
    ScreenFrame:

这个文件

代码语言:javascript
运行
复制
from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.widget import Widget
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.lang import Builder
from kivy.uix.button import Button
from kivy.properties import StringProperty
from kivy.uix.widget import Widget


Builder.load_file("main.kv")

class ScreenFrame():
    def go_to_dcs(self):
        sm.current = "dcs"

class NtsScreen(Screen):
    pass

class DcsScreen(Screen):
    def go_to_dcs(self):
        sm.current = 'dcs'

class VdsScreen(Screen):
    pass

class PctrsScreen(Screen):
    pass


# Create the screen manager
sm = ScreenManager()
sm.add_widget(NtsScreen(name='nts'))
sm.add_widget(DcsScreen(name='dcs'))
sm.add_widget(VdsScreen(name='vds'))
sm.add_widget(PctrsScreen(name='pctrs'))


class MainApp(App):
    def build(self):
        return sm

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

,但当我运行并按下Docs Button时,出现以下错误

代码语言:javascript
运行
复制
 Traceback (most recent call last):
   File "main.py", line 45, in <module>
     MainApp().run()
   File "/home/parvektor228/TAOKF/lib/python3.6/site-packages/kivy/app.py", line 826, in run
     runTouchApp()
   File "/home/parvektor228/TAOKF/lib/python3.6/site-packages/kivy/base.py", line 502, in runTouchApp
     EventLoop.window.mainloop()
   File "/home/parvektor228/TAOKF/lib/python3.6/site-packages/kivy/core/window/window_pygame.py", line 403, in mainloop
     self._mainloop()
   File "/home/parvektor228/TAOKF/lib/python3.6/site-packages/kivy/core/window/window_pygame.py", line 289, in _mainloop
     EventLoop.idle()
   File "/home/parvektor228/TAOKF/lib/python3.6/site-packages/kivy/base.py", line 340, in idle
     self.dispatch_input()
   File "/home/parvektor228/TAOKF/lib/python3.6/site-packages/kivy/base.py", line 325, in dispatch_input
     post_dispatch_input(*pop(0))
   File "/home/parvektor228/TAOKF/lib/python3.6/site-packages/kivy/base.py", line 291, in post_dispatch_input
     wid.dispatch('on_touch_up', me)
   File "kivy/_event.pyx", line 707, in kivy._event.EventDispatcher.dispatch
   File "/home/parvektor228/TAOKF/lib/python3.6/site-packages/kivy/uix/behaviors/button.py", line 179, in on_touch_up
     self.dispatch('on_release')
   File "kivy/_event.pyx", line 703, in kivy._event.EventDispatcher.dispatch
   File "kivy/_event.pyx", line 1214, in kivy._event.EventObservers.dispatch
   File "kivy/_event.pyx", line 1098, in kivy._event.EventObservers._dispatch
   File "/home/parvektor228/TAOKF/lib/python3.6/site-packages/kivy/lang/builder.py", line 64, in custom_callback
     exec(__kvlang__.co_value, idmap)
   File "/home/parvektor228/TAOKF/KivyApp/memfier/main.kv", line 32, in <module>
     on_release: root.go_to_dcs()
   File "kivy/weakproxy.pyx", line 30, in kivy.weakproxy.WeakProxy.__getattr__
 AttributeError: 'ScreenFrame' object has no attribute 'go_to_dcs'

错误在哪里,或者我可以做一些我不理解的事情吗?

更多细节,以便错误通知消失。更多细节,以便错误通知消失。更多细节,以便错误通知消失。

EN

回答 1

Stack Overflow用户

发布于 2018-08-01 04:25:02

发生您的问题是因为ScreenFrameBoxLayout (根据您的kv文件),而不是Screen。因此,您调用的root (在本例中为ScreenFrame)没有与其关联的managermanagerScreen本身相关联。

您必须引用ScreenFrame小部件的父小部件,才能引用当前的Screen及其关联的manager。为了清楚起见,我建议将Python代码和kv文件重组如下:

Python代码:

代码语言:javascript
运行
复制
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.lang import Builder
from kivy.uix.button import Button
from kivy.uix.widget import Widget

Builder.load_file("testthis.kv")

class ScreenFrame(BoxLayout):

    def go_to_screen(self, val):
        self.parent.manager.current = val

class NtsScreen(Screen):
    pass

class DcsScreen(Screen):
    pass

class VdsScreen(Screen):
    pass

class PctrsScreen(Screen):
    pass

class MyScreenManager(ScreenManager):
    pass

class MainApp(App):

    def build(self):
        self.sm = MyScreenManager()
        return self.sm

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

kv文件:

代码语言:javascript
运行
复制
<MyScreenManager>:
    NtsScreen:
        name: 'nts'
    DcsScreen:
        name: 'dcs'
    VdsScreen:
        name: 'vds'
    PctrsScreen:
        name: 'pctrs'

<NtsScreen>:
    ScreenFrame:

<DocsScreen>:
    ScreenFrame:

<VdsScreen>:
    ScreenFrame:

<PctrsScreen>:
    ScreenFrame:

<ScreenFrame>:

    orientation: 'vertical'
    rows: 3

    ActionBar:
        ActionView:
            pos_hint: {'top':1}
            use_separator: True
            ActionPrevious:
                title: "Title"
                with_previous: False
            ActionButton:
                text: "+"

    Label:
        text: "Content"

    BoxLayout:
        orientation: 'horizontal'
        cols: 4
        size_hint: 1, 0.15

        Button:
            text: "Notes"
            on_press: root.go_to_screen('nts')
        Button:
            text: "Docs"
            on_release: root.go_to_screen('dcs')
        Button:
            text: "Videos"
            on_release: root.go_to_screen('vds')
        Button:
            text: "Pictures"
            on_release: root.go_to_screen('pctrs')
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51620484

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档