Kivy фон экрана не загружается во время переключения экрана - PullRequest
0 голосов
/ 26 марта 2020

В настоящее время я работаю над своим первым приложением, использующим kivy (простое приложение для работы с таймерами / заметками). Недавно я столкнулся с небольшой проблемой. Несмотря на то, что он работал отлично всего несколько дней go, теперь фон на моем «TimerScreen» загружается медленно. Когда я переключаюсь с «ScheduleScreen» обратно на «TimerScreen», фон временно становится черным до тех пор, пока переходный режим полностью не закончится . Переключение с «GraphScreen» (которое на данный момент является просто кнопкой) обратно на «TimerScreen» не имеет той же проблемы, и фон существует для всего перехода. Я очистил «SceduleScreen» от всех ярлыков и полей ввода текста, думая, что, возможно, он был слишком загружен, так как это был грязный дизайн, но проблема все еще была. Кроме того, это происходит только тогда, когда я запускаю приложение на своем телефоне с помощью приложения kivy, а не на моем компьютере. Я хотел бы, чтобы переход происходил с уже загруженным фоновым изображением, для более плавного ощущения и смотреть. Вот мой код (извините, если код довольно грязный, любые вопросы или предложения приветствуются. Кроме того, У меня возникли небольшие проблемы при вставке кода в этот вопрос, и некоторые пробелы будут отключены , но это не относится к моему фактическому коду).

Builder.load_string("""

<ScheduleScreen>:


    canvas.before:
        Rectangle:
            size: self.size
            source: 'background4.jpg'

    GridLayout:
        cols: 2
        rows: 9

        Label:
            text: "Schedule"
            font_size: '20sp'
            size: dp(100), dp(50)
            size_hint: None, None 

        Label:
            text: "Subject/Hours"
            font_size: '20sp'
            size: dp(100), dp(50)
            size_hint: None, None 



        Label:
            text: "Monday"

        TextInput: 
            id: box1
            multiline: False
            font_size: '17sp'
            size: dp(250), dp(70)
            size_hint: None, None





        Label:
            text: "Tuesday"

        TextInput:     
            id: box2
            multiline: False
            font_size: '17sp'
            size: dp(250), dp(70)
            size_hint: None, None




        Label:
            text: "Wednesday"

        TextInput:     
            id: box3
            multiline: False
            font_size: '17sp'
            size: dp(250), dp(70)
            size_hint: None, None




        Label:
            text: "Thursday"

        TextInput: 
            id: box4    
            multiline: False
            font_size: '17sp'
            size: dp(250), dp(70)
            size_hint: None, None



        Label:
            text: "Friday"

        TextInput:  
            id: box5   
            multiline: False
            font_size: '17sp'
            size: dp(250), dp(70)
            size_hint: None, None





        Label:
            text: "Saturday"

        TextInput:  
            id: box6   
            multiline: False
            font_size: '17sp'
            size: dp(250), dp(70)
            size_hint: None, None




        Label:
            text: "Sunday"

        TextInput:  
            id: box7  
            multiline: False
            font_size: '17sp'
            size: dp(250), dp(70)
            size_hint: None, None




        Button:
            size: dp(100), dp(100)
            pos_hint: {'center_x': .85, 'center_y': .1}
            size_hint: None, None
            background_normal: 'button1flip.png'
            background_down: 'button1flipdark.png'
            on_press: 
                root.manager.transition.direction = 'right'
                root.manager.current = 'timerscreen'




        Button:
            text: "Save"
            color: 0,0,0,1
            font_size: '16sp'
            size: dp(100), dp(100)
            pos_hint: {'center_x': .15, 'center_y': .1}
            size_hint: None, None
            background_normal: 'button4.png'
            background_down: 'button4dark.png'
            on_press: root.SaveNotes()




<GraphScreen>:
    BoxLayout:    
        Button:
            text: 'goto main'
            on_press: 
                root.manager.transition.direction = 'left'
                root.manager.current = 'timerscreen'



   <TimerScreen>:

canvas.before:
    Rectangle:
        size: self.size
        source: 'background4.jpg'


label_wid: my_custom_label

BoxLayout:
    rows: 2

    orientation: 'vertical'


    Label:
        pos: dp(100), dp(100)
        font_size: '40sp'
        id: my_custom_label
        text: 'timer!'

    FloatLayout:
        Button:
            id: startbutton
            size: dp(250), dp(140)
            pos_hint: {'center_x': .5, 'center_y': .6}
            size_hint: None, None
            text: root.buttonstatus
            font_size: '17sp'
            color: 0,0,0,1
            background_normal: 'button4.png'
            background_down: 'button4dark.png'
            on_press: root.startUpdating()


        Button:
            id: resetbutton
            size: dp(150), dp(100)
            pos_hint: {'center_x':0.5, 'center_y': 0.0}
            size_hint: None,None
            text: "reset timer"
            font_size: '15sp'
            color: 0,0,0,1
            background_normal: 'button4.png'
            background_down: 'button4dark.png'
            on_press:
                root.resettimer()

    FloatLayout:
        cols: 2

        Button:
            size: dp(100), dp(100)
            size_hint: None,None
            pos_hint: {'center_x':0.8, 'center_y': 0.3}
            background_normal: 'button1.png'
            background_down: 'button1dark.png'
            on_press:
                root.manager.transition.direction = "left"
                root.manager.current = "schedulescreen"


        Button:
            size: dp(100), dp(100)
            size_hint: None,None
            pos_hint: {'center_x':0.2, 'center_y': 0.3}
            text: "Progress"
            on_press:
                root.manager.transition.direction = "right"
                root.manager.current = "graphscreen"

""")


