Я хотел бы использовать значение, выбранное в раскрывающемся меню в другом месте кода, в частности, для заполнения класса MyData.
Немного предыстории: на мой оригинальный вопрос о том, как заставить кнопки работать, был дан ответ здесь (спасибо). Этот ответ показывает, как печатать значение, когда оно выбрано. Однако я не могу получить доступ или распечатать выделение где-либо, кроме оператора * 1007. *.
В следующем коде есть несколько простых операторов печати, чтобы показать значения, которые я пытаюсь отследить. Комментарии выше объясняют вывод.
Мои основные вопросы:
1) Почему значения pos по умолчанию печатаются каждый раз, когда вызывается MyPopup? (Примечание: значения, которые я передаю при вызове MyPopup, печатаются сразу после.)
2) Как получить выбор цвета из MyColor?
3) Что именно означает «self.drop». bind (on_select = лямбда-экземпляр, x: setattr (self, 'text', x)) 'do? Если он устанавливает «self.text» для выбора, как мне получить доступ к этому значению (примечание: «self.text» не дает мне цвет).
4) Как получить pos и цвет в MyData?
.py:
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.lang import Builder
from kivy.uix.dropdown import DropDown
from kivy.uix.popup import Popup
from kivy.uix.button import Button
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.graphics import Color, Rectangle
from kivy.factory import Factory
class AddTouch(Widget):
def __init__(self, **kwargs):
super(AddTouch, self).__init__(**kwargs)
with self.canvas:
Color(1, 0, 0, 0.5, mode="rgba")
self.rect = Rectangle(pos=(0, 0), size=(10, 10))
def on_touch_down(self, touch):
self.rect.pos = touch.pos
def on_touch_move(self, touch):
self.rect.pos = touch.pos
def on_touch_up(self, touch):
# final position
self.rect.pos = touch.pos
MyPopup(pos=touch.pos)
class MyPopup(Popup):
def __init__(self, pos=[0,0]):
super(MyPopup, self).__init__(pos=[0,0])
self.pos = pos
self.title = 'Select Color'
self.color = MyColor.text
# when MyPopup is called this first prints:
# from MyPopup [0, 0], <StringProperty name=text>
# then immediately prints (for example)
# from MyPopup [758.0, 500.0], <StringProperty name=text>
print('from MyPopup {}, {}'.format(self.pos, self.color))
def save(self):
# when save button is clicked this prints:
# from MyPopup.save [0, 0], <StringProperty name=text>
print('from MyPopup.save {}, {}'.format(self.pos,self.color))
MyData(self.pos, self.color)
class MyColor(Button):
def __init__(self, **kwargs):
super(MyColor, self).__init__(**kwargs)
self.drop = DropDown()
colorlist = ['black', 'red', 'orange', 'yellow', 'green', 'blue', 'purple', 'pink', 'white']
for index in colorlist:
btn = Button(text='%s' % index, size_hint_y=None, height=44)
btn.bind(on_release=lambda btn: self.drop.select(btn.text))
self.drop.add_widget(btn)
self.bind(on_release=self.drop.open)
# I thought this would 'setattr' of self.text to the selected value
self.drop.bind(on_select=lambda instance, x: setattr(self, 'text', x))
class MyData:
def __init__(self, pos,color):
# this prints :
# from MyData [0, 0], <StringProperty name=text>
print('from MyData {}, {}'.format(pos,color))
# using kivy screen for consistency
class MainWindow(Screen):
pass
class WindowManager(ScreenManager):
pass
kv = Builder.load_file("dropdown.kv")
class MyMainApp(App):
def build(self):
return kv
if __name__ == "__main__":
MyMainApp().run()
.kv:
#:import Factory kivy.factory.Factory
WindowManager:
MainWindow:
<MainWindow>:
name: "main"
AddTouch:
on_touch_up:
Factory.MyPopup().open()
<MyPopup>:
text:'Enter Data'
auto_dismiss: False
FloatLayout:
MyColor:
text: 'Value'
size_hint: 1,0.5
pos_hint: {"x": 0,"top":1}
Button:
text: 'Save'
size_hint: 1,0.5
pos_hint: {"x": 0,"top":0.5}
on_press: root.save()
on_release: root.dismiss()