Выпадающие меню в kivy с добавлением других кнопок

здравствуйте есть такой код:

from kivy.app import App
from kivy.uix.dropdown import DropDown
from kivy.uix.button import Button
from kivy.uix.floatlayout import FloatLayout
from kivy.base import runTouchApp
from kivy.uix.checkbox import CheckBox


class CustomDropDown(DropDown):
    pass

class cont(FloatLayout):
    pass


class app(App):



    def build(self):
        self.dropdown = CustomDropDown()
        

        self.dropdown.bind(on_select=lambda instance, x: setattr(mainbutton, 'text', x))

        cont().add_widget(self.dropdown)

        return cont()



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


и вот такой kv файл

<cont>:
    Button:
        text: 'hi'
        size_hint: (0.3, 0.1)
        pos_hint: {'top': 0.5, 'right': 0.5}
        on_press: on_release = app.dropdown


<CustomDropDown>:
    Button:
        text: 'perimetr'
        size_hint_y:  None
        height:  44
        on_release:  root.select('perimetr')


    Button:
        text: 'ploshad'
        size_hint_y:  None
        height:  44
        on_release:  root.select('ploshad')


я хочу чтобы на кнопку hi открывалось выпадающие меню, но вот такая строка не помогает on_press: on_release = app.dropdown

Такой вопрос уже обсуждался:
Выпадающие меню в kivy с файлом kv

Это моя же тема, она не помогла

Тут создается и сразу выкидывается контейнер с виджетом, потом создается и возвращается еще один.

Так on_press или on_release? :slight_smile:

Скорее что-то такое

on_press: app.dropdown.open()

Так и продолжали бы тему…

я сделал вот так:

<cont>:
    Button:
        id: a
        text: 'hi'
        size_hint: (0.3, 0.1)
        pos_hint: {'top': 1, 'right': 1}
        on_press: app.dropdown.open()

но выдало вот такую ошибку:

 TypeError: open() missing 1 required positional argument: 'widget'

добавил виджет, получилось вот так:

<cont>:
    Button:
        id: a
        text: 'hi'
        size_hint: (0.3, 0.1)
        pos_hint: {'top': 1, 'right': 1}
        on_press: app.dropdown.open(app.dropdown)

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

 kivy.uix.dropdown.DropDownException: Cannot open a dropdown list on a hidden widget

Там не его самого передавать надо, а под каким элементом он должен появиться.

https://kivy.org/doc/stable/api-kivy.uix.dropdown.html#kivy.uix.dropdown.DropDown.open

Open the dropdown list and attach it to a specific widget. Depending on the position of the widget within the window and the height of the dropdown, the dropdown might be above or below that widget.

Например, чтобы это была эта кнопка:

app.dropdown.open(self)

спасибо, это помогло, но теперь появилась новая проблема: я хочу чтобы при нажатие на одну из кнопок выпадающего списка изменялся текст кнопки hi на текст кнопки, которая была нажата
я пытался вот так:

Button:
        text: 'perimetr'
        size_hint_y:  None
        height:  44
        on_press: app.per()

это одна из кнопок списка, вот функция ‘per’:

    def per(self):
        
        self.text = 'perimetr'

‘self.text’ это текст кнопки

Так внутри app self это не кнопка.

Например, так:

on_press: self.text = 'perimetr'

у меня self.text это текст в основном классе:

class app(App):
    
    text = ''

    def build(self):
        self.dropdown = CustomDropDown()


        return cont()

но сделал и так как ты сказал:

on_press: app.text = 'perimetr'

не помогло

Так а кнопка как узнает, что ей надо брать текст из app.text?)

Надо тогда сделать свойство и привязать к нему как тут

кнопка у которой должен измениться текст вот, там указано на app.text:

<cont>:
    Button:
        id: a
        text: app.text
        size_hint: (0.3, 0.1)
        pos_hint: {'top': 1, 'right': 1}
        on_release: app.dropdown.open(self)

:arrow_down:

app.dropdown.open(self)
а как открыть выпадающее меню под каким-нибудь другим элементом? вот это не помогает:

on_release: app.dropdownkv.open(root.ids.what)

Это что? :thinking:

Параметром же вроде и передается элемент, под которым откроется.

я пытался вот так:

app.dropdownkv.open(root.ids.what.pos)

root.ids.what
это id кнопки под которой нужно открыть меню(эта не та кнопка на которую надо нажать что бы меню открылось)

Так там сам виджет нужен, а не id.

app.dropdownkv.open(app.some_other_widget)

а как назвать нужный виджет если он находится в kv файле и кнопок несколько

https://kivy.org/doc/stable/guide/lang.html#referencing-widgets

Добавить id кнопке и просто использовать его как переменную.

app.dropdownkv.open(some_other_widget)

вот кнопка под которой нужно открыть меню:

Button:

        text: app.text2
        size_hint: (0.5, 0.1)
        pos_hint: {'top': 1, 'right': 1}
        on_release: app.dropdown2.open(self)
        id: what

вот при нажатии на которую нужно открыть меню:

Button:
        text: 'kvadrat'
        size_hint_y:  None
        height:  44
        on_press: app.kvad()
        on_release: app.dropdownkv.open(root.ids.what)

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

если так запустить и нажать на кнопку kvadrat , то выдаст эту ошибку:

'super' object has no attribute '__getattr__'