Python 无法从kivy对象获取ID

Python 无法从kivy对象获取ID,python,kivy,kivy-language,Python,Kivy,Kivy Language,我正在尝试将ids与ObjectProperty()一起使用,但工作方式与think不同。我理解ObjectProperty的方式是将variablename=ObjectProperty()作为对.kv文件中名为variablename的类的引用,但我误解了一些东西,因为我得到了以下错误:swiper\u manager=MySwiperManager.ids.swiper\u manager AttributeError:'kivy.properties.ObjectProperty'对象没

我正在尝试将ids与
ObjectProperty()
一起使用,但工作方式与think不同。我理解ObjectProperty的方式是将
variablename=ObjectProperty()
作为对.kv文件中名为variablename的类的引用,但我误解了一些东西,因为我得到了以下错误:
swiper\u manager=MySwiperManager.ids.swiper\u manager
AttributeError:'kivy.properties.ObjectProperty'对象没有属性'id'

.py文件

from kivy.uix.boxlayout import BoxLayout
from kivy.uix.screenmanager import Screen
from kivy.properties import ObjectProperty
from kivy.lang import Builder

from kivymd.uix.managerswiper import MDSwiperPagination
from kivymd.theming import ThemeManager

Builder.load_file("Prelogin/prescreenmanger.kv")

class MySwiperManager(BoxLayout):
    pass

class PreScreenManager(Screen):
    theme_cls = ThemeManager()
    theme_cls.primary_palette = 'Indigo'
    MySwiperManager = ObjectProperty()
    swiper_manager = MySwiperManager.ids.swiper_manager
    paginator = MDSwiperPagination()
    paginator.screens = swiper_manager.screen_names
    paginator.manager = swiper_manager
    swiper_manager.paginator = paginator
    MySwiperManager.add_widget(paginator)
from kivy.uix.boxlayout import BoxLayout
from kivy.app import App
from kivy.uix.screenmanager import Screen
from kivy.properties import ObjectProperty
from kivy.lang import Builder

from kivymd.uix.managerswiper import MDSwiperPagination
from kivymd.theming import ThemeManager

Builder.load_file("Prelogin/prescreenmanger.kv")

class MySwiperManager(BoxLayout):
    pass

class PreScreenManager(Screen):
    swiper_manager = ObjectProperty()  # reference to MySwiperManager from kv file

    def do_setup(self, dt):
        # code to do the setup (called after App is instantiated)
        paginator = MDSwiperPagination()
        paginator.screens = self.swiper_manager.screen_names
        paginator.manager = self.swiper_manager
        self.swiper_manager.paginator = paginator
        self.swiper_manager.add_widget(paginator)
.kv文件

<ScreenOne@Screen>:
    name: 'screen one'
    Label: 
        text: 'Hello World'

<ScreenTwo@Screen>:
    name: 'screen two'


<ScreenThree@Screen>:
    name: 'screen three'


<ScreenFour@Screen>:
    name: 'screen four'



<ScreenFive@Screen>:
    name: 'screen five'


<PreScreenManager>:
    MySwiperManager:
        orientation: 'vertical'
        id: MySwiperManager

        MDSwiperManager:
            id: swiper_manager

            ScreenOne: 

            ScreenTwo:

            ScreenThree:

            ScreenFour:

            ScreenFive:
<ScreenOne@Screen>:
    name: 'screen one'
    Label: 
        text: 'Hello World'
        color: 1,1,1

<ScreenTwo@Screen>:
    name: 'screen two'


<ScreenThree@Screen>:
    name: 'screen three'


<ScreenFour@Screen>:
    name: 'screen four'


<ScreenFive@Screen>:
    name: 'screen five'


<PreScreenManager>:
    swiper_manager: swiper_manager  # uses the id from below

    MySwiperManager:
        orientation: 'vertical'

        MDSwiperManager:
            id: swiper_manager

            ScreenOne:

            ScreenTwo:

            ScreenThree:

            ScreenFour:

            ScreenFive:
主电压(千伏)

AnchorLayout:
    canvas.before:
        Rectangle:
            size: self.size
            pos: self.pos
            source: "Start/Background.png"   
    anchor_x: 'center'
    anchor_y: 'top'
    Image:
        source: 'Start/Loginlogo.png'
        keep_ratio: False
        allow_stretch: True
        opacity: 1
        size_hint: 1, 0.25
        pos_hint: (0,0)  
    ScreenManager:
        id: screen_manager
        PreScreenManager:
            id: PreScreenManager
AnchorLayout:
    canvas.before:
        Rectangle:
            size: self.size
            pos: self.pos
            source: "Start/Background.png"   
    anchor_x: 'center'
    anchor_y: 'top'
    Image:
        source: 'Start/Loginlogo.png'
        keep_ratio: False
        allow_stretch: True
        opacity: 1
        size_hint: 1, 0.25
        pos_hint: (0,0)  
    ScreenManager:
        id: screen_manager
        PreScreenManager:
            id: PreScreenManager

这是我的代码的更新版本。 .py文件

from kivy.uix.boxlayout import BoxLayout
from kivy.app import App
from kivy.uix.screenmanager import Screen
from kivy.properties import ObjectProperty
from kivy.lang import Builder

from kivymd.uix.managerswiper import MDSwiperPagination
from kivymd.theming import ThemeManager

Builder.load_file("Prelogin/prescreenmanger.kv")

class MySwiperManager(BoxLayout):
    pass

class PreScreenManager(Screen):
    swiper_manager = ObjectProperty()  # reference to MySwiperManager from kv file

    def do_setup(self, dt):
        # code to do the setup (called after App is instantiated)
        paginator = MDSwiperPagination()
        paginator.screens = self.swiper_manager.screen_names
        paginator.manager = self.swiper_manager
        self.swiper_manager.paginator = paginator
        self.swiper_manager.add_widget(paginator)
