Kivy v1.9.1 canvas.clear () не работает должным образом - PullRequest
0 голосов
/ 06 декабря 2018

Я не совсем уверен, почему холст не очищается.

Первая реализация (собственная), которая имеет родительскую переменную, работает.Единственное, что я вижу по-разному, это то, что вторая реализация добавляет виджет Button в MyPaintWidget вместо того, чтобы оба этих виджета добавлялись в класс Widget по умолчанию.

Очень плохо знаком с kivy, я немного знаком спитон.Я бы с удовольствием объяснил.

from random import random
import kivy
kivy.require('1.9.1')
from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.widget import Widget
from kivy.uix.label import Label
from kivy.uix.textinput import TextInput
from kivy.uix.gridlayout import GridLayout
from kivy.graphics import Color, Ellipse, Line

'''
class LoginScreen(GridLayout):
    def __init__(self, **kwargs):
        super(LoginScreen, self).__init__(**kwargs)
        self.cols=2
        self.add_widget(Label(text='User Name'))
        self.username=TextInput(multiline=False)a
        self.add_widget(self.username)
        self.add_widget(Label(text='password'))
        self.password=TextInput(password=True, multiline=False)
        self.add_widget(self.password)

class MainApp(App):
    def build(self):
            return LoginScreen()

'''
class MyPaintWidget(Widget):

    def on_touch_down(self, touch):
        color = (random(), 1, 1)
        with self.canvas:
            Color(*color)
            d = 30.
            Ellipse(pos=(touch.x - d / 2, touch.y - d / 2), size=(d, d))
            touch.ud['line'] = Line(points=(touch.x, touch.y))
        print(touch)

    def on_touch_move(self, touch):
        touch.ud['line'].points += [touch.x, touch.y]

class MyPaintApp(App):

#WHY ARE THESE TWO IMPLEMENTATIONS OF BUILD SO DIFFERENT?????
    '''
    def build(self):
        parent = Widget()
        self.painter = MyPaintWidget()
        clearbtn = Button(text='Clear')
        clearbtn.bind(on_release=self.clear_canvas)
        parent.add_widget(self.painter)
        parent.add_widget(clearbtn)
        return parent
    '''
    def build(self):
        self.painter = MyPaintWidget()
        clearbtn = Button(text='Clear')
        clearbtn.bind(on_release=self.clear_canvas)
        self.painter.add_widget(clearbtn)
        return self.painter

    def clear_canvas(self, obj):
        self.painter.canvas.clear()

if __name__ == '__main__':
    MyPaintApp().run()

1 Ответ

0 голосов
/ 06 декабря 2018

Прикосновения отправляются вниз по дереву виджетов, они входят в корневой виджет, который должен передать касание его дочерним элементам (или не может сделать это, если хочет).

Ваш MyPaintWidget класс переопределяетon_touch_down, но не может передать касание своим дочерним элементам, поэтому кнопка никогда не получает касание и никогда не получает шанс стать нажатой.

Добавьте return super(MyPaintWidget, self).on_touch_down(touch) в MyPaintWidget.on_touch_down для вызова метода родительского класса, который автоматическиобрабатывает это для вас.

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