2016-09-20 8 views
0

私は基本的に、散布図のサイズではなく、プログラムを表示しているウィンドウのサイズによって完全に定義されている唯一の「グラバブル」散布領域に関する問題に取り掛かります。ここでKivy散布領域はウィンドウサイズに制限されています

は、バグの作業例です:私の画面で

from kivy.app import App 
from kivy.uix.widget import Widget 
from kivy.uix.button import Button 
from kivy.uix.gridlayout import GridLayout 
from kivy.uix.scatter import Scatter 

class AppFrame(GridLayout): 
    def __init__(self,**kwargs): 
     super(AppFrame,self).__init__(**kwargs) 
     self.myscatter=Scatter(
      width=2000, 
      height=200, 
      do_rotation=False, 
      do_scale=True, 
      do_translation=True) 
     self.add_widget(self.myscatter) 
     self.layout=GridLayout(cols=30,width=2000,height=200) 
     self.myscatter.add_widget(self.layout) 

     for i in range(300): 
      self.layout.add_widget(Button(text=str(i))) 

class TestApp(App): 
    def build(self): 
     return AppFrame(cols=3) 

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

、私は右(ボタンで増加する)に移動する散乱を使用している場合、私は何も過去のボタンをつかむことはできません〜10 -11。私の画面のサイズを変更すると、もう少し遠ざかることがあります。画面を小さくすると、グラブ可能な領域が縮小し、到達できなくなる可能性があります。どのように私はこれを解決することができますか?

私はAndroidエミュレータでKivy環境を使用していますので、かなり大きな画面があります。残念ながら、これを電話機に移動すると、画面サイズが大幅に縮小され、このバグによりスクロールが無効になります。

(。トップレベルのレイアウトは、メニューを追加するためである、それはバグを再作成する必要はありませんように、実際のメニューは、この例には含まれません)

私が把握しようとしている主なものは以下のとおりです。

  1. これはコードまたはAndroidのエミュレータでの問題ですか?
  2. コードに問題がある場合、修正することができますか?
  3. 解決できない場合はどうすればこの機能を利用できますか?

更新日: ジョージ・ボウからのコメントの後、私はスキャッターのBBOX内にある問題を切り分けました。作成時に、スキャッタボックスのサイズは2000x200です。ただし、ウィンドウの作成後は、800x600(ポップアップする画面のデフォルトサイズ)です。

わかりやすく、これを修正する方法を理解できません。任意のポイント(ボタン内)でスキャターの幅/高さを変更すると、平行移動/ズームが発生するたびにすぐに800x600にリセットされます。誰もが自動的にBboxのサイズをウインドウに自動的に変更させないようにする方法を知っていますか?

+0

私はあなたの問題の答えを見つけることができませんでしたが、私は何かを見ました。ボタンは、表示可能な画面内にある場合にのみクリック可能で、外側にあるものはクリック可能ではありません。これを解決するには、スキャッタパラメータに 'do_collide_after_children = True'を追加すると、すべてのボタンがクリック可能になります。また、私が見たところでは、Scatter領域はButton領域上にあるということでした。私はそれが意図されているか、あなたが一致させることを望んでいないか分かりません。 –

+0

これは実際に非常に役に立ちます。これは、スキャッタのバウンディングボックスの問題を絞り込んだものです。私は、ウィンドウが作成された後、スキャターのバウンディングボックスがウィンドウのサイズにリサイズされることを発見しました。つまり、__init__の間にバウンディングボックスを印刷すると、それは想定されるサイズで表示されますが、ボタンを押して印刷すると、はるかに小さくなります。 –

答えて

1

私はバニラスキャッタオブジェクト自体でそれを行う方法を理解できませんでしたが、十分にうまくいくと思われる回避策を作成しました。

基本的に、スキャッターは、そのクラスのcollide_pointメソッドで取得可能なものを制御します。このクラスは幅と高さを参照します(刺激的に不変です)。ですから、私はcollide_pointメソッドを何か変更可能なもので上書きするカスタムのスキャッタクラスを作成することで作業する必要があります。

class CustScatter(Scatter): 
    def collide_point(self, x, y): 
     x, y = self.to_local(x, y) 
     return 0 <= x <= self.xboundval and 0 <= y <= self.yboundval 
    def custSetBounds(self,xval,yval): 
     self.xboundval=xval 
     self.yboundval=yval 

これを使用するには、私はちょうど私がクラスのインスタンスを作成した直後の境界(custSetBounds)を設定してください。

Kivy 本当には、私がこれに自分自身を走った

1

...私はTkinterのを欠場ます。 size_hint =(None、None)を追加すると、ウィンドウのサイズを使用できなくなります。

関連する問題