【问题标题】:Accessing class variables using Kivy使用 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?

谢谢,

【问题讨论】:

    标签: python class kivy


    【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 2019-12-05
      • 1970-01-01
      • 1970-01-01
      • 2019-05-31
      • 2014-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多