【问题标题】:Insert a graph with kv lang使用 kv lang 插入图形
【发布时间】:2019-06-10 08:38:04
【问题描述】:

我正在尝试制作一个 2 屏幕的 APP:

  • 第一个屏幕是一个按钮
  • 第二个屏幕显示图表

当第一个屏幕的按钮被按下时,第二个屏幕会出现图表。 使用 matplotlib,我只能用 1 个屏幕绘制图表。

这是我的代码:

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()

基维

Menu:
    Sensores:
    Grafico:

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

<Grafico>
    name: 'grafico'

我希望在第二个屏幕中显示图表。

【问题讨论】:

    标签: python kivy


    【解决方案1】:

    我发现您的代码存在两个问题。首先,在您的 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)
    

    我想你会得到想要的结果。关键是在显示GraficoScreen时调用了on_enter()方法。该方法是您的代码,但添加了self.add_widget(box) 以便将box 添加到屏幕上。请参阅Screen Documentation 了解更多信息。

    【讨论】:

      【解决方案2】:

      非常感谢! 现在可以了!按照代码:

      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'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-15
        • 1970-01-01
        相关资源
        最近更新 更多