【问题标题】:How to add a bar graph in my main.py and in kv file?如何在我的 main.py 和 kv 文件中添加条形图?
【发布时间】:2018-08-30 15:22:29
【问题描述】:

我想添加一个仅显示在进度屏幕上的条形图。我是 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()

进度.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' 

【问题讨论】:

    标签: python-3.x graph kivy bar-chart kivy-language


    【解决方案1】:

    kv 文件

    1. BoxLayout 小部件实例化为类规则的子级,&lt;Progress&gt;:
    2. id: bar 添加到 BoxLayout 小部件,以便我们可以在 Python 代码中引用它。
    3. BoxLayoutid 连接到 ObjectProperty bar: bar

    Kv language » self.ids vs ObjectProperty

    注意

    self.ids方法虽然很简洁,但一般 被视为使用 ObjectProperty 的“最佳实践”。这创建了一个 直接引用,提供更快的访问并且更明确。

    Python 代码

    1. 添加导入语句,from kivy.properties import ObjectProperty
    2. Progress() 的类级别添加bar = ObjectProperty(None)
    3. 在类Progress()中实现on_pre_enter()方法

    Declaration of a Property

    要声明属性,您必须在类级别声明它们。这 然后类将完成工作以实例化真实属性 您的对象已创建。这些属性不是属性:它们是 根据您的属性创建事件的机制。

    示例

    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'
    

    输出

    【讨论】:

    • 当我运行 main.py 时,首先弹出图表。但是当我单击退出时,应用程序由于属性错误而关闭。我希望应用程序打开到主屏幕,然后当我单击按钮进入进度屏幕时,我希望显示图表。
    • 我不希望图表在我进入进度屏幕之前弹出。
    • 在提供的示例中,显示的第一个屏幕是 Patient。单击“转到进度屏幕”按钮时,将显示图形。
    • 确保你所有的kv文件名都是小写的。
    • 我的 kv 文件是小写的。我只是在这里把它们变成大写。
    【解决方案2】:

    用于条形图的 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
    

    【讨论】:

      猜你喜欢
      • 2016-11-15
      • 1970-01-01
      • 2019-08-18
      • 1970-01-01
      • 1970-01-01
      • 2021-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多