Как ссылаться на Kivy Canvas в Python - PullRequest
0 голосов
/ 27 февраля 2019

Как бы я ссылался на Kivy Canvas для рисования из файла python, если пользовательский интерфейс строится в kv, например, вот мой .py:

# canvasCallApp.py...

from kivy.app import App

class canvasCallApp(App):
    pass

if __name__ == '__main__':
    canvasCallApp().run()

И мой .kv:

# canvasCallApp.kv...

BoxLayout:
    id: left_box
    canvas:
        Color:
            rgb: 0.6, 0.6, 0.6
        Rectangle:
            pos: self.pos
            size: self.size
    Widget:
        size_hint_x: None
        width: left_box.width - right_box.width        
    BoxLayout:
        width: 200
        id: right_box
        Button:
            text: 'I ma a button'

Который производит:

enter image description here

Как бы я попал на холст в left_box для рисования из питона?не могу понять это из документов.

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Я выбрал отключение отдельного языка kivy и все это делаю на python, для этого требуется некоторое вложение виджетов для достижения правильной компоновки и, что более важно, создание, связывание и инициализация объекта виджета / холста, к которому мы позже можем обратиться:


# canvasTest.py...

from kivy.app import App
from kivy.graphics import Rectangle
from kivy.graphics import Color
from kivy.uix.widget import Widget
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
from random import random as r


class rootCanvas(Widget):
    def __init__(self, **kwargs):
        super(rootCanvas, self).__init__(**kwargs)
        with self.canvas:
            Color(r(), 1, 1, mode='hsv')
            self.rect = Rectangle(pos=self.pos, size=self.size)

        self.bind(pos=self.update_rect)
        self.bind(size=self.update_rect)

    def update_rect(self, *args):
        self.rect.pos = self.pos
        self.rect.size = (self.size[0], self.size[1])

    def change_color(self, *args):
        with self.canvas:
            Color(r(), 1, 1, mode='hsv')
            self.rect = Rectangle(pos=self.pos, size=self.size)


class canvasTest(App):
    def build(self):
        root = BoxLayout()
        sideBar = BoxLayout(size=(200, 100), size_hint=(None, 1))
        widget = rootCanvas()
        root.add_widget(widget)
        btn_1 = Button(
            text='Change Canvas Color',
            width=200,
            on_press=widget.change_color)
        sideBar.add_widget(btn_1)
        root.add_widget(sideBar)
        return root


if __name__ == '__main__':
    canvasTest().run()




Результат:

enter image description here

0 голосов
/ 27 февраля 2019

Если вы хотите динамически изменить цвет или размер холста,

Я рекомендую использовать Kivy Properties для него.

Вот код.

from kivy.properties import ListProperty
from kivy.lang import Builder
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout


class RootLayout(BoxLayout):
    canvas_color = ListProperty([0, 1, 1])


class canvasCallApp(App):
    def build(self):
        return kv


kv = Builder.load_string('''
RootLayout:
    id: left_box
    canvas:
        Color:
            rgb: root.canvas_color
        Rectangle:
            pos: self.pos
            size: self.size
    Widget:
        size_hint_x: None
        width: left_box.width - right_box.width        
    BoxLayout:
        width: 200
        id: right_box
        Button:
            text: 'I ma a button'
''')


if __name__ == '__main__':
    canvasCallApp().run()

Я также рекомендую использовать RootLayout, что упрощает обращение к переменной из кода Python с помощью root.variable_name.

Если вы хотите изменить фон холста, вы также можете изменить код KIVY.

canvas:
    Color:
        rgb: root.canvas_color
    Rectangle:
        pos: self.pos
        size: self.size
        source: root.image_path

таким образом, вы можете импортировать StringProperty из kivy.properties и применять то же самое.При изменении значения image_path фон автоматически меняется.

Если вы хотите получить доступ к холсту напрямую, чтобы перерисовать холст, вы можете использовать with canvas

from kivy.uix.boxlayout import BoxLayout
from kivy.graphics import Rectangle, Color

class SomeBoxLayout(BoxLayout)
    def __init__(self, **kwargs):
        super(SomeBoxLayout, self).__init__(**kwargs)

        with self.canvas:
            Color(1, 0, 0, 1)  # set the color to red
            self.rect = Rectangle(pos=self.center,
                                  size=(self.width/2.,
                                        self.height/2.))

    def redraw(self):
        self.canvas.clear()
        with self.canvas:
            Color(0, 0, 1, 1)  # set the color to blue
            self.rect = Rectangle(pos=self.center,
                                  size=(self.width/2.,
                                        self.height/2.))

Примечание.что вы должны сделать canvas.clear(), прежде чем снова что-то нарисовать.

Плюс, вы можете использовать with self.canvas.before или with self.canvas.after таким образом.

...