yarik_py
(колотов ярослав)
13.Сентябрь.2020 10:05:46
#1
здравствуйте есть такой код:
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
LiAN
13.Сентябрь.2020 16:23:35
#2
yarik_py
(колотов ярослав)
14.Сентябрь.2020 09:45:34
#3
Это моя же тема, она не помогла
AlexP
(Alex P.)
14.Сентябрь.2020 10:14:46
#4
Тут создается и сразу выкидывается контейнер с виджетом, потом создается и возвращается еще один.
Так on_press или on_release?
Скорее что-то такое
on_press: app.dropdown.open()
LiAN
14.Сентябрь.2020 11:26:49
#5
Так и продолжали бы тему…
yarik_py
(колотов ярослав)
16.Сентябрь.2020 02:20:17
#6
я сделал вот так:
<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
AlexP
(Alex P.)
16.Сентябрь.2020 08:52:32
#7
Там не его самого передавать надо, а под каким элементом он должен появиться.
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)
yarik_py
(колотов ярослав)
16.Сентябрь.2020 09:59:26
#8
спасибо, это помогло, но теперь появилась новая проблема: я хочу чтобы при нажатие на одну из кнопок выпадающего списка изменялся текст кнопки hi на текст кнопки, которая была нажата
я пытался вот так:
Button:
text: 'perimetr'
size_hint_y: None
height: 44
on_press: app.per()
это одна из кнопок списка, вот функция ‘per’:
def per(self):
self.text = 'perimetr'
‘self.text’ это текст кнопки
AlexP
(Alex P.)
16.Сентябрь.2020 10:12:44
#9
Так внутри app
self
это не кнопка.
Например, так:
on_press: self.text = 'perimetr'
yarik_py
(колотов ярослав)
16.Сентябрь.2020 10:16:43
#10
у меня self.text это текст в основном классе:
class app(App):
text = ''
def build(self):
self.dropdown = CustomDropDown()
return cont()
но сделал и так как ты сказал:
on_press: app.text = 'perimetr'
не помогло
AlexP
(Alex P.)
16.Сентябрь.2020 10:21:01
#11
Так а кнопка как узнает, что ей надо брать текст из app.text
?)
Надо тогда сделать свойство и привязать к нему как тут
yarik_py
(колотов ярослав)
16.Сентябрь.2020 10:24:27
#12
кнопка у которой должен измениться текст вот, там указано на 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)
yarik_py
(колотов ярослав)
04.Ноябрь.2020 10:28:44
#14
app.dropdown.open(self)
а как открыть выпадающее меню под каким-нибудь другим элементом? вот это не помогает:
on_release: app.dropdownkv.open(root.ids.what)
AlexP
(Alex P.)
04.Ноябрь.2020 10:31:58
#15
yarik_py:
root.ids.what
Это что?
Параметром же вроде и передается элемент, под которым откроется.
yarik_py
(колотов ярослав)
04.Ноябрь.2020 10:34:38
#16
я пытался вот так:
app.dropdownkv.open(root.ids.what.pos)
root.ids.what
это id кнопки под которой нужно открыть меню(эта не та кнопка на которую надо нажать что бы меню открылось)
AlexP
(Alex P.)
04.Ноябрь.2020 10:47:35
#17
Так там сам виджет нужен, а не id.
app.dropdownkv.open(app.some_other_widget)
yarik_py
(колотов ярослав)
04.Ноябрь.2020 10:48:37
#18
а как назвать нужный виджет если он находится в kv файле и кнопок несколько
AlexP
(Alex P.)
04.Ноябрь.2020 10:52:56
#19
https://kivy.org/doc/stable/guide/lang.html#referencing-widgets
Добавить id
кнопке и просто использовать его как переменную.
app.dropdownkv.open(some_other_widget)
yarik_py
(колотов ярослав)
04.Ноябрь.2020 10:56:55
#20
вот кнопка под которой нужно открыть меню:
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__'