Python Kivy 图代码只给出 'Python has stopped working' 作为错误信息
Python Kivy graph code only gives 'Python has stopped working' as error message
我正在尝试使用 kivy_garden.graph
模块处理实时 kivy 图。但是,当我 运行 以下代码时,除了弹出 'Python has stopped working' 之外,我没有收到任何错误消息。一旦我按下取消键,我就会得到 Process finished with exit code -1073741819 (0xC0000005)
。这是我的代码:
from math import sin
from kivy_garden.graph import Graph, MeshLinePlot
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.clock import Clock
class MyApp(App):
plot = MeshLinePlot(color=[1, 0, 0, 1])
graph = Graph(xlabel='X', ylabel='Y', x_ticks_minor=5,
x_ticks_major=25, y_ticks_major=1,
y_grid_label=False, x_grid_label=False, padding=5,
x_grid=False, y_grid=False, xmin=-0, xmax=100, ymin=-1, ymax=1,)
def build(self):
box = BoxLayout()
box.add_widget(self.graph)
Clock.schedule_interval(self.update_points, 1/60.)
Clock.schedule_interval(self.update_xaxis, 1/60.)
return box
def update_xaxis(self,*args):
self.graph.xmin = 0
self.graph.xmax = 100
def update_points(self, *args):
#self.plot.points = [(i,i)]
self.plot.points = [(x, sin(x / 10.)) for x in range(0, 101)]
MyApp().run()
我的其他 kivy 应用 运行 在同一个 python 安装上运行得很好,所以我倾向于认为我的代码有问题。
感谢所有帮助!
虽然看起来很奇怪,但您的 Graph()
和 MeshLinePlot()
调用的顺序似乎必须相反:
class MyApp(App):
graph = Graph(xlabel='X', ylabel='Y', x_ticks_minor=5,
x_ticks_major=25, y_ticks_major=1,
y_grid_label=False, x_grid_label=False, padding=5,
x_grid=False, y_grid=False, xmin=-0, xmax=100, ymin=-1, ymax=1,)
plot = MeshLinePlot(color=[1, 0, 0, 1])
def build(self):
self.graph.add_plot(self.plot)
box = BoxLayout()
box.add_widget(self.graph)
Clock.schedule_interval(self.update_points, 1/60.)
Clock.schedule_interval(self.update_xaxis, 1/60.)
return box
而且您错过了 self.graph.add_plot(self.plot)
行。
研究
错误代码 0xC0000005
可能是 Windows 相关错误,称为 访问冲突 。看
Process finished with exit code -1073741819 (0xC0000005) Pycharm
另一方面,任何与线程相关的问题似乎都很可疑。
因此,搜索 Clock.schedule_interval
并找到建议避免重复调度的答案。看
Kivy - Trying to Understand Clock.schedule_interval.
为避免重复调用,他们建议在再次安排之前取消安排。
# First, schedule once.
event = Clock.schedule_once(my_callback, 0)
# Then, in another place you will have to unschedule first to avoid duplicate call. Then you can schedule again.
Clock.unschedule(event)
event = Clock.schedule_once(my_callback, 0)
我不知道你单独安排的更新事件是做什么用的,但看起来它们可以合并为一个更新回调。
我正在尝试使用 kivy_garden.graph
模块处理实时 kivy 图。但是,当我 运行 以下代码时,除了弹出 'Python has stopped working' 之外,我没有收到任何错误消息。一旦我按下取消键,我就会得到 Process finished with exit code -1073741819 (0xC0000005)
。这是我的代码:
from math import sin
from kivy_garden.graph import Graph, MeshLinePlot
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.clock import Clock
class MyApp(App):
plot = MeshLinePlot(color=[1, 0, 0, 1])
graph = Graph(xlabel='X', ylabel='Y', x_ticks_minor=5,
x_ticks_major=25, y_ticks_major=1,
y_grid_label=False, x_grid_label=False, padding=5,
x_grid=False, y_grid=False, xmin=-0, xmax=100, ymin=-1, ymax=1,)
def build(self):
box = BoxLayout()
box.add_widget(self.graph)
Clock.schedule_interval(self.update_points, 1/60.)
Clock.schedule_interval(self.update_xaxis, 1/60.)
return box
def update_xaxis(self,*args):
self.graph.xmin = 0
self.graph.xmax = 100
def update_points(self, *args):
#self.plot.points = [(i,i)]
self.plot.points = [(x, sin(x / 10.)) for x in range(0, 101)]
MyApp().run()
我的其他 kivy 应用 运行 在同一个 python 安装上运行得很好,所以我倾向于认为我的代码有问题。
感谢所有帮助!
虽然看起来很奇怪,但您的 Graph()
和 MeshLinePlot()
调用的顺序似乎必须相反:
class MyApp(App):
graph = Graph(xlabel='X', ylabel='Y', x_ticks_minor=5,
x_ticks_major=25, y_ticks_major=1,
y_grid_label=False, x_grid_label=False, padding=5,
x_grid=False, y_grid=False, xmin=-0, xmax=100, ymin=-1, ymax=1,)
plot = MeshLinePlot(color=[1, 0, 0, 1])
def build(self):
self.graph.add_plot(self.plot)
box = BoxLayout()
box.add_widget(self.graph)
Clock.schedule_interval(self.update_points, 1/60.)
Clock.schedule_interval(self.update_xaxis, 1/60.)
return box
而且您错过了 self.graph.add_plot(self.plot)
行。
研究
错误代码 0xC0000005
可能是 Windows 相关错误,称为 访问冲突 。看
Process finished with exit code -1073741819 (0xC0000005) Pycharm
另一方面,任何与线程相关的问题似乎都很可疑。
因此,搜索 Clock.schedule_interval
并找到建议避免重复调度的答案。看
Kivy - Trying to Understand Clock.schedule_interval.
为避免重复调用,他们建议在再次安排之前取消安排。
# First, schedule once.
event = Clock.schedule_once(my_callback, 0)
# Then, in another place you will have to unschedule first to avoid duplicate call. Then you can schedule again.
Clock.unschedule(event)
event = Clock.schedule_once(my_callback, 0)
我不知道你单独安排的更新事件是做什么用的,但看起来它们可以合并为一个更新回调。