2017-12-05 8 views
2

私はkivyで簡単な描画アプリケーションを作成しようとしていますが、それは単に特定のウィジェットクラス全体についてではなく、私はon_touch_downウィジェットを具体的にするにはどうすればよいですか?

on_touch_down 

機能を持ついくつかの問題を抱えています。ですから、私がon touch onとon touchの移動機能を使ってキャンバスに描画すると、ボタンに割り当てられたタッチダウン機能に影響を与え、効果的に無効にします。ここでボタンが動作しないコードがあります。

のpythonコード:

from kivy.app import App 
from kivy.uix.screenmanager import ScreenManager, Screen 
from kivy.graphics import Line 
from kivy.graphics import * 
from kivy.uix.widget import Widget 
class MyScreenManager(ScreenManager): 
    pass 

class MenuScreen(Screen): 
    pass 

class DrawScreen(Screen): 
    def on_touch_down(self, touch): 
     with self.canvas.before: 
      Color(1, 0, 0) 
      touch.ud["line"] = Line(points=(touch.x, touch.y), width=5) 

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



class DrawApp(App): 
    def build(self): 
     return MyScreenManager() 

DrawApp().run() 

kivyコード:

<[email protected]>: 
    font_size: 65 
    size_hint: 0.4, 0.25 

<MyScreenManager>: 
    MenuScreen: 
     id: menu 
     name: "menu" 

    DrawScreen: 
     id: draw 
     name: "draw" 

<MenuScreen>: 
    canvas.before: 
     Color: 
      rgba: 1,1,1,1 
     Rectangle: 
      size: self.size 
      pos: self.pos 

    MenuButton: 
     text: "Draw" 
     on_release: root.manager.current = "draw" 
     pos_hint:{"center_x":0.5, "center_y":0.6} 
    MenuButton: 
     text: "Quit" 
     on_release: app.stop() 
     pos_hint:{"center_x":0.5, "center_y":0.3} 

<DrawScreen>: 
    canvas.before: 
     Color: 
      rgba: 1,1,1,1 
     Rectangle: 
      size: self.size 
      pos: self.pos 


    Button: 
     id: but 
     size_hint: 0.2,0.1 
     pos_hint_x: 0 + self.width 
     font_size: 30 
     text: "Back" 
     on_release: root.manager.current = "menu" 

私はここに私の問題を回避するコードだ、collide_pointを使用して周りに簡単な仕事を見つけるために管理:

class DrawScreen(Screen): 
    def on_touch_down(self, touch): 
     but = self.ids.but 
     if but.collide_point(touch.x, touch.y): 
      self.manager.current = "menu" 

     else: 
      with self.canvas.before: 
       Color(1, 0, 0) 
       touch.ud["line"] = Line(points=(touch.x, touch.y), width=5) 

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

しかし、しばらくこれは、私が手動で各ボタンをchに設定しなければならないような、新しい問題の世界全体を引き起こしますボタンを離すとその機能は実行されません。つまり、クラスに追加するすべてのものをifステートメントに追加する必要があります。

私は、より単純な方法が必要であることは非常に肯定的です。私の最初の考えは、たぶん1つのウィジェットにしか影響を与えないようにタッチを追加できるかもしれないということでした。私の2番目の考えは、キャンバスや何かを描かないほうがいいと思うかもしれませんね?

ありがとうございました!あなたがメソッドを上書きするとき

答えて

1

、あなたは

何かのようにスーパークラスの同じメソッドを返す必要があります。

... 

class DrawScreen(Screen): 
    def on_touch_down(self, touch): 
     with self.canvas.before: 
      Color(1, 0, 0) 
      touch.ud["line"] = Line(points=(touch.x, touch.y), width=5) 
     return super(DrawScreen, self).on_touch_down(touch) 

    def on_touch_move(self, touch): 
     touch.ud["line"].points += (touch.x, touch.y) 
     return super(DrawScreen, self).on_touch_move(touch) 
関連する問題