Kivy - 无法更改带有 id 的 .text
Posted
技术标签:
【中文标题】Kivy - 无法更改带有 id 的 .text【英文标题】:Kivy - Can't change .text with id 【发布时间】:2021-07-19 15:59:14 【问题描述】:我正在尝试使用 id 更改标签的文本,我尝试使用 stringProperty,使用不带任何属性的 objectProperty。我的代码中肯定缺少一些东西,因为无论我尝试什么,它都无法正常工作,我们将不胜感激。
这段代码是一个简单的屏幕,有 2 个按钮,一个用于转到另一个屏幕,一个用于更改标签
from kivy.app import *
from kivy.uix.button import *
from kivy.graphics import *
from kivy.uix.widget import *
from kivy.uix.label import *
from kivy.uix.floatlayout import *
from kivy.uix.boxlayout import *
from kivy.uix.relativelayout import *
from kivy.uix.scrollview import ScrollView
from kivy.properties import ListProperty, StringProperty,ObjectProperty
from kivy.uix.screenmanager import ScreenManager,Screen
from kivy.core.window import Window
from kivy.lang import Builder
from kivy.uix.gridlayout import GridLayout
class WindowManager(ScreenManager):
pass
class Name(FloatLayout):
def __init__(self, **kwargs):
super(Name, self).__init__(**kwargs)
def changeName(self):
print(self.ids)
self.name = self.ids.nameOfSong.text
print(self.name)
self.ids.nameOfSong.text = 'name'
self.name = self.ids.nameOfSong.text
print(self.name)
class MainWindow(Screen):
def __init__(self, **kwargs):
super(MainWindow, self).__init__(**kwargs)
self.pos = (0, 0)
self.size = (1,1)
self.z = Name()
self.add_widget(self.z)
def swap(self):
Name().changeName()
class SecondWindow(Screen,BoxLayout):
def __init__(self, **kwargs):
super(SecondWindow, self).__init__(**kwargs)
class langApp(App):
def build(self):
sm = ScreenManager()
sm.add_widget(MainWindow(name='main'))
sm.add_widget(SecondWindow(name='second'))
return sm
Builder.load_file("kiv.kv")
if __name__ == '__main__':
langApp().run()
我的kiv.kv文件,大部分都没有连接到问题(我认为)
#:kivy 1.11.1
WindowManager:
MainWindow:
SecondWindow:
<MainWindow>:
name: "main"
FloatLayout:
pos: 0,0
size: root.width,root.height
Button:
on_release:
root.manager.transition.direction = 'left'
app.root.current = "second"
text: 'Stop'
pos_hint: 'x':.45,'y':.1
size_hint: .1,.1
Button:
on_press: root.swap()
text: 'Next'
pos_hint: 'x':.65,'y':.1
size_hint: .1,.1
<SecondWindow>:
name: "second"
FloatLayout:
pos: 0,0
size: root.width,root.height
Button:
on_release:
root.manager.transition.direction = 'right'
app.root.current = "main"
text: 'Stop'
pos_hint: 'x':.45,'y':.1
size_hint: .1,.1
<Name>:
Label:
text: nameOfSong
font_size: 20
size_hint: None, None
pos_hint: 'x': 0.435, 'y': 0.25
【问题讨论】:
【参考方案1】:您的代码存在一些问题:
首先,您发布的代码无法运行。你kv
中的那一行:
text: nameOfSong
是非法的。
二、代码:
def swap(self):
Name().changeName()
正在创建Name
的新实例并在该新实例上调用changeName()
。但是,该新实例不是您的 GUI 中显示的那个。
要解决这个问题,您只需在 GUI 中的 Name
实例上调用 changeName()
。方便的是,您使用以下行保存了对正确实例的引用:
self.z = Name()
因此,您可以更改 swap()
方法以使用 Name
的实例:
def swap(self):
self.z.changeName()
另一个问题是changeName()
方法尝试使用不存在的 id nameOfSong
。要解决这个问题(并使您发布的代码可运行),只需更改 kv 中的 <Name>
规则以定义 id
:
<Name>:
Label:
id: nameOfSong
text: 'Some Name'
font_size: 20
size_hint: None, None
pos_hint: 'x': 0.435, 'y': 0.25
在不相关的注释中,您的代码正在构建 App
GUI
两次。行:
Builder.load_file("kiv.kv")
正在构建GUI
的行:
WindowManager:
MainWindow:
SecondWindow:
你的 python 代码在这里再次构建它:
def build(self):
sm = ScreenManager()
sm.add_widget(MainWindow(name='main'))
sm.add_widget(SecondWindow(name='second'))
return sm
您可以从kv
文件中删除这三行。
【讨论】:
以上是关于Kivy - 无法更改带有 id 的 .text的主要内容,如果未能解决你的问题,请参考以下文章