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}
您的代码存在一些问题:
首先,您发布的代码没有 运行。 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
文件中删除这三行。
我正在尝试使用 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}
您的代码存在一些问题:
首先,您发布的代码没有 运行。 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
文件中删除这三行。