使用 Kivy 访问类变量

Posted

技术标签:

【中文标题】使用 Kivy 访问类变量【英文标题】:Accessing class variables using Kivy 【发布时间】:2019-09-22 11:30:56 【问题描述】:

我是第一次使用 Kivy,我对小部件所需的不同类以及如何访问它们的变量感到有些困惑。我有一个主模块,我从中启动另一个包含 Kivy 的模块。然后我试图从 on_touch 方法中检索点列表。

主模块:

if __name__ == '__main__':
    global graphInput
    graphInput=graphInputKivy.GraphInputKivyApp()
    graphInput.run()
    graphInput.graphListOfXY = graphInput.canvasDrawing.pointsXY
    print(graphInput.graphListOfXY)

“Kivy”模块:

class CanvasDrawing(Widget):
    pointsXY=[]
    def on_touch_down(self, touch):
        with self.canvas:
            Color(1, 1, 0)
            touch.ud['line'] = Line(points=(touch.x, touch.y))
            self.pointsXY=touch.ud['line'].points

    def on_touch_move(self, touch):
        touch.ud['line'].points += [touch.x, touch.y]
        self.pointsXY+= [touch.x, touch.y]


class GraphInputKivyApp(App):
    graphListOfXY=[]
    def build(self):
        layout = Widget()
        self.canvasDrawing=CanvasDrawing()
        clearCanvasButton = Button(text='Clear')
        clearCanvasButton.bind(on_release=self.clear_canvas)
        layout.add_widget(self.canvasDrawing)
        layout.add_widget(clearCanvasButton)
        return layout  

    def clear_canvas(self, obj):
        self.canvasDrawing.canvas.clear()

if __name__ == '__main__':
    GraphInputKivyApp().run()

我可以使用 graphInput.canvasDrawing.pointsXY 从 on_touch_down 方法(当我关闭 Kivy 窗口时)访问点列表,但是在调用 on_touch 方法后如何更新 graphInput.graphListOfXY?

谢谢,

【问题讨论】:

【参考方案1】:

py - Kivy 模块

删除类属性,pointsXY=[] 使用App.get_running_app()访问应用对象 将pointsXY=[] 的所有引用替换为App.get_running_app().graphListOfXY

graphInputKivy.py

​​>
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.button import Button
from kivy.graphics import Color, Line


class CanvasDrawing(Widget):

    def on_touch_down(self, touch):
        with self.canvas:
            Color(1, 1, 0)
            touch.ud['line'] = Line(points=(touch.x, touch.y))
        App.get_running_app().graphListOfXY.append([touch.x, touch.y])

    def on_touch_move(self, touch):
        touch.ud['line'].points += [touch.x, touch.y]
        App.get_running_app().graphListOfXY.append([touch.x, touch.y])


class GraphInputKivyApp(App):
    graphListOfXY = []

    def build(self):
        layout = Widget()
        self.canvasDrawing = CanvasDrawing()
        clearCanvasButton = Button(text='Clear')
        clearCanvasButton.bind(on_release=self.clear_canvas)
        layout.add_widget(self.canvasDrawing)
        layout.add_widget(clearCanvasButton)
        return layout

    def clear_canvas(self, obj):
        self.canvasDrawing.canvas.clear()

    def on_stop(self):
        print(f"\GraphInputKivyApp.non_stop: self.graphListOfXY")
        print(self.graphListOfXY)


if __name__ == '__main__':
    GraphInputKivyApp().run()

py - 主模块

删除graphInput.graphListOfXY = graphInput.canvasDrawing.pointsXY

main.py

​​>
import graphInputKivy

if __name__ == '__main__':
    global graphInput
    graphInput = graphInputKivy.GraphInputKivyApp()
    graphInput.run()
    print(f"\nmain: graphInput.graphListOfXY")
    print(graphInput.graphListOfXY)

【讨论】:

以上是关于使用 Kivy 访问类变量的主要内容,如果未能解决你的问题,请参考以下文章

组织 kivy 布局和类

您如何使用 Kivy GUI 访问其他类方法和函数?

如何使用 kivy 在 python 中动态访问单独的相机类(无需预初始化相机)

Kivy - 屏幕管理器 - 访问其他类中的属性

如何使用来自另一个 kivy 应用程序的参数启动 kivy 应用程序

如何访问由 Kivy 代码发起的类实例?