Как добавить гистограмму в мой main.py и в файл kv? - PullRequest
0 голосов
/ 30 августа 2018

Я хочу добавить гистограмму, которая отображается только на экране прогресса. Я новичок в Kivy и Python. Я использую matplotlib для гистограммы. Я хочу интегрировать код Bar.py в мой код main.py и файл progress.kv. Я застрял на том, как добавить его в мой файл Progress.kv.

Bar.py

Это код гистограммы, которую я хочу показать.

import matplotlib.pyplot as plt 

x = [2,4,6,8,10]
y = [6,7,8,2,4]

x2 = [1,3,5,7,9]
y2 = [7,8,2,4,2]

plt.bar(x,y, label='Bars1', color='blue')
plt.bar(x2,y2, label='Bars2', color='c') 

plt.xlabel('x')
plt.ylabel('y')
plt.title('Interesting Graph\nCheck It out')
plt.legend()
plt.show()

Main.py

Я хочу добавить код гистограммы в «экран прогресса» вместо передачи.

from kivy.app import App 
#kivy.require("1.10.0")
from kivy.uix.screenmanager import ScreenManager, Screen, 
SlideTransition 
from kivy.properties import ObjectProperty
from kivy.properties import ListProperty
from kivy.uix.image import Image
from kivy.uix.label import Label 
from kivy.graphics import *
from kivy.core.window import Window
from kivy.uix.widget import Widget
from kivy.uix.gridlayout import GridLayout
from kivy.uix.boxlayout import BoxLayout   
from kivy.config import Config 
from kivy.lang import Builder 
import numpy as np 
from math import sin 
import matplotlib.pyplot as plt
from kivy.garden.matplotlib.backend_kivyagg import 
FigureCanvasKivyAgg
import matplotlib
from kivy.garden.matplotlib import FigureCanvasKivyAgg

#Screens created in kv file. Declare all screens for app.    
class Login(Screen):
    pass    
class Connected(Screen):
    pass    
class Patient(Screen):
    pass
class Progress(Screen):
    pass  
class Goals(Screen):
    pass 
class Training(Screen):
    pass
class Range(Screen):
    pass
class Trial(Screen):
    pass
class Symmetry(Screen):
    pass
class Coordination(Screen):
    pass
class Help(Screen):
    pass
class Manager(ScreenManager):
    pass 
class ScreenApp(App):
    def build(self):
        m = Manager(transition=SlideTransition()) 
        return m
if __name__ == '__main__':
    #sets pixels to pixels on Raspberry Pi tablet
    Config.set('graphics', 'fullscreen', '0')
    Config.set('graphics', 'width', '800')
    Config.set('graphics', 'height', '480')
    ScreenApp().run()

Progress.kv

У меня есть весь код для экрана прогресса в файле kv. Я хотел бы добавить дизайн и детали здесь, но если нет, то в main.py.

import matplotlib.pyplot as plt

<Progress>:
canvas.before:
    Color:
        rgb: 1, 1, 1 
    Rectangle:
        pos: self.pos
        size: self.size
Button:
    text:'Patient Menu'
    font_size: 20
    bold: True
    size_hint: None, None
    size: 300, 50
    pos_hint: {'center_x': .5, 'center_y': .1 }   
    color: 1, 1, 1, 1               
    on_press: root.manager.current = 'Patient' 

Ответы [ 2 ]

0 голосов
/ 25 марта 2019

файл Progress.kv для гистограммы

#:import MeshLinePlot kivy.garden.graph.MeshLinePlot
#:import get_color_from_hex kivy.utils
<Progress>:
    BoxLayout:
        orientation: 'vertical'
        padding: [10,20,10,20]
        spacing: 20
    Graph:
            height:1000
            width:1000
            id: graph_test
            xlabel:'Algorithms'
            ylabel:'Accuracy'
            x_ticks_minor:5
            x_tics_major:25
            y_ticks_major:1
            y_grid_label:True
            x_grid_label:True
            padding:5
            x_grid:True
            y_grid:True
            xmin:-0
            xmax:3
            ymin:0
            ymax:100
            pos: 0, root.height
            size: root.width, root.height 

Python-код для прогресса