sound = SoundLoader.load('ring.wav')



class ScheduleScreen(Screen):

def __init__(self, **kwargs):
    super(Screen,self).__init__(**kwargs)
    try:

        pickle_in1 = open("mon_notes.pickle", "rb")
        pickle_in2 = open("tue_notes.pickle", "rb")
        pickle_in3 = open("wed_notes.pickle", "rb")
        pickle_in4 = open("thu_notes.pickle", "rb")                 # open pickle note files
        pickle_in5 = open("fri_notes.pickle", "rb")
        pickle_in6 = open("sat_notes.pickle", "rb")
        pickle_in7 = open("sun_notes.pickle", "rb")


        self.ids.box1.text = pickle.load(pickle_in1)
        self.ids.box2.text = pickle.load(pickle_in2)
        self.ids.box3.text = pickle.load(pickle_in3)
        self.ids.box4.text = pickle.load(pickle_in4)                # load the text into the textboxes
        self.ids.box5.text = pickle.load(pickle_in5)    
        self.ids.box6.text = pickle.load(pickle_in6)
        self.ids.box7.text = pickle.load(pickle_in7)    

    except:
        self.ids.box1.text = "You can keep your notes here!"

def SaveNotes(self):

    mon_notes = self.ids.box1.text    
    tue_notes = self.ids.box2.text
    wed_notes = self.ids.box3.text
    thu_notes = self.ids.box4.text
    fri_notes = self.ids.box5.text              
    sat_notes = self.ids.box6.text
    sun_notes = self.ids.box7.text

    pickle_out1 = open("mon_notes.pickle", "wb")
    pickle.dump(mon_notes, pickle_out1)
    pickle_out1.close

    pickle_out2 = open("tue_notes.pickle", "wb")
    pickle.dump(tue_notes, pickle_out2)
    pickle_out2.close

    pickle_out3 = open("wed_notes.pickle", "wb")
    pickle.dump(wed_notes, pickle_out3)
    pickle_out3.close

    pickle_out4 = open("thu_notes.pickle", "wb")
    pickle.dump(thu_notes, pickle_out4)
    pickle_out4.close

    pickle_out5 = open("fri_notes.pickle", "wb")
    pickle.dump(fri_notes, pickle_out5)
    pickle_out5.close

    pickle_out6 = open("sat_notes.pickle", "wb")
    pickle.dump(sat_notes, pickle_out6)
    pickle_out6.close

    pickle_out7 = open("sun_notes.pickle", "wb")
    pickle.dump(sun_notes, pickle_out7)
    pickle_out7.close







class GraphScreen(Screen):
pass





class TimerScreen(Screen):  #FloatLayout):
global sound
sessionlength = 1500                      #  <==== 25 mins set timer
breaklength = 300                          #  <==== 5 mins set timer
buttonstatus = "Press to start"
started = False
paused = False
studyStatus = "study"
timecount = sessionlength                             
totaltime = 0

label_wid = ObjectProperty()

event1 = ObjectProperty()

def MyClock(self, timecount):

    self.label_wid.text = "Mins: " + str(self.timecount // 60) + " , secs: " + str(self.timecount % 60)
    self.timecount -= 1
    #self.totaltime += 1

    if self.timecount == -1:
        sound.play()
        if self.studyStatus == "study":   
            self.studyStatus = "break"                       # timecount is 1 sec ahead of text
            self.label_wid.text = "Break time!"
            self.timecount = self.breaklength
            Clock.unschedule(self.event1)
            self.buttonstatus = "start"
            self.ids.startbutton.text = self.buttonstatus
            self.started = False

        elif self.studyStatus == "break":
            self.studyStatus = "study"
            self.label_wid.text = "Back to studying"
            self.timecount = self.sessionlength
            Clock.unschedule(self.event1)
            self.buttonstatus = "start"
            self.ids.startbutton.text = self.buttonstatus
            self.started = False





def startUpdating(self):
    if not self.started:
        self.event1 = Clock.schedule_interval(self.MyClock, 1)
        self.buttonstatus = "pause"
        self.ids.startbutton.text = self.buttonstatus
        self.started = True
    else:
        Clock.unschedule(self.event1)
        self.started = False

        if self.timecount != 0:
            self.buttonstatus = "resume"

        self.ids.startbutton.text = self.buttonstatus


def resettimer(self):
    Clock.unschedule(self.event1)
    self.started = False
    if self.studyStatus == "study":
        self.timecount = self.sessionlength
    elif self.studyStatus == "break":
        self.timecount = self.breaklength

    self.label_wid.text = "Mins: " + str(self.timecount // 60) + " , secs: " + str(self.timecount % 60)
    self.buttonstatus = "start"
    self.ids.startbutton.text = self.buttonstatus




sm = ScreenManager()

sm.add_widget(ScheduleScreen(name = 'schedulescreen'))
sm.add_widget(GraphScreen(name = 'graphscreen'))
sm.add_widget(TimerScreen(name = 'timerscreen'))

sm.current = "timerscreen"




class TimerApp(App):

def build(self):
    return sm



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