【问题标题】:How to access a Screen through the App class in kivykivy中如何通过App类访问Screen
【发布时间】:2021-08-11 20:20:43
【问题描述】:

所以我正在构建一个供个人使用的小应用程序,它包含一个日历,我可以在其中安排我的所有活动。几天来,我一直在修改代码,并且已经完成了管理数据所需的类和函数。尽管如此,我制作的屏幕仍然存在问题。我不知道如何通过 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)

非常感谢您的帮助或建议。我真的被这个困住了。 感谢您的宝贵时间。

【问题讨论】:

    标签: python kivy kivy-language kivymd


    【解决方案1】:

    在App类的init函数中添加屏幕管理器。

    首先将屏幕管理器添加到应用程序:

    self.screen_manager = ScreenManager()
    

    例如,您有屏幕“DateScreen”。它应该在 app 类中,例如:

    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添加到屏幕管理器。将所有需要的屏幕包含到屏幕管理器中,然后返回屏幕管理器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-01
      • 1970-01-01
      • 2021-10-25
      • 1970-01-01
      • 2010-09-09
      • 2016-06-25
      • 2013-12-02
      • 2020-08-07
      相关资源
      最近更新 更多