2016-05-19 3 views
0

Я хочу нарисовать границу вокруг ScrollView в моем приложении Kivy. Проблема в том, что содержимое ScrollView перекрывает эту границу, поскольку я рисую ее внутри виджета.
Так мне интересно, если один из них является одним из возможных решений:Работа с ScrollViews в Kivy

  • Как я могу рисовать вне границ виджета?
    Когда я попытался переместить часть элемента холста вне виджета, он просто отрезал эту часть, что неудивительно. Возможно, я мог бы сделать еще один виджет за пределами этого и нарисовать его?
  • Как ограничить содержимое ScrollView? Итак, могу ли я изменить границы прокрутки? Я имею в виду, что я не хочу, чтобы дети выходили за рамки определенного момента в виджетах, чтобы они не касались границы.

Вот несколько тестовых кодов для демонстрации проблемы. Это слегка измененный официальный пример. Кнопки перекрываться зеленой границы при прокрутке, которая является то, что я не хочу:

from kivy.app import App 
from kivy.lang import Builder 
from kivy.uix.button import Button 
from kivy.uix.scrollview import ScrollView 
from kivy.uix.gridlayout import GridLayout 

Builder.load_string(''' 
<ScrollView>: 
    canvas: 
     Color: 
      rgba: 1, 1, 1, 1 
     Rectangle: 
      pos: self.pos 
      size: self.size 
     Color: 
      rgba: 0, 1, 0, 1 
     Line: 
      points: self.x, self.y + self.height,\ 
      self.x + self.width, self.y + self.height,\ 
      self.x + self.width, self.y, self.x, self.y,\ 
      self.x, self.y + self.height 
      width: 1.2 
''') 

class TestApp(App):     
    def build(self): 
     layout = GridLayout(cols=1, padding=10, spacing=10, 
          size_hint=(None, None), width=500) 
     layout.bind(minimum_height=layout.setter('height')) 
     for i in range(30): 
      btn = Button(text=str(i), size=(480, 40), 
         size_hint=(None, None)) 
      layout.add_widget(btn) 

     root = ScrollView(size_hint=(None, None), size=(500, 320), 
          pos_hint={'center_x': .5, 'center_y': .5}, do_scroll_x=False) 
     root.add_widget(layout) 
     return root 

TestApp().run() 

ответ

1

Как я могу рисовать вне границ виджета? Когда я попытался переместить часть элемента canvas вне виджета, он просто отрезал эту часть, что не удивительно. Возможно, я мог бы сделать еще один виджет за пределами этого и нарисовать его?

Не знаю, что вы подразумеваете под этим.canvas не имеет границ, кроме случаев использования Stencil. Когда вы пытаетесь рисовать за пределами ScrollView, содержимое из пространства виджетов будет скрыто, потому что изначально оно использует Stencil, так что лишний контент скрыт, и вы можете прокручивать его, как вы можете видеть here.

Теперь об этом перекрытии. canvas.after до второго Color делает розыгрыш после рисования виджетов. Подобно canvas.before, который используется для фона.

canvas: 
    Color: 
     rgba: 1, 1, 1, 1 
    Rectangle: 
     pos: self.pos 
     size: self.size 
canvas.after: 
    ... 

Basic canvas втягивается в «же» время как виджеты, поэтому элемент, который нарисован позже будет на вершине, независимо от того, что вы делаете. after будет рисовать после того, как все будет нарисовано снова с этим порядком, и before сделает то же самое, что и до того, как виджеты даже нарисованы вообще.

Как ограничить содержимое ScrollView? Итак, могу ли я изменить границы прокрутки? Я имею в виду, что я не хочу, чтобы дети выходили за рамки определенного момента в виджетах, чтобы заставить их не касаться границы.

Используйте макет с фиксированным размером, который обрабатывает его дочернюю позицию, например. FloatLayout с pos_hint или BoxLayout зависит от вашей потребности, поэтому он будет вызывать виджеты внутри воображаемого прямоугольника, который в основном [0, 0] равен [ширина, высота], т. Е. Размер вашего макета (если вы используете его правильно).

+0

Да, я хотел рисовать вне 'ScrollView'. Когда я попытался нарисовать линию снаружи, она просто не появилась. Я не думаю, что это действительно имеет значение сейчас, так как решение с 'canvas.after' работало так, как будто я хотел его – Leva7

+0

Yup, обновил мой ответ :) – KeyWeeUsr

Смежные вопросы