Kivy散射区域仅限于窗口大小

时间:2016-09-20 05:34:32

标签: python 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。如果我调整屏幕大小,我可以抓得更远。如果我将屏幕缩小,可抓取区域会缩小甚至可能无法访问。我怎么能解决这个问题呢?

我正在使用Kivy环境和Android模拟器,所以我有一个非常大的屏幕。不幸的是,如果我把它移到手机上,屏幕尺寸会显着缩小,这使得这个bug有效地禁用滚动。

(顶层布局用于添加菜单。实际菜单不包含在此示例中,因为没有必要重新创建错误)

我想弄清楚的主要事情是:

  1. 这是代码还是android模拟器的问题?
  2. 如果代码出现问题,可以修复吗?
  3. 如果无法修复,我还能如何获得此功能?
  4. 更新:  在George Bou的评论之后,我已经将问题分离到散布的BBOX中。在创建时,散点图框大小为2000x200。但是,在创建窗口后,它是800x600(弹出屏幕的默认大小)。

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

2 个答案:

答案 0 :(得分:1)

确定。我无法找到一种方法来使用vanilla散射对象本身,但我做了一个似乎运作良好的解决方法。

基本上,分散控制通过其类中的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 :(得分:1)

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