【问题标题】:Passing information from a screen从屏幕传递信息
【发布时间】:2021-11-09 12:29:28
【问题描述】:

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

main.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()

app.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'

【问题讨论】:

    标签: python kivy kivy-language kivymd


    【解决方案1】:

    您可以通过 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 add 你可以添加类似的东西

    def get_reading(reading):
        self.reading = reading
    

    然后在page 1change_page函数里面

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

    否则你也可以通过page 2直接访问page 1中的对象

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

    【讨论】:

      猜你喜欢
      • 2022-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-04
      • 1970-01-01
      • 2019-01-18
      • 1970-01-01
      相关资源
      最近更新 更多