通过按钮使用功能时 Kivy 更新标签失败

Kivy updating label when using function via button fails

我正在尝试构建一个使用特定输入参数的应用程序,当点击提交按钮时,它使用逻辑生成输出参数。我设法通过提交按钮构建应用程序和输入和触发。现在我想生成输出,从一个简单的逻辑开始。我查找了几个类似的解决方案,但不知何故它们对我不起作用。 出于某种原因,我的 .kv 文件没有获得标签文本的更新值,并出现错误:“ValueError: Label.text accept only str” Eventough everything are declared as a string in the .py.如果我在 kv 中将它更改为 str("...") 我会得到一些代码行,我猜这是属性的内部 ID 但不是我想要获得的分配值。 我希望你能帮忙。请不要太苛刻,我是 python 和 kivy 的新手...

main .py,应该不是问题的一部分 Peenomat.py

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.anchorlayout import AnchorLayout
from kivy.core.text import LabelBase


Builder.load_file('Statusbar.kv')
Builder.load_file('Inputparameters.kv')
Builder.load_file('Outputparameters.kv')


#Layout
class Peenomat(AnchorLayout):
    pass

class PeenomatApp(App):
    def build(self):
        return Peenomat()

if __name__=="__main__":

    PeenomatApp().run()

.py 与 类 和逻辑方法 StatusBar.py

from kivy.uix.boxlayout import BoxLayout
from kivy.uix.gridlayout import GridLayout
from kivy.properties import ObjectProperty
from kivy.properties import StringProperty
from kivy.app import App




class InputParameters(GridLayout):

    verfahren = ObjectProperty(None)

    def on_state(self, togglebutton):
        tb = togglebutton
        if tb.state == 'down':
            self.verfahren = tb.text
            self.verfahren = tb.text
            print(self.verfahren)
            return self.verfahren


class StatusBar(BoxLayout):
    #InputGrößen
    group_mode = False
    prozess = ObjectProperty(None)
    vorbehandlung = ObjectProperty(None)
    material = ObjectProperty(None)
    haerte = ObjectProperty(None)
    rauheit = ObjectProperty(None)

    #OutputGrößen
    frequenz = StringProperty(None)

    def btn_submit(self):

        ip = App.get_running_app().root.ids._input_parameters
        print("Haerte:", ip.haerte.value, "Rauheit:", ip.rauheit.value, "Material:", ip.material.text, "Vorbehandlung:", ip.vorbehandlung.text)


        if ip.haerte.value < 50:
            self.frequency = str(180)
        elif ip.haerte.value < 60:
            self.frequency = str(200)
        else:
            self.frequency = str(220)
        #control to see if right value is taken
        print(self.frequency, "Hz")

    def btn_clear(self):
        np = App.get_running_app().root.ids._input_parameters
        np.pro1.state = "normal"
        np.pro2.state = "normal"
        np.pro3.state = "normal"
        np.material.text = "Auswahl treffen"
        np.haerte.value = 55
        np.rauheit.value = 5.5

获取不到标签文字的.kv文件: outputparameters.kv

#: import statusbar StatusBar

<OutputParameters@GridLayout>

    #Initialisierung .py zu .kv
    frequenz: _frequenz

    Label:
        text:'Frequenz:'
        font_size:

    Label:
        id: _frequenz
        text:  root.frequenz
        font_size: 20
     

带有提交按钮的 .kv 文件也不应该是问题的一部分,在实现我尝试更新文本的部分之前工作得很好 statusbar.kv

#: import statusbar StatusBar

<StatusBar@BoxLayout>

    orientation:'horizontal'

    Button:
        text: 'Clear'
        on_press: root.btn_clear()

    Button:
        text: 'Submit'
        on_press: root.btn_submit()

我放入所有输入参数的文件,相当重要: Inputparameters.kv

#: import statusbar StatusBar

<InputParameters@GridLayout>
    #Initialisierung .py zu .kv Ids
    prozess: _prozess
    pro1: _prozess1
    pro2: _prozess2
    pro3: _prozess3
    vorbehandlung: _vorbehandlung
    material: _material
    haerte: _haerte
    rauheit: _rauheit


    #Prozess
    Label:
        text:'Prozess:              

    BoxLayout:
        orientation: 'horizontal'
        id: _prozess

        ToggleButton:
            id:_prozess1
            text:'P-MOH'
            group: "proc_group"
            on_state: root.on_state(self)

        ToggleButton:
            id:_prozess2
            text:'E-MOH'
            group: "proc_group"
            on_state: root.on_state(self)

        ToggleButton:
            id:_prozess3
            text:'PE-MOH'
            group: "proc_group"
            on_state: root.on_state(self)

    #Material
    Label:
        text: 'Material:'            

    Spinner:
        id: _material
        text: ""
        values: 

    # Herstellschritte
    Label:
        text:'Fertigungsschritte:'

    Spinner:
        id: _vorbehandlung
        text: 
        values: 

    # Haerte
    Label:
        text:'Haerte:'

    BoxLayout:
        orientation: 'vertical'

        Label:
            text: str(_haerte.value) 

        Slider:
            id: _haerte

    # Rauheit
    Label:
        text:'Rauheit:             

    BoxLayout:
        orientation: 'vertical'

        Label:
            text: 

        Slider:
            id: _rauheit

和我的布局嵌入的文件(也是相当必要的) peenomat.kv

<Peenomat>

    AnchorLayout:
        anchor_x: 'left'
        anchor_y: 'bottom'
        GridLayout:
            cols: 1

            canvas.before:
                Color:
                Rectangle:
                    pos: self.pos
                    size: self.size

            InputParameters:
                id:_input_parameters

            StatusBar:
                id:_status_bar

            OutputParameters:
                id:_output_parameters


我真的希望你能提供帮助,我已经为此苦苦挣扎了一段时间,应该很容易...提前致谢!

<OutputParameters@GridLayout>kv 规则中有一行:

frequenz: _frequenz

frequenz 设置为对 Label_frequenzid 的引用。然后在 Label 中你设置 text 使用:

text:  root.frequenz

因此,您试图将 Labeltext 设置为对 Label

的引用

我建议尝试这样的事情:

<OutputParameters@GridLayout>

    #Initialisierung .py zu .kv
    frequenz: _frequenz
    frequency: ''

并将 Label 更改为:

Label:
    id: _frequenz
    text:  root.frequency
    font_size: 20

但要实际更改标签中显示的值,您需要引用 OutputParameters 的实例,使用如下内容:

App.get_running_app().root.ids._output_parameters.frequency = str(500)