Значения из классов виджетов (например, раскрывающийся список) с использованием python и kivy - PullRequest
1 голос
/ 21 марта 2020

Я хотел бы использовать значение, выбранное в раскрывающемся меню в другом месте кода, в частности, для заполнения класса 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()

1 Ответ

0 голосов
/ 21 марта 2020

Вы можете ввести свои подвиджеты, используя идентификаторы:

<MyPopup>:
    text:'Enter Data'
    auto_dismiss: False
    FloatLayout:
        MyColor:
            id: MyColor
            text: 'Value'
            size_hint: 1,0.5
            pos_hint: {"x": 0,"top":1}
        Button:
            id: Button1
            text: 'Save'
            size_hint: 1,0.5
            pos_hint: {"x": 0,"top":0.5}
            on_press: root.save()
            on_release: root.dismiss()

, и теперь в вашем .py файле вы можете получить доступ к виджетам следующим образом:

class MyPopup(Popup):
    def some_function(self):
        print(self.ids.Button1.text)
        print(self.ids.MyColor.size_hint)

альтернативный синтаксис:

print(self.ids["Button1"].text)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...