【问题标题】:Kivy updating label when using function via button fails通过按钮使用功能时 Kivy 更新标签失败
【发布时间】:2020-07-12 16:56:51
【问题描述】:

我正在尝试构建一个使用某些输入参数的应用程序,当点击提交按钮时,它使用逻辑来生成输出参数。我设法通过提交按钮构建应用程序以及输入和触发。现在我想生成输出,从一个简单的逻辑开始。我查找了几个类似的解决方案,但不知何故它们对我不起作用。 由于某种原因,我的 .kv 文件没有得到标签文本的更新值,并出现错误:“ValueError:Label.text 只接受 str” 无论如何,所有内容都在 .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文件: 输出参数.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()

我放入所有输入参数的文件,相当重要: 输入参数.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


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

【问题讨论】:

  • 你能在最低限度上分享你的代码吗?很难理解。我没有你的字体和标题、状态栏、输入参数、输出参数 .kv 文件。请编辑和裁剪无用的部分,我无法在代码之间集中注意力和关联。
  • 抱歉,这是我的第二个线程...我更新了代码。希望这样更轻松

标签: python function kivy label updating


【解决方案1】:

&lt;OutputParameters@GridLayout&gt;kv 规则中,您有一行:

frequenz: _frequenz

frequenz 设置为对Label 的引用,其中id_frequenz。然后在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)

【讨论】:

  • 感谢您的回答。现在错误消失了。但就像你提到的那样,我不会在我的 .kv 文件中获得频率值。我更新了帖子,添加了文件名和丢失的文件。现在应该在最低级别上完成。
  • 仍然没有足够的信息来提供完整的答案(我看不到在哪里创建了 OutputParameters 的实例)。但是,我注意到另一个错误。在你使用InputParameters.verfahren的地方,它实际上应该是on_state()方法中的self.verfahren
  • 这就是我能提供的所有信息。这就是我得到的所有脚本,应用程序就是这样运行的......我不太明白你建议的实例。它应该是什么样子?你的意思是像我为 InputParameters 做的ip = App.get_running_app().root.ids._input_parameters?认为这只适用于将 .kv 文件中的某些内容转换为 .py 而不是相反?
  • 我使用您最近发布的信息在我的回答中添加了更多信息。
猜你喜欢
  • 2017-07-20
  • 1970-01-01
  • 1970-01-01
  • 2020-09-01
  • 1970-01-01
  • 2015-09-01
  • 1970-01-01
  • 2020-04-08
相关资源
最近更新 更多