python - 按钮文本不更新
问题描述
>> 背景:
我想通过按下 MainScreen 中的 Button 来更新/更改 SecondScreen 中 Button 的文本。好吧,我做了一些研究并做了我想做的事,当我在终端中签入时,文本确实发生了变化。但是,SecondScreen 上显示的文本没有。
>> 这就是我所做的:
((请注意,我仅使用代码片段,我将在下面发布整个代码。))
Button:
text:"PRESS TO CHANGE TEXT"
on_press:
root.funcself()
## on press it goes to it's root and do the "funcself" function in it
这是:
class MainScreen(Screen):
def funcself(self):
app.second.funcscreen()
## it re-directs to the SecondScreen and do the "funcscreen" function
这是:
class SecondScreen(Screen):
def funcscreen(self):
self.ids["button"].text = "SUPPOSED TO CHANGE TO THIS"
然后我通过做检查我是否成功print(self.ids["button"].text)
,是的!它确实改变了,但是当我导航到下一个屏幕时,显示的文本仍然没有改变。
有人介意帮助和解释吗?
完整代码:
蟒蛇文件:
import kivy from kivy.app import App from kivy.lang import Builder from kivy.uix.label import Label from kivy.uix.widget import Widget from kivy.uix.button import Button from kivy.uix.gridlayout import GridLayout from kivy.uix.screenmanager import ScreenManager, Screen class MainScreen(Screen): def funcself(self): app.second.funcscreen() class SecondScreen(Screen): def funcscreen(self): value = self.ids["button"] self.ids["button"].text = "SUPPOSED TO CHANGE TO THIS" kv = Builder.load_file("reproduce.kv") class reproduce(App): second = SecondScreen() def build(self): return kv def change_screen(self, x): scrnmngr = self.root.ids["sm"] scrnmngr.current = x def check(self): print(self.second.ids["button"].text) if __name__ == "__main__": app = reproduce() app.run()
基维文件:
<MainScreen>: GridLayout: rows:2 Label: text: "PRESS TO GO TO THE NEXT PAGE" GridLayout: cols:2 Button: text:"PRESS TO CHANGE TEXT" on_press: root.funcself() Button: text:">>>" on_press: app.change_screen("second") root.manager.transition.direction = "left" <SecondScreen>: GridLayout: rows:2 Label: id:label text: "PRESS TO CHECK AND RETURN TO PREV PAGE" Button: id:button text:"TEXT BEFORE CHANGE" on_press: app.change_screen("first") root.manager.transition.direction = "right" app.check() GridLayout: cols: 1 ScreenManager: id:sm MainScreen: id:main name:"first" SecondScreen: id:second name:"second"
解决方案
您在应用程序类中定义的second
属性是屏幕的新实例,而不是您在屏幕管理器中获得的实例,它是您在 kv 中添加的。这就是为什么当您检查时,您会看到它发生了变化,但不是在正确的实例上。当您再次从主屏幕调用 app.second.func 时,它又是错误的实例。
但是您的应用程序始终有根。在您的情况下,它的网格布局。每个屏幕都有一个经理。有几种方法可以访问它。但是你可以这样做。
在 kv 的主屏幕类中:
Button:
text:"PRESS TO CHANGE TEXT"
on_press:
root.manager.get_screen("second").ids["button"].text = "Something"
在这里,它获取屏幕管理器,并使用其get_screen()
方法获取名为 second 的屏幕,然后是该 kv 规则的 id。
推荐阅读
- google-app-maker - 如何在 Google 应用制作工具中将多个应用连接在一起
- machine-learning - 多层感知器与 SVM / 随机森林
- python - 如何使用openCV将图像保存在文件夹中
- c - 将整数添加到指针有什么作用?
- java - How to check if excel column headers are in certain order in apache poi
- spring-mvc - 没有xml的基于Spring MVC java的配置不起作用
- reactjs - ReactNative 警告:列表中的每个孩子都应该有一个唯一的“关键”道具
- laravel - 我需要从淘汰赛中获取 id 并以表格形式传递
- c# - 调用注入类的事件
- django - 如何检查Django中是否已经存在类?