Search code examples
pythonkivytransition

Kivy ScreenManager transitions not animating after pop up is clicked


I am new to Kivy and I recently started to create my own application. But there's one problem I have that I can't figure out why it's doing it.

Basically when I open my app and press the button to go to the other screen it does the sliding transition succesfully. But when I open a pop up and close it and hit the same button again, it doesn't do any transition and both screens overlap each other. Why exactly is this the case?

The thing that almost fixed it is using self.manager.current = "second" in the python file but the sliding animation is still not there and it just cuts to the next screen. Or pehaps is there a way to make the sliding animation inside the python file?

I have provided a simple example code to demonstrate the issue. I didn't want to put all of what I've done since it would be too much code.

Any help or suggestions would be appriciated!

Here is the example code

import kivy                                                                                              
from kivy.app import App                                                                                 
from kivy.uix.floatlayout import FloatLayout                                                             
from kivy.uix.textinput import TextInput                                                                 
from kivy.uix.label import Label                                                                         
from kivy.uix.button import Button,ButtonBehavior                                                        
from kivy.uix.widget import Widget                                                                       
from kivy.uix.screenmanager import Screen, ScreenManager, SlideTransition, CardTransition, FadeTransition
from kivy.uix.popup import Popup,PopupException                                                          
from kivy.lang import Builder                                                                            
                                                                                                         
class FirstScreen(Screen):                                                                               
    def screen1btn(self):                                                                                
        popup = FloatLayout()                                                                            
        pop = Popup(title="Popup", content=popup, size_hint=(0.6, 0.6))                                  
                                                                                                         
        pop.open()                                                                                       
                                                                                                         
class SecondScreen(Screen):                                                                              
    pass                                                                                                 
                                                                                                         
class WindowManager(ScreenManager):                                                                      
    pass                                                                                                 
                                                                                                         
class ExampleApp(App):                                                                                   
    def build(self):                                                                                     
        return WindowManager()                                                                           
                                                                                                         
if __name__ == "__main__":
    ExampleApp().run()                                              

.kv file

#:import SlideTransition kivy.uix.screenmanager.SlideTransition

<WindowManager>:
    FirstScreen:
    SecondScreen:

<FirstScreen>:
    name: "first"
    FloatLayout:
        Label:
            text: "Screen 1"
            font_size: 20
            pos_hint: {"x": 0.35,"y": 0.3}
        Button:
            text: "Popup"
            size_hint: 0.3,0.1
            pos_hint: {"x": 0.35,"y": 0.4}
            on_release:
                app.root.transition = SlideTransition(direction = "left")
                app.root.current = root.screen1btn()
        Button:
            text: "Go to second screen"
            size_hint: 0.5,0.1
            pos_hint: {"x": 0.35,"y": 0.1}
            on_release:
                app.root.transition = SlideTransition(direction = "right")
                app.root.current = "second"

<SecondScreen>:
    name: "second"
    FloatLayout:
        Label:
            text: "Screen 2"
            font_size: 20
            pos_hint: {"x": 0.35,"y": 0.3}
        Button:
            text: "Go back"
            size_hint: 0.5, 0.1
            pos_hint: {"x": 0.35,"y": 0.1}
            on_release:
                app.root.transition = SlideTransition(direction = "left")
                app.root.current = "first"

                             

Solution

  • The problem is your 'kv' code for the Popup Button:

        Button:
            text: "Popup"
            size_hint: 0.3,0.1
            pos_hint: {"x": 0.35,"y": 0.4}
            on_release:
                app.root.transition = SlideTransition(direction = "left")
                app.root.current = root.screen1btn()
    

    Not sure what that is tying to do, but I believe it should just be opening the Popup, like this:

        Button:
            text: "Popup"
            size_hint: 0.3,0.1
            pos_hint: {"x": 0.35,"y": 0.4}
            on_release: root.screen1btn()
    

    Note that the two lines referencing app.root have been removed. Now the Button just opens the Popup.