Python 在Kivy中无限设置标签动画-“;“在更改屏幕上”;

Python 在Kivy中无限设置标签动画-“;“在更改屏幕上”;,python,kivy,kivy-language,Python,Kivy,Kivy Language,我想为我的吉他练习制作一个快速脏应用程序(为什么不呢?),并决定在没有Kivy经验的情况下使用Kivy。这是一个非常简单的应用程序(编写的代码非常糟糕),有两个屏幕和一组可反复使用的和弦。用户选择他想要练习的和弦(切换按钮),然后按“接受”按钮,在第二个屏幕上以用户给定的时间间隔对这些和弦进行迭代动画 然而,我在第二个屏幕上用和弦设置“无限变化标签”的动画时遇到了麻烦。我该怎么做?另外,如何将值(用户选择的和弦和分钟数)从第一个屏幕传递到第二个屏幕中的标签 非常感谢您的帮助。希望对有Kivy经验

我想为我的吉他练习制作一个快速脏应用程序(为什么不呢?),并决定在没有Kivy经验的情况下使用Kivy。这是一个非常简单的应用程序(编写的代码非常糟糕),有两个屏幕和一组可反复使用的和弦。用户选择他想要练习的和弦(切换按钮),然后按“接受”按钮,在第二个屏幕上以用户给定的时间间隔对这些和弦进行迭代动画

然而,我在第二个屏幕上用和弦设置“无限变化标签”的动画时遇到了麻烦。我该怎么做?另外,如何将值(用户选择的和弦和分钟数)从第一个屏幕传递到第二个屏幕中的标签

非常感谢您的帮助。希望对有Kivy经验的人来说,解决方案应该非常容易。以下是我的看法(工作不正常):


我尽量不改变你的代码太多

因此,从您离开的地方开始,我使用按钮
Accept
在您的
next\u scren
中初始化标签更改。使用它,我们调用函数
start
传递所选按钮列表和时间,并使用这两个值更新标签

对于此更新,我们可以使用另一个函数安排时钟间隔,以确定下一个按钮是哪个

