通过按钮使用功能时 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
和 _frequenz
的 id
的引用。然后在 Label
中你设置 text
使用:
text: root.frequenz
因此,您试图将 Label
的 text
设置为对 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 文件没有获得标签文本的更新值,并出现错误:“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
和 _frequenz
的 id
的引用。然后在 Label
中你设置 text
使用:
text: root.frequenz
因此,您试图将 Label
的 text
设置为对 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)