python - kivy中如何通过App类访问Screen
问题描述
所以我正在构建一个供个人使用的小应用程序,它包含一个日历,我可以在其中安排我的所有活动。几天来,我一直在研究代码,并且已经完成了管理数据所需的类和函数。尽管如此,我制作的屏幕还是有问题。我不知道如何通过 App 类访问它们以向它们添加新的小部件。在这种情况下,我想在每次安排新活动时更新 DateScreen ...
这是我认为可以帮助您更好地理解问题的一些代码。
Python代码
import kivy
from kivymd.app import MDApp
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivymd.uix.label import MDLabel
from kivymd.uix.bottomsheet import MDCustomBottomSheet
from kivy.factory import Factory
from kivy.uix.stacklayout import StackLayout
class MainScreen(Screen):
pass
class ActivitySheet(StackLayout):
pass
class DateScreen(Screen):
pass
class Manager(ScreenManager):
pass
class MainApp(MDApp):
def build(self):
self.theme_cls.theme_style = "Light"
kv = Builder.load_file("layout2.kv")
return kv
def show_new_activity_menu(self):
"""Spreads a bottomsheet to enable the user to schedule a new activity
with the selected time and description."""
self.bottom_sheet_menu = MDCustomBottomSheet(screen=ActivitySheet())
self.bottom_sheet_menu.open()
def pass_activity_data(self, time, main, desc):
"""Takes all the data inputted by the user and passes it as arguments,
then it dismisses the bottomsheet. This is essential to allow the
AgendaManager to create a new Activity object."""
m.schedule_new_activity(time, main, desc)
self.update_screen()
self.bottom_sheet_menu.dismiss()
def update_screen(self):
schedule = m.show_schedule(m.working_with)
if schedule:
for time in schedule:
DateScreen().add_widget(MDLabel(text="test"))
if __name__ == "__main__":
MainApp().run()
千伏。代码
Manager:
MainScreen:
DateScreen:
<ActivitySheet>:
id: custom
orientation: "lr-tb"
size_hint_y: None
height: "200dp"
spacing: 0
BoxLayout:
orientation: "horizontal"
pos_hint: {"top": 0}
size_hint: (1, 0.25)
TextInput:
id: time
size_hint: (0.25, 1)
font_size: 26
halign: "center"
valign: "center"
text: "H"
TextInput:
id: main
font_size: 24
text: "Main"
size_hint: (0.75, 1)
valign: "center"
TextInput:
id: desc
size_hint: (1, 0.60)
text: ""
BoxLayout:
orientation: "horizontal"
size_hint: (1, 0.15)
Button:
text: "cancel"
Button:
id: day
text: "save"
on_release: app.pass_activity_data( root.ids.time.text, root.ids.main.text, root.ids.desc.text)
我非常感谢您的帮助或建议。我真的被这个困住了。谢谢你的时间。
解决方案
在 App 类的 init 函数中添加屏幕管理器。
首先将屏幕管理器添加到应用程序:
self.screen_manager = ScreenManager()
例如,您有屏幕“DateScreen”。它应该在应用程序类中,例如:
self.date_screen = DateScreen()
screen = Screen(name="DateScreen")
screen.add_widget(self.date_screen)
self.screen_manager.add_widget(screen)
现在返回 screen_manager 而不是 kv 文件:
return self.screen_manager
关于使用来自 kv 文件的内容,我不确定如何将其导入屏幕管理器。但是您可以在网上轻松找到解决方案。
所以基本上你需要使用kv文件将内容导入python脚本。然后将屏幕从kv添加到屏幕管理器。将所有需要的屏幕包含到屏幕管理器中,然后返回屏幕管理器。
推荐阅读
- javascript - 有什么方法可以使用 JavaScript 访问 HTML 文本区域中的特定文本行?
- python - 如何将默认的python3设置为python3.7?
- python - 如何以正确的顺序执行命令
- git - 如何在mac os中允许访问git/config?
- arrays - 是否可以创建一个可以在工作簿中搜索多个工作表以进行多个查询的脚本?
- selenium - 如何获取有关失败的硒测试的有用信息
- c++ - 在 Windows 上编译为 C++20
- algorithm - 证明一个索引不属于 Optimal Sub Interval Sum
- python - 尝试创建一段代码,其作用类似于打开或关闭的开关
- docker-desktop - 为 Windows 10 安装 Docker 桌面时出错