2013-03-05 99 views
0

我正在使用Kivy,一個Python庫,並且我無法使滾動視圖正常工作,並將其組織到.kv文件中。Kivy使用kivy語言和自定義小部件滾動查看

我有一個很大的系統,分解成許多.py和.kv文件。

我也使用kivy的屏幕管理

ui_manager.py

#ui_manager.py 
class UIManager(): 
    _ScreenManager = None 

    def __init__(self, inScreenManager): 
     self.ScreenManager = inScreenManager # The main app constructs the manager, sends to me, then returns it as the root widget. 

main.py

#main.py 
class MyApp(App): 
    def build(self): 
     screenManager = ScreenManager() 
     uiManager = ui_manager.UIManager(screenManager) 
     return screenManager 

很顯然,我中省略一些代碼,但是這是幾乎完全發生了什麼。

其中一個sc needs需要滾動。它將有一個長圖形和許多按鈕。 的Kivy文檔,像往常一樣,只是告訴我如何通過代碼來做到這一點,不是通過kivy語言(.kv文件) http://kivy.org/docs/api-kivy.uix.scrollview.html

我想一個類,OrangeWidget,保持滾動部件,這樣我就可以稍後再玩它的數據。 這是在獲得一個有組織的滾動視圖工作

orange_widget.py

#orange_widget.py 

class OrangeWidget(Screen): 
    pass 

class OrangeGraphic(Widget): 
    pass 

Orange.kv

<OrangeLineWidget> 
    ScrollView: 
     size_hint: (None, None) 
     size: (400, 1200) 

     OrangeLineGraphic: 
      pos: root.pos 

<OrangeGraphic> 
    canvas: 
     Color: 
      rgba: 1, .5, 0, 1  
     Rectangle: 
      pos: self.center_x - 15, 0 
      size: 30, self.height * 2 
    Label: 
     text: "Hello" 

我知道這是一個很多我的最好的嘗試,它不看良好的組織已經,但我只是想弄清楚如何讓dang的東西正常工作。

下面是當前的結果:它不會滾動,而不管是什麼原因,它已經「盒裝」的權利,而不是佔用整個屏幕 enter image description here

回答

2

在ML的回答,在這裏你沒有定義標籤POS機,你OrangeGraphic是一個簡單的小部件,而不是一個佈局,你需要做的是:

<OrangeGraphic> 
    canvas: 
     Color: 
      rgba: 1, .5, 0, 1  
     Rectangle: 
      pos: self.center_x - 15, 0 
      size: 30, self.height * 2 
    Label: 
     text: "Hello" 
     pos: root.pos 
     size: root.size 
+0

這適用於只是將其設置爲root.pos,把它放在滑塊的最左下角,但將按鈕/標籤移動到相對位置怎麼樣?如果你執行了y:root.y/2或size_hint =(。5,1),你會得到一些非常混亂的行爲 – MintyAnt 2013-03-06 16:15:36

+0

我不確定你說的是什麼搞砸的行爲,如果你把「 y:root.y/2「(你可能想要」center_y:root.center_y「,但在這種情況下這不是很大的區別),當root.y被更新時,y pos會被更新。爲了您使用size_hint,您只需讓孩子達到父母的一半寬度,但我沒有看到任何問題。我明白RelativeLayout解決方案更容易,但我認爲這個問題是在kivy中對位置和綁定的誤解。 – Tshirtman 2013-03-07 19:19:16

0

看起來像把戲,爲這個特殊的「滑動體」的屏幕,是使用一個「相對佈局「 https://groups.google.com/forum/#!topic/kivy-users/RwuI8QGm3fw

下面是更新後的代碼: orange_widget.py

class OrangeWidget(Screen): 

    def __init__(self, **kwargs): 
     super(OrangeWidget, self).__init__(**kwargs) 

     scrollView = ScrollView(size_hint=(1, 1)) 

     # add custom widget into that layout 
     customWidget = OrangeGraphicWidget(height=1200, size_hint_y=None) 
     #layout.bind(minimum_height=layout.setter('height')) 

     scrollView.add_widget(customWidget) 

     self.add_widget(scrollView) 

class OrangeGraphicWidget(RelativeLayout): 
    pass 

OrangeWidget.kv

<OrangeWidget> 

<OrangeGraphicWidget> 
    canvas: 
     Color: 
      rgba: 1, .5, 0, 1   
     Rectangle: 
      pos: self.center_x - 15, 20 
      size: 30, self.height - (self.height/10) 

    Button: 
     text: "Button 1" 
     pos: root.pos 
     size_hint: (None, None) 

    Button: 
     text: "Button 2" 
     pos_hint: {'center_x': .5, 'center_y': .95} 
     size_hint: (None, None)