gpt4 book ai didi

python-3.x - Kivy 的新手尝试制作秒表

转载 作者:行者123 更新时间:2023-12-04 16:07:40 27 4
gpt4 key购买 nike

我正在尝试在 Kivy 中创建一个秒表。我已经在 Sublime Text 3 上完成了一个骨架(如下面的代码所示)。当我在 Sublime Text 上运行代码时,一个窗口打开,但 Python 在 4.1 秒内崩溃。

这里是有问题的代码:

import kivy

from kivy.app import App

from kivy.uix.gridlayout import GridLayout
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label
from kivy.clock import Clock
from kivy.properties import NumericProperty

from kivy.lang import Builder

import time

class CrudeTimerGrid(GridLayout):
# Initialise timer with input start time
def __init__(self,start_time):
time = NumericProperty(start_time)

def tick(self):
if self.time > 0:
self.time -= 1
else:
pass

def start(self):
Clock.schedule_interval(self.tick,1)

def pause(self):
Clock.unschedule()

# incomplete code
def reset(self):
pass


class CrudeTimerApp(App):
def build(self):
# Testing timer by initialising timer with 20 seconds
return CrudeTimerGrid(20)

Builder.load_string('''
<CrudeTimerGrid>
id: timer
rows: 2
# insert formatting here

BoxLayout:
Label:
text: timer.time

BoxLayout:

Button:
text: "Start"
on_press: timer.start()

Button:
text: "Pause"
on_press: timer.pause()

Button:
text: "Reset"
on_press: timer.reset()
''')

CrudeTimerApp().run()

也是 StackOverflow 的新手,所以如果需要任何其他信息,请告诉我。感谢您的帮助!

最佳答案

主要问题在这里:

def __init__(self,start_time):
time = NumericProperty(start_time)

您应该在类级别定义 Kivy 属性,请阅读 this .如果您这样更改代码,代码将停止崩溃:

class CrudeTimerGrid(GridLayout):
time = NumericProperty(0)

您还应该做一些其他更改才能使其最终正常工作,这是完整的代码版本:

import kivy

from kivy.app import App

from kivy.uix.gridlayout import GridLayout
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label
from kivy.clock import Clock
from kivy.properties import NumericProperty

from kivy.lang import Builder

import time

class CrudeTimerGrid(GridLayout):
time = NumericProperty(0)

def tick(self, *_):
if self.time > 0:
self.time -= 1
else:
pass

def start(self, *_):
self.cb = Clock.schedule_interval(self.tick,1)

def pause(self):
Clock.unschedule(self.cb)

# incomplete code
def reset(self, *_):
pass


class CrudeTimerApp(App):
def build(self):
# Testing timer by initialising timer with 20 seconds
return CrudeTimerGrid(time=20)

Builder.load_string('''
<CrudeTimerGrid>
id: timer
rows: 2
# insert formatting here

BoxLayout:
Label:
text: str(timer.time)

BoxLayout:

Button:
text: "Start"
on_press: timer.start()

Button:
text: "Pause"
on_press: timer.pause()

Button:
text: "Reset"
on_press: timer.reset()
''')

CrudeTimerApp().run()

更新:

Any idea why 2 arguments are input into tick in the first place?

tick 传递给 Clock.schedule_interval 被调用。这个函数使用额外的参数来安排它的回调(就像 Kivy 中的许多其他函数一样)。您可以在 documentation 中阅读更多相关信息.

You defined self.cb in order to reference it in Clock.unschedule, correct?

您可以多次调用 Clock.schedule_interval 以不同的时间间隔安排许多不同的功能。但是 Clock.unschedule 怎么知道要取消调度它们中的哪一个呢?为了使 Clock.unschedule 知道要取消安排什么,您应该将 Clock.schedule_interval 返回的值传递给它。这是 documentation section哪里描述了这个机制。

关于python-3.x - Kivy 的新手尝试制作秒表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48060052/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com