2016-05-19 11 views
0

私のKivyアプリケーションのScrollViewの周りに境界線を描きたいと思います。問題は、ScrollViewの内容がウィジェット内に描画しているので、その境界線が重なってしまうことです。これらのいずれかが可能な解決策である場合
は、だから私は思ったんだけど:KivyのScrollViewsを扱う

  • 私は、ウィジェットの境界の外描くことができますどのように?
    キャンバス要素の一部をウィジェットの外に移動しようとすると、単にその部分が切り取られますが、これは驚くことではありません。おそらく私はこの外に別のウィジェットを作ってそれを描くことができたでしょうか?
  • どのようにしてScrollViewのコンテンツを制限できますか?では、スクロールの境界を変更することはできますか?私が意味することは、子どもたちがウィジェットのある点を越えて境界線に触れないようにすることではないということです。

問題を示すいくつかのテストコードがあります。これは少し修正された公式の例です。ボタンは、私はしたくないものですこれは、スクロール緑の境界線をオーバーラップ:

from kivy.app import App 
from kivy.lang import Builder 
from kivy.uix.button import Button 
from kivy.uix.scrollview import ScrollView 
from kivy.uix.gridlayout import GridLayout 

Builder.load_string(''' 
<ScrollView>: 
    canvas: 
     Color: 
      rgba: 1, 1, 1, 1 
     Rectangle: 
      pos: self.pos 
      size: self.size 
     Color: 
      rgba: 0, 1, 0, 1 
     Line: 
      points: self.x, self.y + self.height,\ 
      self.x + self.width, self.y + self.height,\ 
      self.x + self.width, self.y, self.x, self.y,\ 
      self.x, self.y + self.height 
      width: 1.2 
''') 

class TestApp(App):     
    def build(self): 
     layout = GridLayout(cols=1, padding=10, spacing=10, 
          size_hint=(None, None), width=500) 
     layout.bind(minimum_height=layout.setter('height')) 
     for i in range(30): 
      btn = Button(text=str(i), size=(480, 40), 
         size_hint=(None, None)) 
      layout.add_widget(btn) 

     root = ScrollView(size_hint=(None, None), size=(500, 320), 
          pos_hint={'center_x': .5, 'center_y': .5}, do_scroll_x=False) 
     root.add_widget(layout) 
     return root 

TestApp().run() 

答えて

1

はどのようにして、ウィジェットの境界の外に引き出すことができますか? キャンバス要素の一部をウィジェットの外に移動しようとすると、単にその部分が切り取られますが、これは驚くことではありません。おそらく私はこの外に別のウィジェットを作ってそれを描くことができたでしょうか?

本当にあなたがそれを意味するものではありません。 には境界がありません。ただし、Stencilを使用する場合を除きます。 ScrollViewの外側に描画しようとすると、元々はStencilが使用されていたため、ウィジェットのスペースのコンテンツは非表示になり、不要なコンテンツは非表示になり、hereのようにスクロールできます。

ここでその重複について説明します。 canvas.afterの前には、Colorは、ウィジェットが描画された後に描画されます。背景のために使用されるcanvas.beforeに似ています。ウィジェットがそうであるように基本canvas

canvas: 
    Color: 
     rgba: 1, 1, 1, 1 
    Rectangle: 
     pos: self.pos 
     size: self.size 
canvas.after: 
    ... 

は、「同じ」の時間に関係なく、あなたが何を一番上にしないであろう、後に描かれているので、項目を描かれています。 afterはすべてがその順序で再び描画された後に描画され、beforeはウィジェットがまったく描画されない前に同じことを行います。

どのようにしてScrollViewのコンテンツを制限できますか?では、スクロールの境界を変更することはできますか?私が意味することは、子どもがウィジェットの特定の点を越えて境界線に触れないようにしたくないということです。

レイアウトを使用して、 FloatLayoutpos_hintまたはBoxLayoutは必要に応じて変わりますので、基本的には[0、0]から[幅、高さ]、つまりレイアウトのサイズ(正しく使用する場合)の仮想矩形にウィジェットをプッシュします。

+0

はい、私は 'ScrollView'の外に描画したかったのです。私が外に線を描こうとしたとき、それは単に現れなかった。私は 'canvas.after'の解決策がちょうど私がそれをしたいのと同じように働いて以来、実際には今は重要ではないと思う。 – Leva7

+0

うん、私の答えを更新しました:) – KeyWeeUsr