我基本上遇到的问题是唯一的“可抓取”分散区域完全由我正在查看程序的窗口大小定义,而不是分散的大小。
这是一个臭虫的工作示例:
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有效地禁用滚动。
(顶层布局用于添加菜单。实际菜单不包含在此示例中,因为没有必要重新创建错误)
我想弄清楚的主要事情是:
更新: 在George Bou的评论之后,我已经将问题分离到散布的BBOX中。在创建时,散点图框大小为2000x200。但是,在创建窗口后,它是800x600(弹出屏幕的默认大小)。
令人讨厌的是,我无法弄清楚如何解决这个问题。如果我在任何点(即按钮)更改散射的宽度/高度,每当发生平移/缩放时,它立即重置为800x600。任何人都知道如何使分散停止自动调整其bbox的大小到窗口?
答案 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 =(无,无)以阻止它使用窗口尺寸。