Kivy обновляет ярлык при использовании функции с помощью кнопки не работает - PullRequest
0 голосов
/ 12 июля 2020

Я пытаюсь создать приложение, которое использует определенные входные параметры, и при нажатии кнопки отправки оно использует logi c для генерации выходных параметров. Мне удалось создать приложение, ввод и запуск с помощью кнопки отправки. Теперь я хочу сгенерировать вывод, чтобы начать с простого logi c. Я нашел несколько похожих решений, но почему-то у меня они не работают. По какой-то причине мой .kv файл не получает обновленное значение для текста метки с ошибкой: «ValueError: Label.text accept only str», хотя все объявлено как строка в .py. Если я изменю его в kv на str ("..."), я получу некоторую строку кода, которая, как мне кажется, является внутренним идентификатором атрибута, но не присвоенным значением, которое я хочу получить. Я надеюсь, что вы можете помочь. Пожалуйста, не будьте слишком сложными sh, я новичок в 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


Я действительно надеюсь, что вы можете помочь, я уже давно боролся с этим, и он должен скорее будь проще ... заранее спасибо!

1 Ответ

0 голосов
/ 13 июля 2020

В вашем правиле kv для <OutputParameters@GridLayout> у вас есть строка:

frequenz: _frequenz

, которая устанавливает frequenz как ссылку на Label с id из _frequenz . Затем в этом Label вы устанавливаете text, используя:

text:  root.frequenz

Итак, вы пытаетесь установить text из Label на ссылку на этот 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)
...