使用 python 逻辑更改屏幕(Kivy 屏幕管理器)
Change screens with python logic (Kivy Screen manager)
我无法在 python 代码中找到设置 on_press
的语法以在任何地方更改屏幕。我不断收到 Button(text = 'hi', on_press = self.current = 'start_menu
之类的错误。这是代码,它按原样工作。
class LoadMenu(Screen):
def __init__(self, **kwargs):
super(LoadMenu, self).__init__(**kwargs)
Clock.schedule_once(self.update)
def update(self, dt):
L = [x for x in range(len(os.listdir('saves')))]
for x in L:
x = self.add_widget(Button(text = os.listdir('saves')[x]))
我没有放置按钮,所以它们只是彼此重叠,但我可以稍后修复。我需要做的是让每个按钮在按下时更改为 play
屏幕,这样每个按钮都是相同的,但我还需要每个按钮加载它们引用的 Shelve 文件。(我知道我'为此我需要另一个函数)我可以让 on_press
一次触发两个事件吗?如何在 python 代码中设置它?
考虑以下程序:
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import Screen
from kivy.uix.button import Button
from kivy.clock import Clock
from kivy.properties import StringProperty
dirlist = ['aaa', 'bbb', 'ccc', 'ddd']
class MyButton(Button):
prop = StringProperty('')
def on_press(self):
print "Class-defined on_press handler (I'm {})".format(self.text)
def other_on_press_handler(sender):
print "other_on_press_handler, from {}".format(sender.text)
def some_func(text):
print "yeah: " + text
class LoadMenu(Screen):
def __init__(self, **kwargs):
super(LoadMenu, self).__init__(**kwargs)
Clock.schedule_once(self.update)
def on_press_handler(self, sender):
print "on_press_handler, from {}".format(sender.text)
self.parent.current = 'sc2'
def yet_another_on_press_handler(self, sender):
print "yet_another_on_press_handler, from {}".format(sender.text)
self.parent.current = 'sc2'
def update(self, dt):
for x in range(len(dirlist)):
my_b = Button(text = dirlist[x], on_press=self.on_press_handler)
self.parent.ids.button_container.add_widget(my_b)
if x > 1:
my_b.bind(on_press=other_on_press_handler)
if x == 3:
my_b.bind(on_press=lambda sender: some_func("Whoa, lambda was here ({})".format(sender.text)))
for x in range(len(dirlist)):
my_b = MyButton(text = 'my '+ dirlist[x], prop="{} {}".format(dirlist[x], x))
self.parent.ids.button_container.add_widget(my_b)
my_b.bind(on_press=self.yet_another_on_press_handler)
root = Builder.load_string("""
ScreenManager:
LoadMenu:
name: 'sc1'
GridLayout:
cols: 4
id: button_container
Screen:
name: 'sc2'
BoxLayout:
Button:
text: "Go back"
on_press: root.current = 'sc1'
""")
class MyApp(App):
def build(self):
return root
if __name__ == '__main__':
a = MyApp()
a.run()
让我们先看看LoadMenu
中的update
方法:在第一个循环中,生成了一堆按钮,每个按钮在创建时都会收到一个on_press
回调。循环中的最后两个按钮绑定到另一个回调,最后一个示例展示了如何使用 lambda 表达式生成回调。
在第二个 for 循环中,我们实例化 class MyButton
的对象,Button
的子对象。请注意,我们还在 class 定义中定义了一个 on_press
处理程序;除了我们可能绑定的其他函数之外,还会调用 this。
但实际上,这实际上在 kivy Events and Properties docs.
中得到了很好的解释
我无法在 python 代码中找到设置 on_press
的语法以在任何地方更改屏幕。我不断收到 Button(text = 'hi', on_press = self.current = 'start_menu
之类的错误。这是代码,它按原样工作。
class LoadMenu(Screen):
def __init__(self, **kwargs):
super(LoadMenu, self).__init__(**kwargs)
Clock.schedule_once(self.update)
def update(self, dt):
L = [x for x in range(len(os.listdir('saves')))]
for x in L:
x = self.add_widget(Button(text = os.listdir('saves')[x]))
我没有放置按钮,所以它们只是彼此重叠,但我可以稍后修复。我需要做的是让每个按钮在按下时更改为 play
屏幕,这样每个按钮都是相同的,但我还需要每个按钮加载它们引用的 Shelve 文件。(我知道我'为此我需要另一个函数)我可以让 on_press
一次触发两个事件吗?如何在 python 代码中设置它?
考虑以下程序:
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import Screen
from kivy.uix.button import Button
from kivy.clock import Clock
from kivy.properties import StringProperty
dirlist = ['aaa', 'bbb', 'ccc', 'ddd']
class MyButton(Button):
prop = StringProperty('')
def on_press(self):
print "Class-defined on_press handler (I'm {})".format(self.text)
def other_on_press_handler(sender):
print "other_on_press_handler, from {}".format(sender.text)
def some_func(text):
print "yeah: " + text
class LoadMenu(Screen):
def __init__(self, **kwargs):
super(LoadMenu, self).__init__(**kwargs)
Clock.schedule_once(self.update)
def on_press_handler(self, sender):
print "on_press_handler, from {}".format(sender.text)
self.parent.current = 'sc2'
def yet_another_on_press_handler(self, sender):
print "yet_another_on_press_handler, from {}".format(sender.text)
self.parent.current = 'sc2'
def update(self, dt):
for x in range(len(dirlist)):
my_b = Button(text = dirlist[x], on_press=self.on_press_handler)
self.parent.ids.button_container.add_widget(my_b)
if x > 1:
my_b.bind(on_press=other_on_press_handler)
if x == 3:
my_b.bind(on_press=lambda sender: some_func("Whoa, lambda was here ({})".format(sender.text)))
for x in range(len(dirlist)):
my_b = MyButton(text = 'my '+ dirlist[x], prop="{} {}".format(dirlist[x], x))
self.parent.ids.button_container.add_widget(my_b)
my_b.bind(on_press=self.yet_another_on_press_handler)
root = Builder.load_string("""
ScreenManager:
LoadMenu:
name: 'sc1'
GridLayout:
cols: 4
id: button_container
Screen:
name: 'sc2'
BoxLayout:
Button:
text: "Go back"
on_press: root.current = 'sc1'
""")
class MyApp(App):
def build(self):
return root
if __name__ == '__main__':
a = MyApp()
a.run()
让我们先看看LoadMenu
中的update
方法:在第一个循环中,生成了一堆按钮,每个按钮在创建时都会收到一个on_press
回调。循环中的最后两个按钮绑定到另一个回调,最后一个示例展示了如何使用 lambda 表达式生成回调。
在第二个 for 循环中,我们实例化 class MyButton
的对象,Button
的子对象。请注意,我们还在 class 定义中定义了一个 on_press
处理程序;除了我们可能绑定的其他函数之外,还会调用 this。
但实际上,这实际上在 kivy Events and Properties docs.