首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从另一个类设置类变量(Kivy/KivyMD)

如何从另一个类设置类变量(Kivy/KivyMD)
EN

Stack Overflow用户
提问于 2022-09-23 03:53:16
回答 1查看 80关注 0票数 0

因此,我在尝试设置另一堂课的按钮文本时遇到了困难。

如果您查看函数set_people,我使用PosScreen.people = name来更改名称,但是按钮文本不会更改。因此,我想我必须通过ids获得它,但我坚持如何从另一个类完成它。这是我的代码:

test.py

代码语言:javascript
运行
复制
from kivy.properties import StringProperty
from kivy.uix.boxlayout import BoxLayout
from kivymd.app import MDApp
from kivy.uix.screenmanager import ScreenManager, Screen
from kivymd.uix.button import MDFlatButton
from kivymd.uix.dialog import MDDialog

pos_dialog = None

class PosScreen(Screen):
    people = StringProperty("")

    def __init__(self, **kwargs):
        super(PosScreen, self).__init__(**kwargs)

    def on_pre_enter(self, *args):
        self.people = "No one"

    def close_dialog(self, *obj):
        global pos_dialog
        pos_dialog.dismiss()
        pos_dialog = None

    def open_people_dialog(self):
        global pos_dialog
        if not pos_dialog:
            pos_dialog = MDDialog(
                title="Choose customer",
                type="custom",
                content_cls=DialogContentPosAddPeople(),
                buttons=[
                    MDFlatButton(
                        text="Close",
                        theme_text_color="Custom",
                        on_release=self.close_dialog
                    )
                ]
            )
        pos_dialog.open()


class DialogContentPosAddPeople(BoxLayout):
    def __init__(self, **kwargs):
        super(DialogContentPosAddPeople, self).__init__(**kwargs)
        self.set_list_people()

    def set_list_people(self, text="", search=False):
        peeps = ["Brian", "AJ", "Nick", "Kevin", "Howie"]

        def add_name_item(name):
            self.ids.rv.data.append(
                {
                    "viewclass": "OneLineListItem",
                    "text": name,
                    "on_release": lambda x=name: self.set_people(x),
                }
            )

        self.ids.rv.data = []
        for name in peeps:
            if search:
                if text.lower() in name.lower():
                    add_name_item(name)
            else:
                add_name_item(name)

    def set_people(self, name):
        global pos_dialog
        PosScreen.people = name # it changes the variable but button text doesn't change
        PosScreen.ids.people_button.text = name # Not accessible NoneType
        pos_dialog.dismiss()
        pos_dialog = None
        return


class testApp(MDApp):

    def build(self):
        self.theme_cls.primary_palette = "Teal"

        sm = ScreenManager()
        sm.add_widget(PosScreen(name="pos"))
        return sm


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

test.kv

代码语言:javascript
运行
复制
PosScreen:

<PosScreen>:
    name: "pos"
    people_button: people_button
    canvas.before:
        Color:
            rgba: 72/255, 72/255, 72/255, 1
        Rectangle:
            pos: self.pos
            size: self.size
    MDBoxLayout:
        orientation: "vertical"
        RelativeLayout:
            orientation: "vertical"
            MDRectangleFlatIconButton:
                id: people_button
                icon: "account-circle-outline"
                text: root.people
                pos_hint:{'x': 0.05, 'center_y': 0.9}
                md_bg_color: 0, 0, 0, 1
                on_release: root.open_people_dialog()


<DialogContentPosAddPeople>:
    rv: rv
    orientation: "vertical"
    spacing: dp(10)
    padding: dp(20)
    size_hint_y: None
    height: "240dp"
    MDBoxLayout:
        adaptive_height: True
        MDIconButton:
            icon: 'magnify'
        MDTextField:
            id: search_field
            hint_text: 'Search name'
            on_text: root.set_list_people(self.text, True)
    RecycleView:
        id: rv
        key_viewclass: 'viewclass'
        key_size: 'height'
        RecycleBoxLayout:
            padding: dp(10)
            default_size: None, dp(48)
            default_size_hint: 1, None
            size_hint_y: None
            height: self.minimum_height
            orientation: 'vertical'

预期结果:当我单击其中一个名称时,它将关闭对话框并将按钮的文本更改为我选择的名称

有人能帮我解释一下我如何做到这一点吗?

EN

回答 1

Stack Overflow用户

发布于 2022-09-23 16:44:26

因此,在调用第二个类时,我通过传递屏幕对象来解决这个问题。

代码语言:javascript
运行
复制
    class PosScreen(Screen):
        ...
    
        def open_people_dialog(self):
            global pos_dialog
            if not pos_dialog:
                pos_dialog = MDDialog(
                    ...
                    content_cls=DialogContentPosAddPeople(self), # Added self here
                    ...
                        )
                    ]
                )
            pos_dialog.open()

在被叫的班级中:

代码语言:javascript
运行
复制
class DialogContentPosAddPeople(BoxLayout):
    def __init__(self, master, **kwargs): # Added master
        super(DialogContentPosAddPeople, self).__init__(**kwargs)
        self.master = master 

    def set_people(self, name): 
        self.master.people = name #Referencing the master
        self.master.ids.people_button.text = name
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73822815

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档