2017-06-11 7 views
0

私はKivyを使用してイベントを延期しようとしています。具体的には、画面にテキストラベルを表示してから、N秒後に削除します。 これまで私はtime.sleepが仕事をしないことを理解しています。代わりに、私は別の関数(eraser()と呼ばれる)を作成して、画面上にあるものを削除してから、Clock.schedule_once(eraser, n)を使って呼び出しようとします。誰もがそうする権利/より良い方法を考えることができれば、実際に働いていないKivyによるスケジュール操作

class myLayout(FloatLayout): 
    def eraser(self): 
     self.canvas.clear() 

    def _keyboard_on_key_down(self, keyboard, keycode, text, modifiers): 
     self.canvas.clear() 

     global i 
     i = i + 1 
     initialy = 400-(stim_list[i]/2) 
     xlab = Label(text='X', pos=(0, 350)) 

     with self.canvas: 
      self.add_widget(xlab) 
      Color(1., 1, 1) 
      Rectangle(pos=(initialx, initialy), size=(stimwidth, stim_list[i])) 

     Clock.schedule_once(eraser(),3) 

が、私は感謝:

は、これは私がこれまで持っているものです。

答えて

1

WidgetCanvasので、唯一のキャンバスを清掃、全く異なるものですが、明らかにFloatLayoutが実際にそれらを削除せずに子としてLabelウィジェットのたくさんを持つことになります。この手法でウィジェット自体と、最終的には削除されません - あなたは:)

ウィジェットはadd_widget()remove_widget()clear_widgets()呼び出しを使用して、あなたが実際にそれは次のように動作する必要がある場合は、はい、それもそのように動作しても、それらのそれぞれは、with <canvas>ブロックの外にあるかどうリークそれを呼び出しますそれ。一方、

Clock.schedule_once()コールはあなたのケースで(Noneある)eraser()の戻り値はちょうどであるあなたがそれに渡す関数/メソッドを使用し、あなたがそれを書いた場所と同じ場所で関数を実行しますかっこ(eraser()→電話eraser→単なる機能)。したがって

  • 使用add_widget()remove_widget()clear_widgets()
    • が必要な場合を除きwith <canvas>ブロックにそれらを配置していない(ほとんどないです!)
  • 関数を渡します/メソッドの引数ではなく、返される値(かっこは使用しないでください)

例:

from kivy.clock import Clock 
from kivy.lang import Builder 
from kivy.uix.label import Label 
from kivy.base import runTouchApp 
from kivy.uix.floatlayout import FloatLayout 

Builder.load_string(''' 
<Test>: 
    Button: 
     size_hint: None, None 
     on_release: root.test() 
''') 


class Test(FloatLayout): 
    def eraser(self, *args): 
     self.clear_widgets() 

    def test(self, *args): 
     lab = Label(text='Hello world!') 
     self.add_widget(lab) 
     Clock.schedule_once(self.eraser, 3) 


runTouchApp(Test()) 
+0

アメージング。魅力のように動作します。 –

関連する問題