import itertools

from kivy.app import App

from kivy.utils import get_color_from_hex as rgb

from kivy.uix.screenmanager import Screen, SlideTransition

from kivy.properties import StringProperty,ObjectProperty

from math import sin

from kivy.garden.graph import Graph, MeshLinePlot, BarPlot

colors = itertools.cycle([rgb('7dac9f'), rgb('dc7062'), rgb('66a8d4'), rgb('e5b060')])

class Progress(Screen):

    def assign(self):

        super(Progress,self).__init__()

        self.sensorEnabled = True
        self.graph= self.ids.graph_test

        self.plot = []
        self.plot.append(BarPlot(color=next(colors),bar_spacing=.72))  #x - Red
        self.plot.append(BarPlot(color=next(colors),bar_spacing=.72))  # Y - Green
        self.plot.append(BarPlot(color=next(colors),bar_spacing=.72))  # Z - Blue

        self.reset_plots(self.graph)

        for plot in self.plot:
            self.graph.add_plot(plot)

    def reset_plots(self,graph):
        for plot in self.plot:
            plot.bind_to_graph(graph)
            plot.points = []

        self.counter = 1
0 голосов
/ 30 августа 2018

файл кв

  1. Создание BoxLayout виджета как потомков правила класса, <Progress>:
  2. Добавьте id: bar в виджет BoxLayout , чтобы мы могли ссылаться на него в коде Python.
  3. Подключите BoxLayout id к ObjectProperty, bar: bar

Kv language »self.ids vs ObjectProperty

Примечание

Хотя метод self.ids очень лаконичен, обычно он считается «наилучшей практикой» для использования ObjectProperty. Это создает прямая ссылка, обеспечивает более быстрый доступ и является более явным.

код Python

  1. Добавить заявление на импорт, from kivy.properties import ObjectProperty
  2. Добавить bar = ObjectProperty(None) на уровне класса Progress()
  3. Реализация on_pre_enter() метода в классе Progress()

Декларация о недвижимости

Чтобы объявить свойства, вы должны объявить их на уровне класса. Затем класс выполнит работу по созданию реальных атрибутов, когда ваш объект создан. Эти свойства не являются атрибутами: они механизмы для создания событий на основе ваших атрибутов.

Пример

main.py

from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.properties import ObjectProperty

from kivy.garden.matplotlib.backend_kivyagg import FigureCanvasKivyAgg
import matplotlib.pyplot as plt

x = [2,4,6,8,10]
y = [6,7,8,2,4]

x2 = [1,3,5,7,9]
y2 = [7,8,2,4,2]

plt.bar(x,y, label='Bars1', color='blue')
plt.bar(x2,y2, label='Bars2', color='c')

plt.xlabel('x')
plt.ylabel('y')
plt.title('Interesting Graph\nCheck It out')
plt.legend()


class Patient(Screen):
    pass


class Progress(Screen):
    bar = ObjectProperty(None)

    def on_pre_enter(self, *args):
        self.bar.add_widget(FigureCanvasKivyAgg(plt.gcf()))


class Manager(ScreenManager):
    pass


class ProgressApp(App):
    title = "Kivy Garden Matplolib & plt"

    def build(self):
        return Manager()


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

kv файл - progress.kv

#:kivy 1.11.0
#:import SlideTransition kivy.uix.screenmanager.SlideTransition

<Manager>:
    transition: SlideTransition()

    Patient:
        name: 'Patient'

    Progress:
        name: 'Progress'

<Patient>:
    BoxLayout:
        orientation: 'vertical'

        Label:
            text: 'Patient Screen'
            font_size: '30sp'

        Button:
            size_hint: 1, 0.1
            text: 'Goto Progress Screen'
            on_release:
                root.manager.current = 'Progress'

<Progress>:
    bar: bar

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

    BoxLayout:
        id: bar

    Button:
        text:'Patient Menu'
        font_size: 20
        bold: True
        size_hint: None, None
        size: 300, 50
        pos_hint: {'center_x': .5, 'center_y': .1 }
        color: 1, 1, 1, 1
        on_press: root.manager.current = 'Patient'

выход

Img01 - Bar graph

...