Как получить значение MDText field?

Рейтинг: 0Ответов: 2Опубликовано: 20.01.2023

Есть интерфейс с drop layout. как получить значение из MDTextFiel с id: summ, чтобы сработал def debit()?

я пробовал решить это, но выдает вот такую ошибку

File "F:\Проги\прога\kivy_venv\lib\site-packages\kivy\lang\builder.py", line 55, in custom_callback
     exec(__kvlang__.co_value, idmap)
   File "<string>", line 140, in <module>
 TypeError: MainApp.debit() takes 1 positional argument but 2 were given

Process finished with exit code 1

from kivy.lang import Builder
from kivy.properties import StringProperty, BooleanProperty
import sqlite3

from kivymd.uix.boxlayout import MDBoxLayout
from kivymd.uix.screen import MDScreen
from kivymd.app import MDApp
from kivymd.theming import ThemableBehavior

Builder.load_string(
    """
#:import NoTransition kivy.uix.screenmanager.NoTransition
#:import Window kivy.core.window.Window
#:import IconLeftWidget kivymd.uix.list.IconLeftWidget
# Хзпока что это
<ItemBackdropFrontLayer@TwoLineAvatarListItem>
    icon: "android"

    IconLeftWidget:
        icon: root.icon

<ItemBackdropBackLayer>
    adaptive_height: True
    spacing: "10dp"
    md_bg_color:
        root.theme_cls.primary_dark if root.selected_item else root.theme_cls.primary_color

    MDIconButton:
        icon: root.icon
        theme_text_color: "Custom"
        text_color: (1, 1, 1, .5) if not root.selected_item else (1, 1, 1, 1)

    MDLabel:
        text: root.text
        color: (1, 1, 1, .5) if not root.selected_item else (1, 1, 1, 1)
# Круглые чекбоксы
<ItemBackdropBackLayerOfSecondScreen@BoxLayout>
    size_hint_y: None
    height: "40dp"
    spacing: "25dp"
    text: ""

    MDCheckbox:
        size_hint: None, None
        size: "30dp", "30dp"
        active: False or self.active
        pos_hint: {"center_y": .5}
        selected_color: 1, 1, 1, 1

    MDLabel:
        text: root.text
        color: 1, 1, 1, .7

#квадратные чекбоксы
<ItemRoundBackdropBackLayerOfSecondScreen@BoxLayout>
    size_hint_y: None
    height: "40dp"
    spacing: "25dp"
    text: ""

    MDCheckbox:
        group: "size"
        size_hint: None, None
        size: "30dp", "30dp"
        pos_hint: {"center_y": .5}
        selected_color: 1, 1, 1, 1

    MDLabel:
        text: root.text
        color: 1, 1, 1, .7
# Основная страница
<MyBackdropFrontLayer@ScrollView>
    backdrop: None
    backlayer: None

    MDGridLayout:
        adaptive_height: True
        cols: 1
        padding: "5dp"

        ItemBackdropFrontLayer:
            text: "Пополнение вклада"
            secondary_text: "работает)"
            icon: "bank-plus"
            on_press:
                root.backlayer.current = "third screen"
                root.backdrop.open()
#????
<MyBackdropBackLayer@ScreenManager>
    id: smanager
    screen3: screen3
    transition: NoTransition()


    MDScreen:
        name: "one screen"

        ScrollView
            #сетка из одной колонки
            MDGridLayout:
                adaptive_height: True
                cols: 1
                padding: "5dp"
                #кликабельные кнопки первого окна
                ItemBackdropBackLayer:
                    icon: "arrow-right-drop-circle"
                    text: "Мои накопления"

                ItemBackdropBackLayer:
                    icon: "desktop-mac"
                    text: "Computers"
    #второе окно
    MDScreen:
        name: "second screen"

        ScrollView

            MDGridLayout:
                adaptive_height: True
                cols: 1
                padding: "15dp"
                spacing: "10dp"
                # надпись вверху
                MDLabel:
                    text: "Второе окно"
                    font_size: 40
                    color: 1, 1, 1, 1
#третье окно
    MDScreen:

        name: "third screen"
        id: screen3
        summ: summ

        ScrollView

            MDBoxLayout:
                adaptive_height: True
                padding: "15dp"
                spacing: "10dp"
                # надпись вверху
                MDLabel:
                    text: "Третье окно"
                    font_size: 40
                    color: 1, 1, 1, 1

                ItemBackdropFrontLayer:
                    text: "Внести"
                    on_press:
                        app.debit(self)

                MDTextField:
                    id: summ
                    hint_text: "Введите сумму пополнения"
                    font_size: 18
""")
Builder.load_string(
    """
<ExampleBackdrop>

    MDBackdrop:
        id: backdrop
        on_open: print("on_open")
        on_close: print("on_close")
        left_action_items: [["menu", lambda x: self.open()]]
        title: app.title
        header_text: "Menu:"

        MDBackdropBackLayer:
            MyBackdropBackLayer:
                id: backlayer

        MDBackdropFrontLayer:
            MyBackdropFrontLayer:
                backdrop: backdrop
                backlayer: backlayer
"""
)

class ExampleBackdrop(MDScreen):
    pass


class ItemBackdropBackLayer(ThemableBehavior, MDBoxLayout):
    icon = StringProperty("android")
    text = StringProperty()
    selected_item = BooleanProperty(False)

    def on_touch_down(self, touch):
        if self.collide_point(touch.x, touch.y):
            for item in self.parent.children:
                if item.selected_item:
                    item.selected_item = False
            self.selected_item = True
        return super().on_touch_down(touch)


class MainApp(MDApp):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.title = "Мои финансы"
        self.theme_cls.primary_palette = "DeepPurple"

    def build(self):
        self.root = ExampleBackdrop()

    def debit(self):
            value = self.root_window.ids.summ.text
            print(value)


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

Ответы

▲ 0

Чтобы получить значение из MDTextFiel с id "summ" в вашем drop layout, вам может понадобиться использовать метод text() для получения текста, содержащегося в этом поле.

summ = self.ui.findChild(QtWidgets.QLineEdit, "summ")
value = summ.text()

def debit():
    global value
    # работа с value

В данном коде findChild функция ищет элемент с id "summ" в вашем layout и присваивает его переменной summ, а затем используется метод text() для получения текста, содержащегося в этом поле. Значение переменной value может использоваться в методе debit()

▲ 0

Параметр self это ссылка на конкретный экземпляр класса при вызове указывать его не нужно

у вас:

                    ItemBackdropFrontLayer:
                        text: "Внести"
                        on_press:
                            app.debit(self)

попробуйте:

                    ItemBackdropFrontLayer:
                        text: "Внести"
                        on_press:
                            app.debit()