我正试着在我的代码中找到一个活图。
当所有东西都在同一个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"
graphs.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)
data.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()
发布于 2021-11-30 17:19:41
代码有三个主要问题:
kv = Builder.load_file("my.kv")
正在第二次加载my.kv
文件。它将被自动加载,因为文件的命名是正确的。您应该删除该代码。DataStore.getData()
的调用将无法工作,因为您的DataStore
实例没有保存在任何地方,因此它会被垃圾收集。getData()
方法DataStore
在每次运行时都会创建LogGraph
的一个新实例,但不使用GUI中的LogGraph
的实例。H 214G 215
要解决这些问题,首先添加到您的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)
https://stackoverflow.com/questions/70175083
复制