如果在 kivy 文件中定义了屏幕管理器,如何在 Python 中更改屏幕?
Posted
技术标签:
【中文标题】如果在 kivy 文件中定义了屏幕管理器,如何在 Python 中更改屏幕?【英文标题】:How to change screen in Python if Screen Manager is defined in kivy file? 【发布时间】:2016-02-23 22:19:22 【问题描述】:我的程序在一个屏幕上接受输入,然后将其显示到另一个屏幕上。我想设定一个条件,即屏幕仅在值大于 0 时才会改变。 我的屏幕管理器在 kivy 文件中定义。 我的问题是如何在我的情况下使用这个 "root.manager.current = "SecondScreen"" 命令。我不知道如何引用它。 或者也许有办法在 .kv 文件中创建条件?
main.py
from kivy.app import App
from kivy.properties import StringProperty, NumericProperty, ObjectProperty
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.textinput import TextInput
from kivy.properties import StringProperty, NumericProperty, ObjectProperty
global var
global pp
pp = '0'
class FirstScreen(Screen):
global pp
ppp = StringProperty('')
def g(self, text):
global pp
if text.isdigit() and int(text) > 0:
pp = text
我的 test.kv 文件
ScreenManager:
id: screen_manager
FirstScreen:
id: screen1
name: "FirstScreen"
manager: screen_manager
SecondScreen:
id: screen2
name: "SecondScreen"
manager: screen_manager
<FirstScreen>:
text_input: text_input
FloatLayout:
id: fl1
canvas.before:
Color:
rgba: 0.1, 0.1, 0.1, 1
Rectangle:
# self here refers to the widget i.e BoxLayout
pos: self.pos
size: self.size
TextInput:
id: text_input
text: root.ppp
multiline: False
size_hint_x: .4
size_hint_y: .1
pos_hint: 'x': .1, 'y': .20
Button:
background_color: 0.2, 0.7, 1, 1,
font_size: root.width / 15
id: btn1
text: "Next"
on_press:
root.g(text_input.text)
root.manager.current = 'SecondScreen'
size_hint_x: .4
size_hint_y: .1
pos_hint: 'x': .5, 'y': .20
<SecondScreen>:
on_enter: root.f()
FloatLayout:
id: fl2
canvas.before:
Color:
rgba: 0.1, 0.1, 0.1, 1
Rectangle:
# self here refers to the widget i.e BoxLayout
pos: self.pos
size: self.size
Label:
color: 0.2, 0.7, 1, 1,
font_size: 15
id: lb1
text: root.idf
size_hint_y: .2
pos_hint: 'x': .1, 'y': .8
【问题讨论】:
【参考方案1】:kvlang中的方法:
app.root.current = 'screen_name_you_want_to_switch_to'
可以通过在屏幕类中使用 self.parent 在 python 中完成:
self.parent.current = 'screen_name_you_want_to_switch_to'
self.parent是指self对象(screen)的父对象(screenmanager)
显示两者的示例如下所示,首先是文本输入的旁注:我认为您可以直接使用self.ids['text_input'].text
访问该值,您可以尝试一下。
import kivy
kivy.require('1.9.0')
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager,Screen
kvlang = '''
<ScreenManagement>:
ScreenOne:
ScreenTwo:
<ScreenOne>:
name: 'First'
id: screen1
Button:
text: 'screen 1, press me to switch to screen 2, defined in python'
on_press: root.switch()
<ScreenTwo>:
name: 'Second'
id: screen2
Button:
text: 'screen 2, press me to switch to screen 1, defined in kvlang'
on_press: app.root.current = 'First'
'''
class ScreenManagement(ScreenManager):
pass
class ScreenOne(Screen):
def switch(self):
#here you can insert any python logic you like
self.parent.current = 'Second'
class ScreenTwo(Screen):
pass
class MyApp(App):
def build(self):
Builder.load_string(kvlang)
return ScreenManagement()
if __name__ == '__main__':
MyApp().run()
【讨论】:
【参考方案2】:一种方法是在 python 文件中交换屏幕。首先简单地定义屏幕管理器,没有属性或子项(添加屏幕将在 python 中完成)
<ScreenManager>:
将 ScreenManager 类与 FirstScreen 和 SecondScreen 类一起添加到 python 文件。给 ScreenManager() 方法来交换 FirstScreen 和 SecondScreen
class ScreenManager(widget):
def __init__(self):
self.show_FirstScreen()
def show_FirstScreen(self):
firstscreen = FirstScreen()
self.clear_widgets()
self.add_widget(firstscreen)
def show_SecondScreen(self):
secondscreen = SecondScreen()
self.clear_widgets()
self.add_widget(secondscreen)
然后添加一个由 on_press 按钮事件调用的方法,以在显示不同的屏幕之前执行一些逻辑,例如
def handle_button(self):
if <some logic>:
self.show_SecondScreen()
.kv 文件中的按钮按下必须到达 ScreenManager 类才能到达 handle_button 方法,类似于 root.parent.handle_button,具体取决于结构的深度
【讨论】:
以上是关于如果在 kivy 文件中定义了屏幕管理器,如何在 Python 中更改屏幕?的主要内容,如果未能解决你的问题,请参考以下文章
Kivy:使用 on_press 事件在屏幕管理器中更改屏幕