从另一个文件向活动图形添加点



我正在尝试在代码中使用一个活动图。

当所有东西都在同一个python文件中时,我可以让一个活动图工作,尽管当我试图将图类分离到它自己的python文件时,图不会更新。我不知道为什么图形没有更新,但我认为我可能正在创建一堆LogGraph对象,而不是向my.kv中的实际LogGraph添加点,但我不知道如何不这样做。

我的实际代码有点复杂和混乱,所以我在这里模拟了一个应该表现完全相同的示例代码:

main.py

from math import sin
import kivy
from kivy_garden.graph import Graph, MeshLinePlot
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import Screen, ScreenManager
from kivy.uix.boxlayout import BoxLayout
from kivy.clock import Clock
from data import startdata
class MainWindow(Screen):
def pressrun(self):
self.ids.runlbl.text = 'Started'
startdata()
pass
class MyApp(App):
def build(self):
wm.add_widget(MainWindow())
return wm
class WindowManager(ScreenManager):
def __init__(self, **kwargs):
super(WindowManager, self).__init__(**kwargs)
wm = WindowManager()
kv = Builder.load_file("my.kv")
MyApp().run()

my.kv

#: import LogGraph graphs.LogGraph
<MainWindow>:
id: main
BoxLayout:
orientation: "vertical"
LogGraph:
BoxLayout:
orientation: "horizontal"
Button:
text: "Start Data Gen"
on_release:
root.pressrun()
Label:
id: runlbl
text: "Not Started"

图形.py

from kivy_garden.graph import Graph, MeshLinePlot
class LogGraph(Graph):
def __init__(self, **kwargs):
super(LogGraph, self).__init__(**kwargs)
self.xlabel = 'X'
self.ylabel = 'Y'
self.x_ticks_major = 25
self.x_ticks_minor = 5
self.x_grid_label = True
self.y_ticks_major = 1
self.y_grid_label = True
self.xmin = 0
self.xmax = 100
self.ymin = 0.1
self.ymax = 10
self.ylog = True
self.x_grid = True
self.y_grid = True
self.plot = MeshLinePlot(color=[1, 0, 0, 1])
self.add_plot(self.plot)
self.plot.points = [(1,1)]
def update_xaxis(self,xmin = 0):
self.xmin = xmin
self.xmax = xmin + 10
def update_yaxis(self,ymin = 0):
self.ymin = ymin
self.ymax = ymin + 10
def update_points(self, point, *args):
self.plot.points.append([point,point])
# x axis resize
if point > self.xmax:
self.update_xaxis(self.xmax)
# y axis resize
if point > self.ymax:
self.update_yaxis(self.ymax)

数据.py

from kivy.clock import Clock
from functools import partial
from graphs import LogGraph
class DataStore():
def __init__(self):
self.i = 1
self.dataarray = []
def start(self):
self.clock = Clock.schedule_interval(self.getData, 1/60)
def cancel(self):
self.clock.cancel()
def wait(self):
print('Waited!')
def getData(self):
i = self.i + 1/60
LogGraph.update_points(LogGraph(), i)
pass
def startdata():
ds = DataStore()
ds.start()

代码的三个主要问题:

  1. 您的代码kv = Builder.load_file("my.kv")正在第二次加载my.kv文件。它将被自动加载,因为文件的命名正确。您应该删除该代码
  2. 您计划的对DataStore.getData()的调用将不起作用,因为您的DataStore实例没有保存在任何位置,因此会被垃圾收集
  3. DataStoregetData()方法每次运行时都会创建一个新的LogGraph实例,但不使用GUI中的LogGraph实例

要解决这些问题,请首先将添加到kv以允许访问:

#: import LogGraph graphs.LogGraph
<MainWindow>:
id: main
name: 'main'  # added to enable access
BoxLayout:
orientation: "vertical"
LogGraph:
id: graph  # added to enable access
BoxLayout:
orientation: "horizontal"
Button:
text: "Start Data Gen"
on_release:
root.pressrun()
Label:
id: runlbl
text: "Not Started"

然后在startdata()方法中,添加一个返回

def startdata():
ds = DataStore()
ds.start()
# return the DataStore instance so it can be saved
return ds

然后将返回的DataStore保存在pressrun()方法中:

def pressrun(self):
self.ids.runlbl.text = 'Started'
self.dataStore = startdata()

必须修改getData()方法才能访问GUI中的LogGraph

def getData(self, dt):  # time interval argument is required
self.i += dt
# access the LogGraph instance in the GUI
lg = App.get_running_app().root.get_screen('main').ids.graph
lg.update_points(self.i)
# LogGraph.update_points(LogGraph(), i)

最新更新