导入kivy
从kivy.app导入应用程序
从kivy.uix.label导入标签
从kivy.uix.gridlayout导入gridlayout
从kivy.uix.textinput导入textinput
从kivy.uix.button导入按钮
从kivy.uix.stacklayout导入stacklayout
从kivy.uix.togglebutton导入togglebutton
从kivy.uix.screenmanager导入screenmanager,屏幕
从kivy.animation导入动画
从kivy.clock导入时钟
类MyGrid(GridLayout):
定义初始(自我,**kwargs):
超级(MyGrid,self)。\uuuuu初始化(**kwargs)
self.sel_和弦=[]
self.time=0
self.cols=1
self.add_小部件(Label(text=“请选择您想练习的和弦。”)
self.intro=StackLayout()
self.A=切换按钮(text=“A”,size\u hint=(.2,.2))
self.intro.add_小部件(self.A)
self.E=ToggleButton(text=“E”,size_hint=(.2,.2))
self.intro.add_小部件(self.E)
self.C=ToggleButton(text=“C”,size\u hint=(.2,.2))
self.intro.add_小部件(self.C)
self.D=切换按钮(text=“D”,size\u hint=(.2,.2))
self.intro.add_小部件(self.D)
self.G=ToggleButton(text=“G”,size\u hint=(.2,.2))
self.intro.add_小部件(self.G)
self.Cadd9=切换按钮(text=“Cadd9”,size\u hint=(.2,.2))
self.intro.add_小部件(self.Cadd9)
self.add_小部件(self.intro)
self.outro=GridLayout(cols=3)
self.outro.add_小部件(标签(text=“Seconds per chord:”)
self.minutes=TextInput(多行=False)
self.outro.add_小部件(self.minutes)
self.submit=按钮(text=“Accept”,font\u size=40)
self.submit.bind(按=self.press)
self.outro.add_小部件(self.submit)
self.add_小部件(self.outro)
按下def(自身,实例):
self.sel_和弦=[]
如果self.A.state==“down”:
self.sel_和弦附加(“A”)
如果self.C.state==“down”:
self.sel_和弦附加(“C”)
如果self.D.state==“down”:
self.sel_和弦附加(“D”)
如果self.E.state==“向下”:
self.sel_和弦附加(“E”)
如果self.G.state==“down”:
self.sel_和弦附加(“G”)
如果self.Cadd9.state==“down”:
self.sel_和弦.append(“Cadd9”)
尝试:
self.time=int(self.minutes.text)*60
除:
self.time=60
next_screen=App.get_running_App().root.get_screen(“新建_screen”).children[0]
下一个屏幕开始(self.sel\u和弦,self.time)
类MyGrid2(GridLayout):
定义初始(自我,**kwargs):
超级(MyGrid2,self)。\uuuuu初始化(**kwargs)
self.cols=1
self.rows=2
self.temp=“A”
self.lbl=标签(text=“A”)
self.lbl.font\u size='300dp'
self.add\u小部件(self.lbl)
self.back=按钮(text=“back”,font\u size=40)
self.add_小部件(self.back)
自选按钮=无
def启动(自身、按钮列表、时间):
如果len(按钮列表)==0:
返回
自选按钮=按钮列表
self.lbl.text=self.selected_按钮[0]
时钟计划间隔(lambda x:self.update\u lbl(self.next\u按钮()),时间)
def next_按钮(自身):
如果self.selected_按钮索引(self.lbl.text)=len(self.selected_按钮)-1:
返回0
其他:
返回self.selected_按钮索引(self.lbl.text)+1
def更新(自身、按钮、*kwargs):
self.lbl.text=self.selected_按钮[按钮]
类MyScreenManager(屏幕管理器):
定义初始(自我,**kwargs):
超级(MyScreenManager,self)。\uuuu初始化(**kwargs)
self.main\u screen=screen(name=“main\u screen”)
self.new\u screen=屏幕(name=“new\u screen”)
self.add_小部件(self.main_屏幕)
self.add\u小部件(self.new\u屏幕)
main_grid=MyGrid()
main\u grid.submit.bind(在\u press=self.next\u屏幕上)
self.main\u screen.add\u小部件(主网格)
next_grid=MyGrid2()
next\u grid.back.bind(在\u press=self.back\u屏幕上)
self.new\u screen.add\u小部件(下一个\u网格)
def next_屏幕(自身,*参数):
self.current=“新建屏幕”
def背面屏幕(自身,*参数):
self.current=“主屏幕”
类别MyApp(应用程序):
def生成(自):
返回MyScreenManager()
如果名称=“\uuuuu main\uuuuuuuu”:
MyApp().run()

现在,您可以根据需要完善和更改此代码。

可能
screen
应该通过
self.parent
访问
ScreenManager
,然后它可以访问其他
import kivy
from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.gridlayout import GridLayout
from kivy.uix.textinput import TextInput
from kivy.uix.button import Button
from kivy.uix.stacklayout import StackLayout
from kivy.uix.togglebutton import ToggleButton
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.animation import Animation
from kivy.clock import Clock

class MyGrid(GridLayout):
    def __init__(self, **kwargs):
        super(MyGrid, self).__init__(**kwargs)
        self.sel_chords = []
        self.time = 0
        
        self.cols = 1
        self.add_widget(Label(text="Please, select the chords you would like to practise."))

        self.intro = StackLayout()

        self.A = ToggleButton(text = "A", size_hint=(.2,.2))
        self.intro.add_widget(self.A)

        self.E = ToggleButton(text = "E", size_hint=(.2,.2))
        self.intro.add_widget(self.E)
        
        self.C = ToggleButton(text = "C", size_hint=(.2,.2))
        self.intro.add_widget(self.C)
                
        self.D = ToggleButton(text = "D", size_hint=(.2,.2))
        self.intro.add_widget(self.D)
                
        self.G = ToggleButton(text = "G", size_hint=(.2,.2))
        self.intro.add_widget(self.G)
                
        self.Cadd9 = ToggleButton(text = "Cadd9", size_hint=(.2,.2))
        self.intro.add_widget(self.Cadd9)
        self.add_widget(self.intro)
        
        self.outro = GridLayout(cols=3)
        self.outro.add_widget(Label(text="Seconds per chord:"))
        self.minutes = TextInput(multiline=False)
        self.outro.add_widget(self.minutes)
        self.submit = Button(text="Accept", font_size=40)
        self.submit.bind(on_press=self.pressed)
        self.outro.add_widget(self.submit)
        self.add_widget(self.outro)

    def pressed(self, instance):
        if self.A.state == "down":
            self.sel_chords.append("A")
        if self.C.state == "down":
            self.sel_chords.append("C")
        if self.D.state == "down":
            self.sel_chords.append("D")
        if self.E.state == "down":
            self.sel_chords.append("E")
        if self.G.state == "down":
            self.sel_chords.append("G")
        if self.Cadd9.state == "down":
            self.sel_chords.append("Cadd9")
        try:
            self.time = int(self.minutes.text)
        except:
            pass
        
        print(self.time)
        self.time = 0
        self.sel_chords = []

class MyGrid2(GridLayout):
    def __init__(self, **kwargs):
        super(MyGrid2, self).__init__(**kwargs)
        self.cols = 1
        self.rows = 2
        self.temp = "A"
        self.lbl = Label(text="A")
        self.lbl.font_size = '300dp'
        self.add_widget(self.lbl)
        self.back = Button(text="Back", font_size=40)
        self.add_widget(self.back)
        #for element in itertools.cycle(["A", "B"]):
        #   self.lbl.text = element
        def update_lbl(time):
            pass #update lbl to the chords
        Clock.schedule_interval(update_lbl, 1)
        
class MyScreenManager(ScreenManager):
    def __init__(self, **kwargs):
        super(MyScreenManager, self).__init__(**kwargs)

        self.main_screen = Screen(name="main_screen")
        self.new_screen = Screen(name="new_screen")

        self.add_widget(self.main_screen)
        self.add_widget(self.new_screen)

        main_grid = MyGrid()
        main_grid.submit.bind(on_press=self.next_screen)
        self.main_screen.add_widget(main_grid)
        
        next_grid = MyGrid2()
        next_grid.back.bind(on_press=self.back_screen)
        self.new_screen.add_widget(next_grid)
        
    def next_screen(self, *args):
        self.current = "new_screen"   
        
    def back_screen(self, *args):
        self.current = "main_screen" 

class MyApp(App):
    def build(self):
        return MyScreenManager()


if __name__ == "__main__":
    MyApp().run()