首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python to KV Lang - FigureCanvasKivyAgg

Python to KV Lang - FigureCanvasKivyAgg
EN

Stack Overflow用户
提问于 2019-01-18 18:56:31
回答 1查看 1.6K关注 0票数 0

我可以使用KV Lang在我的代码下编写FigureCanvasKivyAgg吗?我需要在函数"on_enter“中插入按钮和自定义框布局,我认为用KV Lang编写图形会更容易。

我现在遇到的问题是,我试图在"grafico screen“中添加一个按钮,尽管按钮在某个时刻出现,之后,图形就会出现在框布局中。我在想,如果我可以用KV Lang编写所有内容,那么拥有框布局、按钮等就更容易了。

代码语言:javascript
复制
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.screenmanager import ScreenManager, Screen
import matplotlib.pyplot as plt
import matplotlib
matplotlib.use("module://kivy.garden.matplotlib.backend_kivy")
from kivy.garden.matplotlib import FigureCanvasKivyAgg
from kivy.properties import ObjectProperty
from kivy.uix.widget import Widget
import numpy as np


f = 10 #frequency
x = np.linspace(0,1,200)
y = np.sin(2*np.pi*f*x)


class Gerenciador(ScreenManager):
    pass

class Menu(Screen):
    pass

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 sensor(App):
        def build(self):
            return Gerenciador()

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


    KV LANG

#:import np numpy
#:import FigureCanvasKivyAgg kivy.garden.matplotlib


<Gerenciador>:
    Menu:
        name: 'menu'
    Sensores:   #analogo a nossa tela 01
        name: 'sensores'
    Grafico:
        name: 'grafico'

<Menu>:
    BoxLayout:
        orientation: 'vertical'
        padding: 200
        spacing: 50
        Image:
            source: 'logo.png'
            size_hint_y: None
            height: 200
            allow_stretch: True
        Button:
            text: 'Lista de Sensores'
            on_release: app.root.current = 'sensores'
        Button:
            text: 'Sair'
            on_release: app.stop()

<Sensores>:
    BoxLayout:
        orientation: 'vertical'
        padding: 50
        spacing: 10
        Button:
            text: 'Sensor 01'
            on_release:
                root.manager.current = 'grafico'
        Button:
            text: 'Sensor 02'
        Button:
            text: 'Sensor 03'
        Button:
            text: 'Sensor 04'


<Grafico>:
    BoxLayout:
        Button:
            size_hint: 0.5, 0.09
            pos_hint: {"x": .1 , "y": .2}
            text: "Atualizar"

我需要有与现在相同的结果,但使用KV Lang。

EN

回答 1

Stack Overflow用户

发布于 2019-01-20 09:25:17

kv中使用的Kivy小部件必须有一个无位置参数的__init__()方法。FigureCanvasKivyAgg扩展了Widget,但有一个必需的__init__()参数(如图所示),因此不能直接在kv中使用该参数(在我看来,这是一个糟糕的设计选择)。

但是你可以做一个对你有用的黑客。下面的情况取决于在sensor应用程序启动之前是否有可用的图形。您可以将FigureCanvasKivyAgg扩展为:

代码语言:javascript
复制
class MyFigure(FigureCanvasKivyAgg):
    def __init__(self, **kwargs):
        super(MyFigure, self).__init__(plt.gcf(), **kwargs)

请注意,MyFigure没有必需的位置参数。但它使用所需的图形参数调用FigureCanvasKivyAgg.__init__()。这就是为什么这个数字必须已经有了。

然后可以在kv文件中使用MyFigure,如下所示:

代码语言:javascript
复制
<Grafico>:
    BoxLayout:
        MyFigure:
        Button:
            size_hint: 0.5, 0.09
            pos_hint: {"x": .1 , "y": .2}
            text: "Atualizar"

当然,必须删除Grafico类的on_enter()方法。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54252521

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档