python - 从屏幕传递信息
问题描述
我希望将 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'
解决方案
您可以通过 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 2
by
temp = App.get_running_app()
page_1 = temp.root.ids.page_1.<your_object>
推荐阅读
- sql - 如何在 select 语句中包含 PERCENTILE_CONT 列,而不会生成有关 ORDER BY 子句或聚合函数的错误?
- node.js - NodeJS,使用 Multer 上传多张照片,但最后一张照片覆盖了所有其他照片
- php - 样式表未链接
- css - CSS 范围仅适用于 Angular 中的整个模块
- c# - 如何在 Microsoft bot v4 中从英雄卡中捕获用户回复
- swift - iOS 13 上的 ApplePay 错误“连接到远程警报查看服务失败”
- html - “如何在 HTML 和 CSS 中修复‘css 编辑后按钮不移动’”
- css - 如何使网格区域始终为页面的 100% 宽度?
- python - 使用 Python 在 Azure SQL 上启用 TDE
- hive - 在 Oracle 中是否有与转储函数等效的 Hive?