【发布时间】: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