簡體   English   中英

使用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循環中,我們實例化MyButton類的對象,該類是Button的子級。 注意,我們還在類定義中定義了一個on_press處理函數。 除了可能綁定的其他功能之外,還需要調用此函數。 但是,實際上,在kivy事件和屬性文檔中,所有這些都得到了很好的解釋。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM