2016-09-20 61 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)來阻止它使用窗口尺寸。