【问题标题】:Kivy pass variable to screen and change screenKivy 将变量传递到屏幕并更改屏幕
【发布时间】:2021-01-27 15:25:15
【问题描述】:

编辑:我试图制作一个最小的应用程序,因为第一个答案中的 John Anderson 告诉我要重现我的问题,但我无法重现我的问题,但我遇到了另一个错误,如何让我的 self.manager 一起工作在屏幕上?

'NoneType' object has no attribute 'get_screen'
  File "C:\Users\rbert\Desktop\stackoverflow\dashboard.py", line 39, in update_post_screen
    self.manager.get_screen("Post_view").list = list([post_id, post_body])
  File "C:\Users\rbert\Desktop\stackoverflow\dashboard.py", line 28, in __init__
    self.update_post_screen(self.item['post_id'], self.item['post_body'])
  File "C:\Users\rbert\Desktop\stackoverflow\main.py", line 12, in build
    return Builder.load_file("main.kv")
  File "C:\Users\rbert\Desktop\stackoverflow\main.py", line 16, in <module>
    CyberXtremeApp().run()

我已经搜索了堆栈溢出,但我没有得到我正在搜索的答案 我在单独的文件中有屏幕,并且我的 ScreenManager 在 main.kv 文件中指定,我想要做的是在输入之前更改其他屏幕上的一些值但是当我尝试使用 self.app.manager.get_screen 更改值时说

File "C:\Python39\lib\site-packages\kivy\uix\screenmanager.py", line 1071, in get_screen
     raise ScreenManagerException('No Screen with name "%s".' % name)
 kivy.uix.screenmanager.ScreenManagerException: No Screen with name "Post_view".

我的屏幕代码是这个叫做dashboard.py的代码

from kivymd.app import MDApp
from kivymd.uix.screen import Screen
from kivymd.uix.list import MDList, IconLeftWidget, OneLineIconListItem
from kivy.uix.scrollview import ScrollView
import json
import requests



class Dashboard(Screen):

    def __init__(self, **kw):
        super().__init__(**kw)
        self.sub_title = ""
        self.nombre = ""
        self.Bienvenido = ""
        self.scroll = ScrollView()
        self.posts = list(self.get_posts())
        self.sorted_posts = self.posts.reverse()
        self.list_view = MDList()
        for self.item in self.posts:
            if self.item["post_status"] == "3":
                print("post oculto")
            else:
                self.icons = IconLeftWidget(icon="music")
                print(self.item['post_id'] + ", " + self.item['post_body'])
                self.update_post_screen(self.item['post_id'], self.item['post_body'])
                self.items = OneLineIconListItem(text=self.item['post_title'], on_press=lambda x:self.update_post_screen(self.item['post_id'], self.item['post_body']))
                self.items.add_widget(self.icons)
                self.list_view.add_widget(self.items)

        self.scroll.add_widget(self.list_view)
        # End List

        self.add_widget(self.scroll)

    def update_post_screen(self, post_id, post_body):
        self.manager.get_screen("Post_view").list = list([post_id, post_body])
        self.manager.current = 'Post_view'
        return print("ok")

    
    def on_enter(self, *args):
        self.app.title = "Posts"
    

    def get_posts(self):

        url = "https://example/api/"

        payload = {}
        headers = {'Content-Type': 'application/json'}
        response = requests.request("GET", url, headers=headers, data=payload)
        return json.loads(response.text)

我的dashboard.kv 文件是

# -*- coding: utf-8 -*-
<Dashboard>:

  FloatLayout:
    MDLabel:
      id: sub_title
      pos_hint: { "center_x": 0.02, "top": 1.03}
      size_hint: (.5, .2)
      theme_text_color: "Primary"
      font_style: "Caption"
      halign: "center"
      text: root.sub_title

    MDLabel:
      id: Bienvenido
      pos_hint: { "center_x": 0.20, "top": 1.03 }
      size_hint: (.3, .2)
      theme_text_color: "Primary"
      font_style: "Caption"
      halign: "center"
      text: root.Bienvenido

    MDLabel:
      id: nombre
      pos_hint: {"center_x": 0.28, "top": 1.03}
      size_hint: (.3, .2)
      theme_text_color: "Primary"
      font_style: "Caption"
      halign: "center"
      text: root.nombre

我的 main.py

from kivymd.app import MDApp
from kivy.lang import Builder
from dashboard import Dashboard
from post_view import Post_view
    
class CyberXtremeApp(MDApp):
    def build(self):
        self.title = "TestApp"
        self.theme_cls.primary_palette == "Blue"
        
        return Builder.load_file("main.kv")
        print(self.ids)
    
if __name__ == "__main__":
    CyberXtremeApp().run()

如何通过屏幕传递变量并使用 kv 文件中指定的 ScreenManager 切换到屏幕? 请不要向我解释如何在同一个文件上通过屏幕传递变量,因为我已经尝试过并且可以工作,但是当我尝试处理单独的文件时会出现错误

【问题讨论】:

    标签: python-3.x kivy kivymd


    【解决方案1】:

    如果没有更多代码很难确定,但我建议更改:

        self.app.manager.get_screen("Post_view").list = list([post_id, post_body])
        self.parent.current = "Post_view"
    

    到:

        self.manager.get_screen("Post_view").list = list([post_id, post_body])
        self.manager.current = "Post_view"
    

    请注意,当Screen 添加到ScreenManager 时,ScreenManager 将分配给Screenmanager 属性。

    【讨论】:

    • 您好,感谢您的帮助,我已经尝试过了,但出现此错误:self.manager.get_screen("Post_view").list = list([post_id, post_body]) AttributeError: 'NoneType' object当我在 OneLineIconListItem 中的 on_preess 函数上调用函数时没有属性“get_screen”,当我用 lambda 调用它时,它只获得列表中的第一个键值,我想要的是在 Post_view 屏幕上获取键值到for循环键和值
    • 您还需要我的代码的哪一部分? main.py?
    • 添加了它,但它没有出现问题,我得到它显示另一个错误谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多