【问题标题】:Widget function's sharing unwanted properties [kivy]小部件功能共享不需要的属性 [kivy]
【发布时间】:2020-12-16 10:23:27
【问题描述】:

我有两个小部件,一个正文和一个标题。每当我单击标题时,我都想打印出“标题小部件已被按下”。问题是,如果我单击正文(或窗口中的任何位置),它还会返回“已按下 Header Widget。”

gui.py

class header(Widget):
    def on_touch_down(self, touch):
        print('Header Widget has been pressed')

class body(Widget):
    pass

class gui(Widget):
    pass
    def __init__(self, **kwargs):
        super().__init__(**kwargs)

        self.add_widget(body())
        self.add_widget(header())

class MainApp(App):
    def build(self):
        Window.borderless = True
        self.gui = gui()
        return self.gui

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

Main.kv

<body>:
    canvas.before:
        Rectangle:
            pos: 0,0
            size: 249, 228 -39
            source: "./assets/background.png"

<header>:
    canvas.before:
        Rectangle:
            pos: 0, 228 -39
            size: 249, 39
            source: "./assets/header.png"

我确保正文不会与标题重叠。

【问题讨论】:

    标签: python kivy


    【解决方案1】:

    请记住,on_touch_down()on_touch_move()on_touch_up() 涉及整个应用程序,而不仅仅是我们声明的类。所以我们需要检查触摸是否在类内。

    首先,您没有定位header 小部件,仅定位Rectangle,因此我们必须修复此问题才能正确获得点击:

    <header>:
        pos: 0, 228 -39
        size: 249, 39
        canvas.before:
            Color:
                rgba: 1, 0, 0, 1
            Rectangle:
                pos: 0, 228 -39
                size: 249, 39
                source: "./assets/header.png"
    

    现在我们可以检查触摸是否在小部件内部。为此,我们将使用collide_point 函数来检查触摸是否与我们的header 发生碰撞:

    def on_touch_down(self, touch):
        if self.collide_point(*touch.pos):
            print('Header Widget has been pressed')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-12
      • 2010-10-31
      相关资源
      最近更新 更多