我可以使用KV Lang在我的代码下编写FigureCanvasKivyAgg吗? 我需要在“ on_enter”函数中插入按钮并自定义boxlayout,我认为用KV Lang编写图形会更容易。
我现在遇到的问题是,我试图在“ grafico屏幕”中添加一个按钮,尽管该按钮从一开始就出现了,此后,图形在框布局中进行。 我想知道如果我可以用KV Lang编写所有内容,那么具有框布局,按钮等会更容易。
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。
答案 0 :(得分:0)
在kv
中使用的Kivy小部件必须具有无位置参数__init__()
的方法。 FigureCanvasKivyAgg
扩展了Widget
,但是有一个必需的__init__()
参数,该参数是数字,因此您不能直接在kv
中使用它(我认为这是一个糟糕的设计选择) )。
但是您可能会做出适合您的hack。以下内容取决于启动sensor
应用之前是否有可用的图形。您可以将FigureCanvasKivyAgg
扩展为:
class MyFigure(FigureCanvasKivyAgg):
def __init__(self, **kwargs):
super(MyFigure, self).__init__(plt.gcf(), **kwargs)
请注意,MyFigure
没有必需的位置参数。但是它使用必需的数字形参调用FigureCanvasKivyAgg.__init__()
。这就是为什么该图必须已经可用的原因。
然后您可以将MyFigure
文件中的kv
用作:
<Grafico>:
BoxLayout:
MyFigure:
Button:
size_hint: 0.5, 0.09
pos_hint: {"x": .1 , "y": .2}
text: "Atualizar"
当然,必须删除on_enter()
类的Grafico
方法。