【问题标题】:kivy 'NoneType' object has no attribute 'get_screen'? How do I access values from different screens?kivy 'NoneType' 对象没有属性 'get_screen'?如何从不同的屏幕访问值?
【发布时间】:2020-09-24 12:39:37
【问题描述】:

我遇到了一个奇怪的错误,我花了一整天的时间,仍然无法修复这个错误。我不知道如何访问值?

你能告诉我如何访问来自ScreenManager 的值,我做错了什么吗?

错误-

Traceback (most recent call last):
   File "/home/rohit/Desktop/itube/main.py", line 111, in <module>
     Itube().run()
   File "/home/rohit/Desktop/itube/main.py", line 50, in __init__
     caller=self.root.get_screen("homescreen").ids.video_quality,
 AttributeError: 'NoneType' object has no attribute 'get_screen'

Main.py

from kivymd.app import MDApp
from kivy.lang import Builder
from kivy.uix.screenmanager import Screen, ScreenManager
from kivy.core.window import Window
from kivymd.uix.filemanager import MDFileManager
from kivymd.toast import toast
from youtube_dl import kv
from kivymd.uix.menu import MDDropdownMenu


Window.size = (450, 740)



class HomeScreen(Screen):
    pass

class SigninScreen(Screen):
    pass




sm = ScreenManager()
sm.add_widget(HomeScreen(name='homescreen'))
sm.add_widget(SigninScreen(name='signinscreen'))





class Itube(MDApp):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)

        Window.bind(on_keyboard=self.events)

        self.path = '/home/rohit'
        self.manager_open = False
        self.file_manager = MDFileManager(
            exit_manager=self.exit_manager,
            select_path=self.select_path,
            previous=True,
        )



        video_quality_options = [{'text': f'items {i}'} for i in range(5)]
        self.dropdown_item = MDDropdownMenu(
            caller=self.root.get_screen("homescreen").ids.video_quality,
            items = video_quality_options,
            width_mult=3,
        )
        self.dropdown_item.bind(on_release=self.menu_callback)


    

    def menu_callback(self, instance_menu, instance_menu_item):
        print(instance_menu, instance_menu_item)

    def option_callback(self, text_of_the_option):
        print(text_of_the_option)


    def file_manager_open(self):
        self.file_manager.show(self.path)  # output manager to the screen
        self.manager_open = True

    def select_path(self, path):
        self.exit_manager()
        toast(path)

    def exit_manager(self, *args):    
        self.manager_open = False
        self.file_manager.close()

    def events(self, instance, keyboard, keycode, text, modifiers):
        '''Called when buttons are pressed on the mobile device.'''

        if keyboard in (1001, 27):
            if self.manager_open:
                self.file_manager.back()
        return True



    def build(self):
        self.main_screen = Screen()

        self.theme_cls.primary_palette = "Red"

        helper_string = Builder.load_string(kv)
        self.main_screen.add_widget(helper_string)

        return self.main_screen




if __name__ == "__main__":
    Itube().run()

youtube_dl.py

kv = """

ScreenManager:
    HomeScreen:
    SigninScreen:




<HomeScreen>:
    name: 'homescreen'
    video_quality: video_quality

    MDBoxLayout:
        orientation: 'vertical'
        spacing: 20
        padding: 40


        MDTextFieldRound:
            hint_text: 'Url'
            multline: False
            normal_color: (1, 1, 1, 100)
            color_active: (232/255, 232/255, 232/255, 600)
            



        MDBoxLayout:
            orientation: 'horizontal'
            adaptive_size: True
            spacing: 22
            pos_hint: {'center_x': 0.5, 'center_y': .99}


            MDRaisedButton:
                text: 'Import from computer'
                icon: "folder"
                elevation_normal: 10
                on_release: app.file_manager_open()
            
            MDRaisedButton:
                text: 'Import from itube cloud'
                elevation_normal: 10

        MDDropdownMenu:
            id: video_quality
            text: 'Select Quality'
            elevation_normal: 10
            on_release: app.dropdown_item.open()
            

        MDLabel:

        MDFloatingActionButton:
            icon: 'archive-arrow-down'
            elevation_normal: 10
            md_bg_color: app.theme_cls.primary_color
            pos_hint: {'center_x': .9, 'center_y': .5}

    

    


<SigninScreen>:
    name: 'signinscreen'


"""

【问题讨论】:

    标签: python python-3.x kivy kivymd


    【解决方案1】:

    您拥有访问特定屏幕的一半代码。这一行的问题……

    caller=self.root.get_screen("homescreen").ids.video_quality
    

    self.rootget_screen 属性适用于屏幕管理器,但self.root 不是指您的屏幕管理器对象。因此,将self.root 替换为您的屏幕管理器的名称sm。所以这条线应该是......

    caller=sm.get_screen("homescreen").ids.video_quality.

    只有当您的屏幕管理器对象被分配给一个全局变量以便可以在您的类中访问时,这才有可能。但你已经这样做了。所以没有什么可以改变的。

    【讨论】:

    • 我仍然遇到错误 - 'super' object has no attribute '__getattr__'
    • 我该如何解决?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多