Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
382 views
in Technique[技术] by (71.8m points)

python - How to refer to another class method in kivy

I'm trying to make an app. On button click on the bottom right of the screen there appears a dialog window(popup). On "Done" click the popup window closes (close_dialog method), and a new List Item is expected to appear. Unfortunately the error occurs on "Done" click:

 AttributeError: 'DialogContent' object has no attribute 'get_screen'

Could you please tell me why does the error occur and how can I fix it? I suppose that it is caused by the fact that DialogContent class inherits from BoxLayout (not from Screen) but I don't know how to fix it.

Code .py:

from kivy.lang import Builder
from kivy.core.window import Window
from kivymd.app import MDApp
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.scrollview import ScrollView
from kivymd.uix.button import MDFlatButton
from kivymd.uix.dialog import MDDialog
from kivymd.uix.textfield import MDTextField
from kivy.uix.textinput import TextInput
from kivy.uix.screenmanager import Screen, ScreenManager
from kivymd.uix.list import TwoLineAvatarListItem

Window.size = (288, 511)

class GroupScreen(Screen):
    pass
class DialogContent(BoxLayout):
    pass
class MainScreen(Screen):
    dialog = None

    def show_dialog(self, *args):
        '''
        Create group creation popup
        '''
        if not self.dialog:
            self.dialog = MDDialog(
                title="Create new group",
                type="custom",
                content_cls=DialogContent(),
                auto_dismiss=False
            )
        self.dialog.open()

    def close_dialog(self, *args):
        '''
        Close popup on Done click
        '''
        self.dialog.dismiss()
        self.new_window()

    def new_window(self, *args):
        '''
        Create new group button
        '''
        mylist = TwoLineAvatarListItem(text = self.dialog.content_cls.textfield.text,
            secondary_text = "1,2,3...")
        self.mdlist.add_widget(mylist)


class test2App(MDApp):
    def build(self):
        sm = ScreenManager()
        sm.add_widget(MainScreen(name='main'))
        sm.add_widget(GroupScreen(name='group'))
        scroll = ScrollView()
        return sm

if __name__ == '__main__':
    test2App().run()

Code .kv:

ScreenManager:
    MainScreen:
    GroupScreen:

<DialogContent>:
    textfield: textfield
    orientation: "vertical"
    spacing: "12dp"
    size_hint_y: None
    height: "120dp"

    MDTextField:
        id: textfield
        hint_text: "Group name"

    MDFlatButton:
        id: btn1
        text: "Done"
        text_color: self.theme_cls.primary_color
        on_release: root.get_screen['main'].close_dialog()

<MainScreen>:
    name: 'main'
    mdlist: mdlist
    FloatLayout:
        size_hint: 1, 0.89
        ScrollView:
            MDList:
                id: mdlist
    MDFloatingActionButton:
        pos_hint: {'right': 0.95, 'y': 0.05}
        icon: "android"
        theme_text_color: "Custom"
        text_color: app.theme_cls.primary_color
        on_release:
            root.show_dialog()

<GroupScreen>:
    name: 'group'
    MDLabel:
        text: 'Welcome'
        halign: 'center'
    MDRectangleFlatButton:
        text: 'Back'
        pos_hint: {'center_x': 0.5, 'center_y': 0.3}
        on_release: root.manager.current = 'main'

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Change:

on_release: root.get_screen['main'].close_dialog()

to:

on_release: app.root.get_screen('main').close_dialog()

The app.root gets you a reference to the root widget of the app, which is the ScreenManager. Then you can use get_screen('main') to access the main Screen and call its close_dialog() method.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...