Вставьте график с помощью kv lang - PullRequest
0 голосов
/ 16 января 2019

Я пытаюсь сделать приложение с 2 экрана:

  • Первый экран - кнопка
  • Второй экран показывает график

При нажатии кнопки первого экрана появляется второй экран с графиком. Я смог построить график только на 1 экране, используя matplotlib.

Вот мой код:

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.lang import Builder
import matplotlib.pyplot as plt
import matplotlib
matplotlib.use("module://kivy.garden.matplotlib.backend_kivy")
from kivy.garden.matplotlib import FigureCanvasKivyAgg

from kivy.uix.widget import Widget


class Sensores(Screen):
    pass

class Grafico(Screen):
    def build(self):
        box = BoxLayout()
        box.add_widget(FigureCanvasKivyAgg(plt.gcf()))
        return box

class Menu(ScreenManager):
    pass

presentation = Builder.load_file('sensor.kv')

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

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

KIVY

Menu:
    Sensores:
    Grafico:

<Sensores>
    name: 'sensores'
    BoxLayout:
        Button:
            text: "Sensor 01"
            on_release:
                root.Grafico()

<Grafico>
    name: 'grafico'

Я ожидаю, что график будет на втором экране.

Ответы [ 2 ]

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

Большое спасибо! Это работает сейчас! Следуйте коду:

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.lang import Builder
import matplotlib.pyplot as plt
import matplotlib
matplotlib.use("module://kivy.garden.matplotlib.backend_kivy")
from kivy.garden.matplotlib import FigureCanvasKivyAgg

from kivy.uix.widget import Widget

plt.plot([1,23,2,4])
plt.ylabel("alguns numeros legais")

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 Menu(ScreenManager):
    pass

presentation = Builder.load_file('sensor.kv')

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

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

KV LANG
#:kivy 1.9.1

Menu:
    Sensores:
    Grafico:
        name: 'grafico'

<Sensores>
    name: 'sensores'
    BoxLayout:
        Button:
            text: "Sensor 01"
            on_release:
                root.manager.current = 'grafico'

<Grafico>
    name: 'grafico'
0 голосов
/ 16 января 2019

Я вижу две проблемы с вашим кодом. Во-первых, в вашем файле kv действие Button неверно:

    Button:
        text: "Sensor 01"
        on_release:
            root.Grafico()

Если Button предназначен для переключения на другой экран, он должен быть:

    Button:
        text: "Sensor 01"
        on_release:
            root.manager.current='grafico'

Во-вторых, в вашем Grafico классе есть метод build(), который никогда не вызывается. Если вы измените это с:

class Grafico(Screen):
    def build(self):
        box = BoxLayout()
        box.add_widget(FigureCanvasKivyAgg(plt.gcf()))
        return box

до:

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

Я думаю, вы получите желаемый результат. Ключ в том, что метод on_enter() вызывается при отображении Grafico Screen. Метод - это ваш код, но с добавлением self.add_widget(box) для добавления box на экран. См. Экранная документация для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...