Добавить виджет при нажатии мыши в графическом интерфейсе - kivy python

У меня проблема с добавлением и отображением изображения в макете каждый раз, когда я нажимаю на экран с помощью мыши.

class Myszka(ClickAndGo, Widget):

    def on_touch_down(self, touch):
        super().build()
        flaga_path = os.path.join(self.img_path, "test.png")
        x, y = touch.pos
        self.flaga = Image(source=flaga_path, size_hint=(None, None), size=(64, 64),
                           pos=(round(x, 1), round(y, 1)))
        self.camlayout.add_widget(self.flaga)
        print(touch.pos)
  • Фактические результаты: печатается только положение касания, изображение не было показано.
  • Ожидаемые результаты: Изображение должно было отображаться при каждом нажатии мыши.

Что такое наследование/виджет для ClickAndGo?

ikolim 28.05.2019 20:40

Является ли camlayout атрибутом класса типа Objectproperty?

ikolim 29.05.2019 02:22

@ikolim self.camlayout = FloatLayout(size=(100, 100)) и ClickAndGo наследует от app - class ClickAndGo(App)

jasiekkm 29.05.2019 11:15

Укажите минимальный и воспроизводимый пример, чтобы мы могли воспроизвести проблему.

ikolim 29.05.2019 15:56

@ikolim смотрите мой ответ ниже

jasiekkm 02.06.2019 19:01
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
5
213
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

@ikolim

from kivy.app import App
from kivy.uix.floatlayout import FloatLayout


class ClickAndGo(App):
    def build(self):
        self.camlayout = FloatLayout(size=(100,100))
        self.myszka = Myszka()

        self.camlayout.add_widget(self.myszka)

        return self.camlayout

class Myszka(ClickAndGo, Widget):

    def on_touch_down(self, touch):
        super().build()
        # test.png -> any image
        flaga_path = os.path.join(self.img_path, "test.png")
        x, y = touch.pos
        self.flaga = Image(source=flaga_path, size_hint=(None, None), size=(64, 64),
                           pos=(round(x, 1), round(y, 1)))
        self.camlayout.add_widget(self.flaga)
        print(touch.pos)

И каждый раз, когда я щелкал мышью, я хотел бы показывать изображение в позиции на основе touch.pos

jasiekkm 30.05.2019 08:49
Ответ принят как подходящий

Проблема

I have problem with adding and showing image to the layout every time I press the screen using mouse.

Основная причина

Изображение не отображается, потому что оно добавляется к локальному атрибуту self.camlayout в методе on_touch_down()из class Myszka().

Решение

Замените self.camlayout.add_widget(self.flaga) на App.get_running_app().root.add_widget(self.flaga), т.е. получите экземпляр корня (camlayout).

Фрагменты - ру

class Myszka(Widget):

    def on_touch_down(self, touch):
        ...
        App.get_running_app().root.add_widget(self.flaga)

Пример

В следующем примере показано добавление Image в месте щелчка мыши по FloatLayout.

main.py

import os
from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.image import Image


class Mouse(FloatLayout):

    def on_touch_down(self, touch):
        img_path = "/home/iam/Pictures/AppImages"
        flag_path = os.path.join(img_path, "Android_celebrate.png")
        flag = Image(source=flag_path, size_hint=(None, None), size=(64, 64),
                     pos=(round(touch.pos[0], 1), round(touch.pos[1], 1)))
        self.add_widget(flag)


class TestApp(App):

    def build(self):
        return Mouse()


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

Выход

Result

блин, так здорово братан. Ура <33

jasiekkm 03.06.2019 18:03

Другие вопросы по теме