Python для KV Lang - FigureCanvasKivyAgg - PullRequest
0 голосов
/ 18 января 2019

Могу ли я написать FigureCanvasKivyAgg под моим кодом, используя KV Lang? Мне нужно вставить кнопку и настроить boxlayout в функции "on_enter", и я думаю, что было бы легче, чтобы график был написан на KV Lang.

Проблема, с которой я столкнулся сейчас, заключается в том, что я попытался добавить кнопку на «экране графика», хотя кнопка появляется с одного момента, а после этого график появляется в макете блока. Мне было интересно, что если бы я мог написать все на KV Lang, было бы проще иметь раскладку коробки, кнопку и т. Д.

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.screenmanager import ScreenManager, Screen
import matplotlib.pyplot as plt
import matplotlib
matplotlib.use("module://kivy.garden.matplotlib.backend_kivy")
from kivy.garden.matplotlib import FigureCanvasKivyAgg
from kivy.properties import ObjectProperty
from kivy.uix.widget import Widget
import numpy as np


f = 10 #frequency
x = np.linspace(0,1,200)
y = np.sin(2*np.pi*f*x)


class Gerenciador(ScreenManager):
    pass

class Menu(Screen):
    pass

class Sensores(Screen):
    pass

class Grafico(Screen):
    def on_enter(self, *args):
        box = BoxLayout()
        box.add_widget(FigureCanvasKivyAgg(plt.gcf()))
        self.add_widget(box)

class sensor(App):
        def build(self):
            return Gerenciador()

if __name__ == "__main__":
    sensor().run()


    KV LANG

#:import np numpy
#:import FigureCanvasKivyAgg kivy.garden.matplotlib


<Gerenciador>:
    Menu:
        name: 'menu'
    Sensores:   #analogo a nossa tela 01
        name: 'sensores'
    Grafico:
        name: 'grafico'

<Menu>:
    BoxLayout:
        orientation: 'vertical'
        padding: 200
        spacing: 50
        Image:
            source: 'logo.png'
            size_hint_y: None
            height: 200
            allow_stretch: True
        Button:
            text: 'Lista de Sensores'
            on_release: app.root.current = 'sensores'
        Button:
            text: 'Sair'
            on_release: app.stop()

<Sensores>:
    BoxLayout:
        orientation: 'vertical'
        padding: 50
        spacing: 10
        Button:
            text: 'Sensor 01'
            on_release:
                root.manager.current = 'grafico'
        Button:
            text: 'Sensor 02'
        Button:
            text: 'Sensor 03'
        Button:
            text: 'Sensor 04'


<Grafico>:
    BoxLayout:
        Button:
            size_hint: 0.5, 0.09
            pos_hint: {"x": .1 , "y": .2}
            text: "Atualizar"

Мне нужны те же результаты, что и сейчас, но с использованием KV Lang.

1 Ответ

0 голосов
/ 20 января 2019

Виджеты Kivy, используемые в kv, не должны иметь метода позиционных аргументов __init__(). FigureCanvasKivyAgg расширяет Widget, но имеет обязательный аргумент __init__(), то есть цифру, поэтому вы не можете использовать его непосредственно в kv (плохой выбор дизайна, на мой взгляд).

Но вы можете сделать хак, который может работать на вас. Следующее зависит от доступности фигуры до запуска приложения sensor. Вы можете расширить FigureCanvasKivyAgg как:

class MyFigure(FigureCanvasKivyAgg):
    def __init__(self, **kwargs):
        super(MyFigure, self).__init__(plt.gcf(), **kwargs)

Обратите внимание, что MyFigure не имеет обязательных позиционных аргументов. Но он вызывает FigureCanvasKivyAgg.__init__() с обязательным аргументом figure. Вот почему фигура уже должна быть доступна.

Затем вы можете использовать MyFigure в вашем файле kv как:

<Grafico>:
    BoxLayout:
        MyFigure:
        Button:
            size_hint: 0.5, 0.09
            pos_hint: {"x": .1 , "y": .2}
            text: "Atualizar"

Конечно, метод on_enter() вашего Grafico класса должен быть удален.

...