2016-09-20 64 views
0

我基本上遇到了问题,只有“grabbable”散布区域完全由我正在查看程序的窗口大小定义,而不是散布大小。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. 如果无法修复,我还能如何获得此功能?

UPDATE: 从乔治和尚的评论后,我已经分离出的问题是分散的BBOX内。创建时,分散的bbox大小为2000x200。但是,创建窗口后,它是800x600(弹出屏幕的默认大小)。

令人烦恼的是,我无法弄清楚如何解决这个问题。如果我在任何点(即按钮中)更改散点图的宽度/高度,则每当发生平移/缩放时,立即将其重置为800x600。任何人都知道如何使散射停止自动调整其窗口的bbox?

+0

我找不到你的问题的答案,但我看到了别的东西。只有当按钮处于可查看屏幕内时,按钮才可点击,而外部按钮不可点击。为了解决这个问题,在Scatter参数中加入'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 真的让我怀念的Tkinter ...

1

我遇到了这个自己。添加size_hint =(None,None)来阻止它使用窗口尺寸。