Python 无法从kivy对象获取ID
我正在尝试将ids与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'对象没
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
。