В настоящее время я работаю над своим первым приложением, использующим 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()