Создание класса данных из выпадающего меню с помощью on_touch_up - PullRequest
0 голосов
/ 25 февраля 2020

Я хотел бы заполнить MyData информацией, собранной из выпадающих меню, которые отображаются во всплывающем окне с "on_touch_up" в AddTouch. Эти данные включают в себя позицию «on_touch_up», в дополнение к раскрывающимся данным. Я могу напечатать позицию в классе AddTouch, но мне трудно переносить данные дальше в моем скрипте, используя (например: print ('from MyMainApp: {}'. Format (MyData.pos))) ,

Я также не могу отобразить "mainbutton" или "dropdown" во всплывающем окне.

Взломать с этим Я придумал следующее, которое работает, но не делает то, что мне нужно

.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

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.pos = touch.pos
        print(self.pos)

class MyPopup(Popup):
    def __init__(self, **kwargs):
        super(MyPopup, self).__init__(**kwargs)
        # create a main button
        self.mainbutton = Button(text='Hello', size_hint=(None, None))
        # create a dropdown with 10 buttons
        self.dropdown = DropDown()
        for index in range(10):
            btn = Button(text='Value %d' % index, size_hint_y=None, height=44)
            btn.bind(on_release=lambda btn: self.dropdown.select(btn.text))
            self.dropdown.add_widget(btn)
        self.mainbutton.bind(on_release=self.dropdown.open)
        self.dropdown.bind(on_select=lambda instance, x: setattr(self.mainbutton, 'text', x))

class MyData:
    def __init__(self, **kwargs):
        super(MyData, self).__init__(**kwargs)
        self.pos=AddTouch.pos

# using kivy screen for consistency
class MainWindow(Screen):
    pass   
class WindowManager(ScreenManager):
    pass    
kv = Builder.load_file("dropd.kv")
class MyMainApp(App):
    def build(self):
        return kv
        print('from MyMainApp: {}'.format(MyData.pos))

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

.kv

WindowManager:
    MainWindow:

<MainWindow>:
    name: "main"
    AddTouch:
        on_touch_up:
            #MyPopup gives 'MyPopup' is not defined, even if I add <MyPopup>: below
            #root.MyPopup gives 'MainWindow' object has no attribute 'MyPopup'

Я попытался добавить простой динамический c всплывающий класс в файл .kv на основе this , но опять-таки говорится, что «MyPopup» не определено:

.kv

AddTouch
    on_touch_up:
        MyPopup

<MyPopup@Popup>:
    auto_dismiss: False
    Button:
        text: 'Close me!'
        on_release: root.dismiss()

Чего мне не хватает (кроме опыта, способностей и общего интеллекта)?

1 Ответ

0 голосов
/ 26 февраля 2020

Помимо добавления строки:

self.content = self.mainbutton

к методу MyPopup __init__(), вы можете запустить создание MyPopup, изменив файл .kv следующим образом:

#:import Factory kivy.factory.Factory

WindowManager:
    MainWindow:

<MainWindow>:
    name: "main"
    AddTouch:
        on_touch_up:
            Factory.MyPopup().open()
...