提问人:Leon Kardaš 提问时间:4/26/2021 更新时间:4/26/2021 访问量:147
Kivy - 无法使用 id 更改 .text
Kivy - Can't change .text with id
问:
我正在尝试使用 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赞
John Anderson
4/26/2021
#1
代码存在一些问题:
首先,您发布的代码不会运行。你的行:kv
text: nameOfSong
是非法的。
二、代码:
def swap(self):
Name().changeName()
正在创建新实例并调用该新实例。但是,该新实例不是 GUI 中显示的实例。Name
changeName()
要解决这个问题,你只需要调用你的GUI中的实例。方便的是,您已经保存了对正确实例的引用,并带有以下行:changeName()
Name
self.z = Name()
因此,您可以更改方法以使用该实例:swap()
Name
def swap(self):
self.z.changeName()
另一个问题是该方法尝试使用不存在的 id 。要解决这个问题(并使你发布的代码可运行),只需更改 kv 中的规则来定义:changeName()
nameOfSong
<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
评论