用kv lang插入图形

时间:2019-01-16 09:33:27

标签: python kivy

我正在尝试制作具有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()

KIVY

Menu:
    Sensores:
    Grafico:

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

<Grafico>
    name: 'grafico'

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

2 个答案:

答案 0 :(得分:0)

我发现您的代码有两个问题。首先,在您的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添加到屏幕上。有关更多信息,请参见Screen Documentation

答案 1 :(得分:0)

非常感谢! 现在可以使用!请遵循代码:

const users = [{
    "id": 1,
    "first_name": "Abner",
    "last_name": "Glaisner",
    "gender": "Male",
    "language": "Tswana"
    },
    {
      //...
    }]




    class UserList {
      constructor(users) {
        this.users = users;
    }

    showNames() {
        users.forEach(function (user) {
            console.log(user);
            return this;
        })
    }

    showById(id) {
        users.forEach(function (user) {
            if (id === user.id) {
                console.log(user.first_name);
            } else {
                console.log(`Unable to find user id: ${id}`);
            }
        })
    }
    }