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)

我不知道你单独安排的更新事件是做什么用的,但看起来它们可以合并为一个更新回调。