【问题标题】:Kivy v1.9.1 canvas.clear() not working as expectedKivy v1.9.1 canvas.clear() 没有按预期工作
【发布时间】:2018-12-07 03:44:41
【问题描述】:

我不太确定为什么画布没有清理干净。

具有父变量的第一个 build(self) 实现是有效的。我看到的唯一不同是第二个实现是将 Button 小部件添加到 MyPaintWidget 而不是将这两个小部件都添加到默认的 Widget 类中。

对 kivy 很陌生,我对 python 有点熟悉。我想要一个解释。

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()

【问题讨论】:

    标签: python kivy


    【解决方案1】:

    触摸沿着小部件树分派,它们从根小部件进入,该小部件必须将触摸传递给其子级(或者如果需要,则不这样做)。

    您的 MyPaintWidget 类覆盖 on_touch_down 但未能将触摸传递给其子级,因此 Button 永远不会收到触摸并且永远没有机会被按下。

    return super(MyPaintWidget, self).on_touch_down(touch) 添加到MyPaintWidget.on_touch_down 以调用自动为您处理此问题的父类方法。

    【讨论】:

    • 所以在我更改代码后,触摸被识别,但现在按下清除按钮后,清除按钮“消失”......我想知道为什么
    • 是不是因为clear()清除了子widgetButton给出的图形指令?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-19
    • 2020-03-18
    • 2012-06-14
    • 2014-11-15
    • 1970-01-01
    • 2012-07-02
    • 2011-09-07
    相关资源
    最近更新 更多