首页 > 解决方案 > 使用 kivy 从不同类中引用类的方法

问题描述

我有一个具有多个屏幕的应用程序,我试图从另一个屏幕中调用我的 ScreenOne 的方法。该代码是一个最小的示例。

当我在第二个屏幕中时,我想知道引用此 ScreenOne 方法的正确方法。

cart_list = {}

    class ScreenOne(Screen):
        def update_cart(self):
        cart_list.update({'Item one': 1.00})

        for key, value in cart_list:
            print(key, value)

     class ScreenTwo(Screen):
           pass

相关的kv代码如下

ScreenTwo:
    Button:
        id: item_1
        text: "Add to cart"
        on_press: MainScreen.update_cart()

标签: pythonkivy

解决方案


解决方案

.kv 文件

  1. 添加id到 ScreenOne。
  2. 默认情况下,每个屏幕都有一个属性,该属性为您提供所用ScreenManagermanager的实例。
  3. 参考使用方法root.manager.ids.screen_one.update_cart()

以下是 Python 脚本所需的一些小更新。

.py 文件

  1. 在方法中声明cart_listglobalupdate_cart
  2. 附加.items()cart_list例如for key, value in cart_list.items():

例子

主文件

from kivy.app import App
from kivy.uix.screenmanager import Screen
from kivy.lang import Builder

cart_list = {}


class ScreenOne(Screen):

    def update_cart(self):
        global cart_list
        cart_list.update({'Item one': 1.00})

        for key, value in cart_list.items():
            print(key, value)


class ScreenTwo(Screen):
    pass


class TestApp(App):

    def build(self):
        return Builder.load_file('main.kv')


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

主文件

#:kivy 1.11.0

ScreenManager:
    ScreenOne:
        id: screen_one
        name: 'screen1'
    ScreenTwo:
        id: screen_two
        name: 'screen2'

<ScreenOne>:
    BoxLayout:
        Button:
            text: 'Goto Screen Two'
            on_press: root.manager.current = 'screen2'
        Button:
            text: 'Quit'


<ScreenTwo>:
    Button:
        id: item_1
        text: "Add to cart"
        on_press: root.manager.ids.screen_one.update_cart()

输出

输出


推荐阅读