首页 > 解决方案 > 从屏幕传递信息

问题描述

我希望将 ThreeLineListItem 的内容传递到另一个屏幕,这样我就可以使用它的详细信息来获取功率读数并单独显示它。我试图研究它,但我没有找到任何与我正在寻找的东西相关的东西。有人可以帮忙吗?我是否必须以某种方式将其作为参数传递?

主要.py:

from kasa.discover import Discover
from kivy.lang import Builder
from kivy.uix.screenmanager import Screen,ScreenManager
from kivymd.app import MDApp
from kivy.properties import ObjectProperty
from kivymd.uix.list import OneLineAvatarIconListItem, ThreeLineListItem, TwoLineListItem
from decimal import Decimal
from pyemvue import PyEmVue, device
import datetime
import asyncio
from enum import Enum
class Scale(Enum):
    SECOND = '1S'
    MINUTE = '1MIN'
    MINUTES_15 = '15MIN'
    HOUR = '1H'
    DAY = '1D'
    WEEK = '1W'
    MONTH = '1MON'
    YEAR = '1Y'

class Unit(Enum):
    KWH = 'KilowattHours'
    USD = 'Dollars'
    AMPHOURS = 'AmpHours'
    TREES = 'Trees'
    GAS = 'GallonsOfGas'
    DRIVEN = 'MilesDriven'
    CARBON = 'Carbon'

vue = PyEmVue()
vue.login(username='mymalshamsi@gmail.com', password='Moh123123!')

class Page1(Screen):
    mdlistid = ObjectProperty()
    def create_new_item(self,*args):
        plugs = asyncio.run(Discover.discover())
        devices = vue.get_devices()
        usage_over_time, start_time = vue.get_chart_usage(devices[1].channels[0], datetime.datetime.now(datetime.timezone.utc)-datetime.timedelta(minutes=5), datetime.datetime.now(datetime.timezone.utc), scale=Scale.MINUTE.value, unit=Unit.KWH.value)
        for addr, dev in plugs.items():
            asyncio.run(dev.update())
            item = ThreeLineListItem(text=dev.alias, secondary_text= "Current Reading: {:.2f}".format(dev.emeter_realtime['power'] / 100) + " kW",tertiary_text= "IP Address: " + addr)
            item.bind(on_release=self.change_page)
            self.mdlistid.add_widget(item) 
            item = TwoLineListItem(text= devices[0].device_name, secondary_text= "Current Reading: " + str(usage_over_time[3]) + "kWh")
            item.bind(on_release=self.change_page)
            self.mdlistid.add_widget(item)
    def change_page(self,*args):
        self.manager.current = 'page2'
class Page2(Screen):
    pass
class SM(ScreenManager):
    pass

class MainApp(MDApp):
    def build(self):
        Builder.load_file('app.kv')
        return SM()
MainApp().run()

应用程序.kv

<SM>:
    Page1:
        name: 'page1'
    Page2:
        name: 'page2'
<Page1>:
    mdlistid:mdlistid
    MDBottomNavigation:
        MDBottomNavigationItem:
            name: 'devices'
            text: 'Devices'
            BoxLayout:
                orientation: 'vertical'
                Button:
                    size_hint_y:.1
                    text: 'Seek Devices'
                    on_release: root.create_new_item()
                MDList:
                    size_hint_y:.9
                    id: mdlistid
        MDBottomNavigationItem:
            name: 'predictions'
            text: 'Predictions'
            BoxLayout:
                orientation: 'vertical'
                MDList:
                    size_hint_y: .9
                    OneLineListItem:
                        text: 'Predictions go here!'
        MDBottomNavigationItem:
            name: 'recommendations'
            text: 'Recommendations'
            BoxLayout:
                orientation: 'vertical'
                MDList:
                    size_hint_y: .9
                    OneLineListItem:
                        text: 'Recommendations go here!'
<Page2>:
    Button:
        text: 'Go Page 1'
        size_hint:None,None
        size: 250,250
        pos_hint: {'center_x':.5,'center_y':.5}
        on_release: root.manager.current = 'page1'

标签: pythonkivykivy-languagekivymd

解决方案


您可以通过 App 中的小部件 id 访问其他屏幕上的对象。我知道有两种方法可以做到这一点。

首先,您需要在 .kv 文件中为屏幕提供一个 ID,

<SM>:
    Page1:
        name: 'page1'
        id : page_1
    Page2:
        name: 'page2'
        id : page_2

如果它是一个属性并且您想将其传递给您,page 2您可以在更改屏幕之前定义一个函数page 2并调用它page 1并同时传递参数。

所以,class Page2除了你可以添加类似的东西

def get_reading(reading):
    self.reading = reading

然后在change_page函数里面page 1

def change_page(self,*args):
    self.manager.ids.page_2.get_reading(<your_attribute_here>)
    self.manager.current = 'page2'

否则,您也可以page 1直接从page 2by

temp = App.get_running_app()
page_1 = temp.root.ids.page_1.<your_object>

推荐阅读