【问题标题】:Kivy call methods from different classes来自不同类的 Kivy 调用方法
【发布时间】:2017-01-07 16:44:46
【问题描述】:

我的示例.kv 文件中有一个按钮和两个滑块:

<intLab>:
    BoxLayout:
        orientation: "vertical"
    BoxLayout:
        size_hint_y: None
        height: 10
        orientation: "horizontal"

        FREQslider:
            id: s2
            color: 1,0.5,1,1
            value: 20
            orientation: 'vertical'
            max: 300
            min: 20
            size_hint_x: None
            width: '48dp'
            step: 1
            on_value: root.onFrequencySlide(self.value)

        AMPLslider:
            id: s3
            color: 1,.5,.5,0
            value: 1
            orientation: 'vertical'
            max: 100
            min: 0
            size_hint_x: None
            width: '48dp'
            step: 1
            on_value: root.onAmplitudeSlide(self.value)

        ToggleButton:
            id: 'enableBtn'
            text: 'Enable' if self.state == 'normal' else 'Disable'
            state: 'normal'
            on_release: root.on_disable()

.py 文件中,我有两个类。对应.kv结构的类,intLab和另一个类KivyCamera

class intLab(BoxLayout):

    def init_intlab(self):
        pass

    def on_disable(self):
        self.updateFreqAmpl(0, 0)
        self.ids.s2.value = 20
        self.ids.s3.value = 0

当我按下disable 按钮时,在kivy UI 中,updateFreqAmpl 方法被调用,两个滑块分别设置为 20 和 0,所以这是可行的。

但是,如果我从KivyCamera 类调用on_disable 方法,那么即使调用了updateFreqAmpl 方法,滑块值也不会改变,但不会给出错误。

这是我如何从 KivyCamera 类调用 on_disable 方法:

class KivyCamera(Image):

    def __init__(self, **kwargs):
        super(KivyCamera, self).__init__(**kwargs)
        self.capture = None

    def update(self, dt):
        t = intLab()
        intLab.on_disable(t)

请注意,这是一个简化的示例,但我已经捕获了核心细节。

【问题讨论】:

    标签: python kivy kivy-language


    【解决方案1】:

    如果使用现有的,您正在创建 intLab 的新实例

    def update(self, dt):
        t = intLab() #creating a new one == :(
        intLab.on_disable(t)
    

    你需要访问现有的 intLad instance ,,,

    【讨论】:

    • 如果您建议不要将新实例分配给t,那么调用intLab.on_disable(t) 是没有意义的。删除 t 后,我收到此错误 TypeError: unbound method on_disable() must be called with intLab instance as first argument (got nothing instead)
    • 你应该以其他方式访问它,例如,ugly way,保持对它的全局引用
    • 你能给我举个例子吗?我不知道你的意思。谢谢
    • 在 intLab 的 _init_ 中,只需写: global t;t=self #现在您可以从任何地方访问它...(这不是一个好习惯不过)
    猜你喜欢
    • 2015-08-04
    • 1970-01-01
    • 1970-01-01
    • 2014-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多