当用户按下底部的图标时,我试图提出一种逻辑来更改屏幕。我可以使用“测试”按钮来更改它的屏幕,但是底部工具栏图标有困难。下面是我的代码。当我按下第二个图标时,其打印的“ Hello”表示代码似乎可以正常工作,但我感觉缺少连接到不同屏幕的kivy功能。请让我知道我在做什么错。
from kivymd.app import MDApp
from kivy.uix.screenmanager import Screen, ScreenManager
from kivy.lang import Builder
from kivymd.uix.floatlayout import FloatLayout
from kivymd.uix.textfield import MDTextField
# Builder String
allLayout = '''
ScreenManager:
MainPage:
#List:
#History:
StudentName:
#Support:
#FAQ:
#TermsAndConditions:
#MyAccount:
<Button@MdButton>:
font_size: 20
background_color: 144/235,252/255,144/255,1
size_hint: 0.32, 0.07
<Ticker@MDTextField>:
font_size: 20
hint_text: "Enter student Name"
icon_right: 'database-search'
helper_text: "From the list (2nd icon in bottom bar)"
helper_text_mode: 'on_focus'
size_hint_x : None
width:200
<MainPage>:
name: 'mainpage1'
NavigationLayout:
ScreenManager:
Screen:
BoxLayout:
orientation:'vertical'
MDToolbar:
title: 'Main Page'
elevation: 10
right_action_items: [["dots-vertical", lambda x: x]]
# on_action_button: app.callback(self.icon)
Widget: #if you delete this line... you will spend hours figuring out like before
MDBottomAppBar:
MDToolbar:
icon: "history"
text_color: 0,0,0,0
icon_size: 0.5
type: "bottom"
mode: "end"
left_action_items: [["home", lambda x: x], ["view-list", lambda x: app.listScreen()], ["watch", lambda x: x], ["help", lambda x: x]]
Button:
text:"Class 1"
pos_hint: {'x': 0.025, 'y':.8}
Button:
text:"Class 2"
pos_hint: {'x': 0.345, 'y':.8}
Button:
text:"Class 3"
pos_hint: {'x': 0.665, 'y':.8}
Ticker:
pos_hint: {'x':0.025, 'y': .7}
Button:
text:"Test"
pos_hint: {'x': 0.665, 'y':.6}
on_release:
root.manager.current = 'student'
<StudentName>:
name: 'student'
MDLabel:
text: "Hi"
'''''
class MainPage(Screen):
pass
class StudentName(Screen):
pass
sm = ScreenManager()
sm.add_widget(MainPage(name = 'mainpage1'))
sm.add_widget(StudentName(name = 'student'))
class DemoApp(MDApp):
def listScreen(self):
self.current = StudentName()
print("Hello")
# root.manager.transition.direction = 'left'
def build(self):
self.theme_cls.primary_palette = 'Lime'
self.theme_cls.primary_hue = 'A700'
screen = Screen()
main_code = Builder.load_string(allLayout)
screen.add_widget(main_code)
return screen
DemoApp().run()
代码中发生了几件奇怪的事情。一种是代码:
sm = ScreenManager()
sm.add_widget(MainPage(name = 'mainpage1'))
sm.add_widget(StudentName(name = 'student'))
正在创建ScreenManager
并添加Screens
到其中。但是,然后不使用created ScreenManager
(sm
)。可以删除这些行。
另一个是build()
方法代码:
screen = Screen()
main_code = Builder.load_string(allLayout)
screen.add_widget(main_code)
return screen
这段代码使用来构建整个显示器Builder.load_string()
。该显示ScreenManager
的根为(如字符串所定义allLayout
)。然后将ScreenManager
其添加到Screen
(screen.add_widget(main_code)
),然后将Screen
其返回到App根窗口。我怀疑这不是您想要的,但这完全是法律法规。我怀疑该build()
方法实际上应该是:
def build(self):
self.theme_cls.primary_palette = 'Lime'
self.theme_cls.primary_hue = 'A700'
main_code = Builder.load_string(allLayout)
return main_code
上面的代码使ScreenManager
App的根目录显示出来。
最后一个问题是listScreen()
方法。该行:
self.current = StudentName()
正在创建的新实例,Student
然后将其赋值给一个名为变量current
的DemoApp
类。我怀疑您实际上想这样更改Screens
:
def listScreen(self):
self.root.current = 'student'
print("Hello")
此代码将current
应用程序根目录(即ScreenManager
)的属性设置为StudentName
该类的现有实例。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句