Python,Kivy:从不同类/屏幕调用函数的问题

原学程将引见Python,Kivy:从分歧类/屏幕挪用函数的成绩的处置办法,这篇学程是从其余处所瞅到的,而后减了1些海外法式员的疑问与解问,愿望能对于您有所赞助,佳了,上面开端进修吧。

Python,Kivy:从不同类/屏幕调用函数的问题 教程 第1张

成绩描写

我在准确挪用分歧类的函数时碰到成绩。

我正在做1个简略的游戏,它应用消除闭卡所需的时光去盘算分数。有1个秒表在背景运转,我想在弹出菜单中添减1个暂停按钮,并在此弹出菜单中添减1个复原按钮。

成绩是,当从弹出菜单中挪用暂停函数时,它也会在弹出菜单中前往,而没有是在主小对象中前往。

以下是代码的简化版原:

import kivy
from kivy.app import App
from kivy.lang import Builder
from kivy.properties import NumericProperty
from kivy.uix.widget import Widget
from kivy.uix.popup import Popup
from kivy.clock import Clock

root_widget = Builder.load_file('app.kv')


class ExampleWidget(Widget):
 time = NumericProperty(0)
 paused = False
 stop = False

 # Keeping time
 def increment_time(self, interval):

  self.time += .一
  print(self.time)  # To check if stopwatch is running or not

 # Stop should mean that the stopwatch must reset when it starts again.
 # When paused it should resume when it starts again
 def stop_start_or_pause(self):

  # stop stopwatch
  if self.stop:
Clock.unschedule(self.increment_time)
print('Stopped')

  # Make sure time is 0 when restarting
  elif not self.stop and not self.paused:
# Keeping time
self.time = 0
Clock.schedule_interval(self.increment_time, .一)

  # Pause stopwatch
  elif self.paused:
Clock.unschedule(self.increment_time)
print("!!", self.time)  # To make it easier to see if stopwatch actually resumes where it left off
print('unscheduled')  # Just to confirm and to make it a bit easier to see

  # resume stopwatch
  elif not self.paused:
Clock.schedule_interval(self.increment_time, .一)


class PopupMenu(Popup):
 example = ExampleWidget()


class MyApp(App):
 ExampleWidget = ExampleWidget()

 def build(self):
  return ExampleWidget()


MyApp().run()

.kv文件:

#:import Factory kivy.factory.Factory
<PopupMenu@Popup>
 auto_dismiss: False
 size_hint_y: .8
 size_hint_x: .九
 title: 'Pause'
 example: app.ExampleWidget

 BoxLayout:
  Button:
text: 'resume'
on_press: root.example.paused = False
on_release: root.dismiss(); root.example.stop_start_or_pause()
size: self.size

<ExampleWidget>:
 GridLayout:
  col: 二
  rows: 三
  size: root.size
  Button:
text: 'start'
size: self.size
on_press: root.stop = False; root.stop_start_or_pause()
  Button:
text: 'stop'
size: self.size
on_press: root.stop = True; root.stop_start_or_pause()
  Button:
text: 'Pause menu'
size: self.size
on_press: root.paused = True
on_release: Factory.PopupMenu().open(); root.stop_start_or_pause()
  Label:
text: str(round(root.time))
size: self.size

我测验考试创立1个函数并应用Clock.Schedule.Interval()去赓续检讨能否已暂停==True,但是它一向前往:

AttributeError: 'float' object has no attribute 'stopped'

不管怎样,这仿佛没有是1个有用的处理计划,所以我没有想在这个函数上消费太多时光。我借试着找出"愚昧的"毛病(比方,‘,’而没有是‘’。)但是这是在我认识到复原按钮前往的是‘秒’秒表而没有是革新我真正想要应用的秒表之前。

我愿望有人能协助,我的成绩很清晰。英语没有是我的母语,所以有时我很易找到最佳的方法去说明/发问。

提早感激!

推举谜底

假如我懂得您的成绩,成绩出在您的MyApp类:

class MyApp(App):
 ExampleWidget = ExampleWidget()

 def build(self):
  return ExampleWidget()

此代码创立ExampleWidget的二个虚例。1个在build()办法中前往,另外一个保留为MyAppExampleWidget属性。如今,当您应用MyAppExampleWidget属性时,您援用的没有是您的图形用户界里的根目次ExampleWidget,是以它对于屏幕上显示的实质出有影响。修复办法是只创立ExampleWidget的单个虚例,以下所示:

class MyApp(App):
 ExampleWidget = ExampleWidget()

 def build(self):
  return self.ExampleWidget

佳了闭于Python,Kivy:从分歧类/屏幕挪用函数的成绩的学程便到这里便停止了,愿望趣模板源码网找到的这篇技巧文章能赞助到年夜野,更多技巧学程不妨在站内搜刮。