.kv文件

<ScreenOne@Screen>:
    name: 'screen one'
    Label: 
        text: 'Hello World'

<ScreenTwo@Screen>:
    name: 'screen two'


<ScreenThree@Screen>:
    name: 'screen three'


<ScreenFour@Screen>:
    name: 'screen four'



<ScreenFive@Screen>:
    name: 'screen five'


<PreScreenManager>:
    MySwiperManager:
        orientation: 'vertical'
        id: MySwiperManager

        MDSwiperManager:
            id: swiper_manager

            ScreenOne: 

            ScreenTwo:

            ScreenThree:

            ScreenFour:

            ScreenFive:
<ScreenOne@Screen>:
    name: 'screen one'
    Label: 
        text: 'Hello World'
        color: 1,1,1

<ScreenTwo@Screen>:
    name: 'screen two'


<ScreenThree@Screen>:
    name: 'screen three'


<ScreenFour@Screen>:
    name: 'screen four'


<ScreenFive@Screen>:
    name: 'screen five'


<PreScreenManager>:
    swiper_manager: swiper_manager  # uses the id from below

    MySwiperManager:
        orientation: 'vertical'

        MDSwiperManager:
            id: swiper_manager

            ScreenOne:

            ScreenTwo:

            ScreenThree:

            ScreenFour:

            ScreenFive:
主电压(千伏)

AnchorLayout:
    canvas.before:
        Rectangle:
            size: self.size
            pos: self.pos
            source: "Start/Background.png"   
    anchor_x: 'center'
    anchor_y: 'top'
    Image:
        source: 'Start/Loginlogo.png'
        keep_ratio: False
        allow_stretch: True
        opacity: 1
        size_hint: 1, 0.25
        pos_hint: (0,0)  
    ScreenManager:
        id: screen_manager
        PreScreenManager:
            id: PreScreenManager
AnchorLayout:
    canvas.before:
        Rectangle:
            size: self.size
            pos: self.pos
            source: "Start/Background.png"   
    anchor_x: 'center'
    anchor_y: 'top'
    Image:
        source: 'Start/Loginlogo.png'
        keep_ratio: False
        allow_stretch: True
        opacity: 1
        size_hint: 1, 0.25
        pos_hint: (0,0)  
    ScreenManager:
        id: screen_manager
        PreScreenManager:
            id: PreScreenManager
您将类定义(
MySwiperManager
)与类的实例(例如
MySwiperManager()
)混淆。通常,您的所有代码都应该在实例级别,将内容放在类级别通常是错误的,但这是一个常见的错误


不可能给出具体的解决方案,因为您的示例并不完整(事实上,它还存在一些其他问题,始终提供一个最小的可运行示例以使事情更简单),但是一般的答案是,您希望访问
MySwiperManager
类的一个实例的
ids
属性。

我想我几乎理解了您的意图。要在
PreScreenManager
中自动设置
swiper\u管理器
,请首先将属性添加到
PreScreenManager.kv
文件中:

<PreScreenManager>:
    swiper_manager: swiper_manager  # uses the id from below
    my_sm: msm  # uses the id from below

    MySwiperManager:
        orientation: 'vertical'
        id: msm

        MDSwiperManager:
            id: swiper_manager

            ScreenOne:

            ScreenTwo:

            ScreenThree:

            ScreenFour:

            ScreenFive:
我从未使用过
kivyMD
,因此我无法保证
do\u setup()
方法中的代码的正确性。最后,通过修改
MainApp
类,计划执行
do\u setup()
方法:

class PreScreenManager(Screen):
    swiper_manager = ObjectProperty()  # reference to MDSwiperManager from kv file
    my_sm: ObjectProperty()  # reference to MySwiperManager from kv file

    def do_setup(self, dt):
        # code to do the setup (called after App is instantiated)
        theme_cls = ThemeManager()
        theme_cls.primary_palette = 'Indigo'
        paginator = MDSwiperPagination()
        paginator.screens = self.swiper_manager.screen_names
        paginator.manager = self.swiper_manager
        self.swiper_manager.paginator = paginator
        self.my_sm.add_widget(paginator)
class MainApp(App):
    def build(self):
        # create an instance of PreScreenManager
        psm = PreScreenManager()

        # schedule the execution of the do_setup() method
        Clock.schedule_once(psm.do_setup)

        # return the PreScreenManager instance as the root of the App display
        return psm

谢谢你的评论。我只是添加了它所缺少的.py和.kv文件,使之成为一个可运行的示例。是的,这就是我正在尝试做的,谢谢。当我运行您编写的代码时,我得到了
AttributeError:'MainApp'对象没有属性'theme\u cls'
,因此我添加了
theme\u cls=ThemeManager()theme_cls.primary_palette='Indigo'
MainApp
但是现在我得到了
paginator.screens=self.swiper\u manager.screen\u names AttributeError:'NoneType'对象没有属性'screen\u names'
,这个错误表明没有设置
swiper\u manager
。仔细看看我的答案,确保你正确地实施了我的建议。而且,是的,将
主题_cls
移到
MainApp
中。是的,我丢失了对.kv文件的导入(我重新修改了该文件以测试它是否能正常工作),但知道错误消息是“AttributeError:“MySwiperManager”对象没有属性“screen\u names”。我想我现在可能已经解决了它。我知道了以后会回信的。也许
swiper\u manager:msm#使用下面的id
应该是
swiper\u manager:swiper\u manager#使用下面的id