【问题标题】:Switching to other screen through clicking an item of an MDList通过单击 MDList 的项目切换到其他屏幕
【发布时间】:2021-11-07 15:58:53
【问题描述】:

我希望在单击 MDList 项目时更改屏幕。我还想将项目的信息传递到新屏幕中。

这是我目前的代码:

main.py

from kivy.lang import Builder
from kivymd.uix.screen import Screen
from kivy.uix.screenmanager import ScreenManager
from kivymd.app import MDApp
from kivymd.uix.list import MDList, ThreeLineListItem, ThreeLineAvatarIconListItem
from kasa import Discover
from decimal import Decimal
import asyncio
from pathlib import Path


class Device(Screen):
    pass

sm = ScreenManager()
sm.add_widget(Device(name='screen1'))

class Test(MDApp):
    def build(self):
        return Builder.load_file('app.kv')

    def on_start(self):
        devices = asyncio.run(Discover.discover())
        for addr, dev in devices.items():
            asyncio.run(dev.update())
            self.root.ids.devices.add_widget(
            ThreeLineAvatarIconListItem(text=dev.alias,
             secondary_text="Current Power: %.2f" % Decimal(dev.emeter_realtime['power_mw'] / 10)  + " mW",
             tertiary_text="Current Runtime: " + dev.on_since.strftime("%H:%M:%S"),
             ))

 
            
Test().run()

app.kv

    #: import SlideTransition kivy.uix.screenmanager.SlideTransition

<Manager>:
    id: sm
    Device:
        id: device_screen
<Device>:
    name: 'screen1'
    MDRectangleFlatButton:
        text: 'Test'
        pos_hint: {'center_x':0.5, 'center_y': 0.5}
        on_press: root.manager.current = 'screen 2'
MDBoxLayout:
    orientation:'vertical'
    MDToolbar:
        title: 'SaveSmart'
        md_bg_color: .2, .2, .2, 1
    MDBottomNavigation:
        panel_color: .2, .2, .2, 1

        MDBottomNavigationItem:
            name: 'screen 4'
            text: 'Dashboard'
            GridLayout:
                id: readings
                col: 2

        MDBottomNavigationItem:
            name: 'screen 3'
            text: 'Devices'
            ScrollView:
                MDList:
                    id: devices


        MDBottomNavigationItem:
            name: 'screen 1'
            text: 'Predictions'
            ScrollView:
                MDList:
                    OneLineListItem:
                        text: "Predictions go here!"
                        on_release: app.root.current = 'screen1'


        MDBottomNavigationItem:
            name: 'screen 2'
            text: 'Recommendations'

            MDLabel:
                text: 'Recommendations'
                halign:'center'

我尝试使用 app.root.current 但它不起作用。该程序编译,但每当我点击“预测到这里!”它不会带我进入新页面。

【问题讨论】:

    标签: python kivy kivy-language kivymd


    【解决方案1】:

    其实每个程序员都有自己的风格,自己的阵型。但我建议您创建您的页面并像下面的代码一样识别它们。因为它更简单和有条理。我希望它可以帮助您重新设计代码。我刚刚添加了按钮来创建我自己的项目。因为我不知道asyncio

    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
    class Page1(Screen):
        mdlistid = ObjectProperty()
        def create_new_item(self,*args):
            item = OneLineAvatarIconListItem(text='Item')
            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
    KV = '''
    <SM>:
        Page1:
            name: 'page1'
        Page2:
            name: 'page2'
    <Page1>:
        mdlistid:mdlistid
        BoxLayout:
            orientation: 'vertical'
            Button:
                size_hint_y:.1
                text: 'Create an Item'
                on_release: root.create_new_item()
            MDList:
                size_hint_y:.9
                id: mdlistid
    <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'
    '''
    
    class MainApp(MDApp):
        def build(self):
            Builder.load_string(KV)
            return SM()
    MainApp().run()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-11
      • 2022-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多