【发布时间】:2019-08-30 18:20:33
【问题描述】:
我想使用 ScreenManager 创建一种工作流程,该工作流程会随着选项的选择而进行。我在 ScreenManager 中定义了几个屏幕,在一个屏幕中我创建了一个带有多个选项的 Spinner。我想从 on_text 调用一个函数并传递选定的 Spinner 值,根据传递的值执行任务,然后移动到工作流中的下一个屏幕。
我在一个类(屏幕)中创建了一个函数,其中只有一个 print() 用于测试目的。当我从 Spinner 中选择一个选项时,没有任何反应。
我只提供了我认为相关的代码...
kv 文件:
<HomeScreen>:
name: 'homeScreen'
BoxLayout:
orientation: 'horizontal'
Label:
id: 'home'
text: 'Home Screen'
<NewSession>:
name: 'newSession'
BoxLayout:
orientation: 'vertical'
Label:
id: new
text: 'Create New Session'
Spinner:
size_hint: None, None
size: 100, 25
id: category
font_size: 12
text: "Food Category" #default value showed
values: ["Beef","Pork","Poultry", "Fish"] #list of values to show
on_text: root.SelectCut(category.text)
Widget:
<CurrentSession>:
id: cs
name: 'currentSession'
BoxLayout:
orientation: 'vertical'
Label:
id: cSession
text: root.cSession
<History>:
name: 'history'
BoxLayout:
orientation: 'vertical'
Label:
id: 'history'
text: 'History Data Screen'
<ScreenManagement>:
HomeScreen:
NewSession:
CurrentSession:
History:
<AllScreen>:
orientation: 'vertical'
ScreenManagement:
id: sm
BoxLayout:
size_hint_y: None
height: 60
spacing: 5
padding: 5, 5, 0, 5
Button:
text: 'Home'
on_press: root.ids.sm.current = 'homeScreen'
Button:
text: 'New Session'
on_press: root.ids.sm.current = 'newSession'
Button:
text: 'Current Session'
on_press:
root.ids.sm.current = 'currentSession'
Button:
text: 'History'
on_press: root.ids.sm.current = 'history'
py 文件:
Builder.load_file("screenLayout.kv")
class ScreenManagement(ScreenManager):
pass
class HomeScreen(Screen):
pass
class NewSession(Screen):
def SelectCut(self, text):
print("In Select Cut")
print("Food Category: " + text)
self.sm.current = 'homeScreen'
class CurrentSession(Screen):
pass
class History(Screen):
pass
class AllScreen(BoxLayout):
pass
class WorkingTestApp(App):
def build(self):
self.root = AllScreen()
return self.root
if __name__ == '__main__':
WorkingTestApp().run()
我无法弄清楚为什么从 Spinner 进行选择时什么都没有发生,并且我不确定从函数中移动到下一个屏幕的语法是什么。
更新: 当前代码(减去导入)
kv:
<HomeScreen>:
name: 'homeScreen'
BoxLayout:
orientation: 'horizontal'
Label:
id: 'home'
text: 'Home Screen'
<NewSession>:
name: 'newSession'
BoxLayout:
orientation: 'vertical'
Label:
id: new
text: 'Create New Session'
Spinner:
size_hint: None, None
size: 100, 25
id: category
font_size: 12
text: "Food Category" #default value showed
values: ["Beef","Pork","Poultry", "Fish"] #list of values to show
on_text: root.SelectCategory()
Widget:
<SelectCut>:
name: 'selectCut'
BoxLayout:
orientation: 'vertical'
Label:
id: 'cut'
text: 'Select Cut Screen'
Widget:
<CurrentSession>:
name: 'currentSession'
BoxLayout:
orientation: 'vertical'
Label:
id: cSession
text: 'Current Session Screen'
<History>:
name: 'history'
BoxLayout:
orientation: 'vertical'
Label:
id: 'history'
text: 'History Data Screen'
<ScreenManagement>:
HomeScreen:
NewSession:
SelectCut:
CurrentSession:
History:
<AllScreen>:
orientation: 'vertical'
ScreenManagement:
id: sm
BoxLayout:
size_hint_y: None
height: 60
spacing: 5
padding: 5, 5, 0, 5
Button:
text: 'Home'
on_press: root.ids.sm.current = 'homeScreen'
Button:
text: 'New Session'
on_press: root.ids.sm.current = 'newSession'
Button:
text: 'Current Session'
on_press:
root.ids.sm.current = 'currentSession'
Button:
text: 'History'
on_press: root.ids.sm.current = 'history'
py:
Builder.load_file("screenLayout.kv")
class ScreenManagement(ScreenManager):
pass
class HomeScreen(Screen):
pass
class NewSession(Screen):
# This Function isn't executing consistently.
def SelectCategory(self):
print("Food Category: " + self.ids.category.text)
self.manager.current = 'selectCut'
class SelectCut(Screen):
pass
class CurrentSession(Screen):
pass
class History(Screen):
pass
class AllScreen(BoxLayout):
pass
class WorkingTestApp(App):
def build(self):
self.root = AllScreen()
return self.root
if __name__ == '__main__':
WorkingTestApp().run()
【问题讨论】:
-
在您的
SelectCut()方法中,只需添加self.manager.current = 'someScreenName'。其中someScreenName是您的Screens之一的名称。 -
您的
SelectCut()方法应在您的Spinner文本更改时执行。如果它没有被调用,那么你的代码中肯定还有一些你没有发布的东西。 -
我已经更新了我的原始帖子以包含完整的 py 文件(减去导入)和 kv 文件。
标签: python-3.x kivy spinner