使用 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 在 python 中动态访问单独的相机类(无需预初始化相机)