暂停和继续秒表

2024-04-12

我正在尝试创建秒表。我已经做到了,但我想随时暂停并继续时间。我尝试过一些事情,但我不知道该怎么做。有谁能解释一下我该怎么做吗?

import time, tkinter

canvas=tkinter.Canvas(width=1900,height=1000,bg='white')
canvas.pack()
canvas.create_text(950,300,text=':',font='Arial 600')
def write(x_rec,y_rec,x_text,rep):
    canvas.create_rectangle(x_rec,0,y_rec,750,outline='white',fill='white')
    if rep<10:
        canvas.create_text(x_text,400,text='0'+str(rep),font='Arial 600')
    else:
        canvas.create_text(x_text,400,text=str(rep),font='Arial 600')
def write_minutes(rep):
    write(0,900,450,rep)
def write_seconds(rep):
    write(1000,1900,1450,rep)
def time(num,remember):
    while remember[0]<num:
        remember[1]+=1
        write_seconds(remember[1])
        if remember[1]==60:
            remember[0]+=1
            remember[1]=0
            write_seconds(remember[1])
            write_minutes(remember[0])
        canvas.update()
        canvas.after(1000)



remember=[0,0]
num=1
write_seconds(remember[1])
write_minutes(remember[0])

time(5,remember)

我无法找到一种干净的方法来修改代码来执行您想要的操作,因此决定将秒表实现为一个类,以使程序更加面向对象并避免使用一堆全局变量。

I haven't tested this thoroughly, but there's enough of it working to give you the idea. Note also that I changed a Resume button into one that toggles itself between that and being Pause button. This approach made adding a third one unnecessary.

Update

我注意到可能存在潜在问题,因为越来越多的对象不断添加到Canvas当显示更新时。对于短期运行来说这不应该是问题StopWatch实例,但可能会导致长期运行的问题。

为了避免这种情况,我修改了代码来更新现有的对应Canvas文本对象(如果有)。我也搬了Buttons 到顶部,在StopWatch.

from functools import partial
import time
import tkinter as tk

PAUSE, RESUME = 0, 1  # Button states.


# Button callback functions.
def _toggle(callback):
    toggle_btn.state = 1 - toggle_btn.state  # Toggle button state value.
    toggle_btn.config(**toggle_btn_states[toggle_btn.state])
    callback()

def _stop():
    stopwatch.cancel_updates()
    toggle_btn.config(state=tk.DISABLED)
    stop_btn.config(state=tk.DISABLED)


class StopWatch:
    def __init__(self, parent, run_time, width, height):
        self.run_time = run_time
        self.width, self.height = width, height
        self.font = 'Arial 600'

        self.canvas = tk.Canvas(parent, width=width, height=height, bg='white')
        self.canvas.pack()
        self.canvas.create_text(950, 300, text=':', font=self.font)
        self.running, self.paused = False, False
        self.after_id = None

    def start(self):
        self.elapsed_time = 0  # In seconds.
        self._display_time()
        self.after_id = self.canvas.after(1000, self._update)
        self.running, self.paused = True, False

    def _update(self):
        if self.running and not self.paused:
            if self.elapsed_time == self.run_time:
                _stop()  # Sets self.running to False.
                self.canvas.bell()  # Beep.
            else:
                self.elapsed_time += 1
                self._display_time()

        if self.running:  # Keep update process going.
            self.after_id = self.canvas.after(1000, self._update)

    def _display_time(self):
        mins, secs = divmod(self.elapsed_time, 60)
        self._write_seconds(secs)
        self._write_minutes(mins)

    def _write_minutes(self, mins):
        self._write(0, 900, 450, 'mins', mins)

    def _write_seconds(self, secs):
        self._write(1000, 1900, 1450, 'secs', secs)

    def _write(self, x_rec, y_rec, x_text, tag, value):
        text = '%02d' % value
        # Update canvas text widget if it has non-empty text.
        if self.canvas.itemcget(tag, 'text'):
            self.canvas.itemconfigure(tag, text=text)
        else:   # Otherwise create it.
            self.canvas.create_text(x_text, 400, text=text, tag=tag, font=self.font)

    def pause_updates(self):
        if self.running:
            self.paused = True

    def resume_updates(self):
        if self.paused:
            self.paused = False

    def cancel_updates(self):
        self.running, self.paused = False, False
        if self.after_id:
            self.canvas.after_cancel(self.after_id)
            self.after_id = None

# main
root = tk.Tk()

# Create a Frame for Buttons (allows row of them to be centered).
button_frame = tk.Frame(root)
button_frame.pack(side=tk.TOP)

# Create StopWatch and configure buttons to use it.
stopwatch = StopWatch(root, 5, 1900, 1000)
toggle_btn = tk.Button(button_frame)
toggle_btn_states = {}

# Dictionary mapping state to button configuration.
toggle_btn_states.update({
    PAUSE: dict(
        text='Pause', bg='red', fg='white',
        command=partial(_toggle, stopwatch.pause_updates)),
    RESUME: dict(
        text='Resume', bg='green', fg='white',
        command=partial(_toggle, stopwatch.resume_updates))
})

toggle_btn.state = PAUSE
toggle_btn.config(**toggle_btn_states[toggle_btn.state])
toggle_btn.pack(side=tk.LEFT, padx=2)

stop_btn = tk.Button(button_frame, text='Stop', bg='blue', fg='white', command=_stop)
stop_btn.pack(side=tk.LEFT, padx=2)

stopwatch.start()
root.mainloop()

这是显示秒表运行的屏幕截图:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

暂停和继续秒表 的相关文章

  • Pandas:参差不齐的时间序列的时间加权滚动平均值

    我有一个参差不齐 意思是不规则的频率 时间索引的 DataFrame 我想对其执行时间加权滚动平均值 以维护 DataFrame 的原始索引 假设记录的值在被另一个值取代之前一直有效 实现此目的的一种方法是将参差不齐的 DataFrame
  • 赋值运算符左/右侧的不同切片行为

    作为一个来自 C 背景的 Python 新手 Python 3 4 x 中的切片运算符对我来说看起来很荒谬 我只是不明白 特殊规则 背后的设计理念 让我解释一下为什么我说它 特别 一方面 根据 Stack Overflow 的回答here
  • 导入错误:没有名为请求的模块

    我尝试导入requests https requests readthedocs io import requests 但我收到一个错误 导入错误 没有名为请求的模块 Requests 不是内置模块 默认的 python 安装不附带 因此您
  • 如何在 Heroku 中安装 NLTK 模块

    嘿 我想在我的 Heroku 服务器上安装 NLTK pos tag 我该怎么办呢 请给我一些步骤 因为我是 Heroku 服务器系统的新手 我刚刚添加了官方nltk支持构建包 只需添加一个nltk txt文件包含要安装的语料库列表 一切都
  • 在类中设置默认值

    我正在用 Python 创建一个类 但我不确定如何正确设置默认值 我的目标是为所有类实例设置默认值 也可以通过类方法对其进行修改 但是 我希望在调用方法后恢复初始默认值 我已经能够使用下面所示的代码使其工作 它不是很 漂亮 所以我怀疑这是解
  • 让 argparse 收集但不响应标志

    我有一个脚本 它接受一些参数 使用其中一些参数来选择要运行的脚本 并将其余参数传递给该脚本 所以它看起来像这样 parser ArgumentParser parser add argument script choices a b par
  • 给定一个正整数 n,如何打印高度为 n-1 的数字三角形?

    HackerRank 三角任务 https www hackerrank com challenges python quest 1 problem 仅使用算术运算 单个for loop 和一个单一的print陈述 不允许进行字符串操作 约
  • 匹配字典集。最优雅的解决方案。 Python

    给定两个字典列表 新的和旧的 字典在两个列表中表示相同的对象 我需要找到差异并生成新的字典列表 其中仅包含新字典中的对象和旧字典中的更新属性 例子 list new id 1 name bob desc cool guy id 2 name
  • 在 NLTK Python 的朴素贝叶斯分类器中使用文档长度

    我正在使用 Python 中的 NLTK 构建垃圾邮件过滤器 现在 我检查单词的出现情况并使用 NaiveBayesClassifier 其准确度为 0 98 垃圾邮件的 F 测量值为 0 92 非垃圾邮件的 F 测量值为 0 98 然而
  • 在循环中动态添加方法时的范围问题

    我有一个 API 用于分析我的锻炼数据 我抓取的数据 跑卫 http runkeeper com 的网站 我的主类是一个子类pandas DataFrame 它基本上是表格数据的容器 它支持按列名索引 返回列值的数组 我想根据数据中存在的
  • 替换 Python 列表/字典中的值?

    好的 我正在尝试过滤传递给我的列表 字典并稍微 清理 它 因为其中有某些值我需要删除 所以 如果它看起来像这样 records key1 AAA key2 BBB key3 CCC key4 AAA 我如何快速轻松地运行所有内容并将 AAA
  • django 创建多类型用户的最佳方法

    我想在 django 中创建多个用户 我想知道哪种方法是最好的 class Teachers models Model user models ForeignKey User is teacher models BooleanField d
  • 如何在lxml,Python中将<转换为<?

    有一个xml文件
  • 在Python中将字符串转换为变量? [复制]

    这个问题在这里已经有答案了 我对 python 和编程都很陌生 并且已经尝试弄清楚如何做到这一点有一段时间了 这是我需要帮助的内容 y 0 x 2 p01 hello p02 bye print p str y str x 输出当然是 p0
  • 将所有构造函数参数作为实例属性添加到 PyCharm 中的类中

    我正在使用 PyCharm 我开始定义一个类 class A def init self a b c 我希望它看起来像这样 class A def init self a b c self a a self b b self c c 使用
  • 熊猫:SettingWithCopyWarning:[重复]

    这个问题在这里已经有答案了 我尝试使用以下代码将列转换为 日期 df DATE pd to datetime df DATE or df DATE pd to datetime df DATE 但我收到以下错误 Users xyz anac
  • Django - 以表单形式访问 request.session

    我按如下方式调用表单 然后将其传递给模板 f UserProfileConfig request 我需要能够访问表单中的 request session 所以首先我尝试了这个 class UserProfileConfig forms Fo
  • AttributeError:模块“matplotlib”没有属性“font_manager”

    我安装了 matplotlib 但 python 3 8 10 显示了这个错误 AttributeError module matplotlib has no attribute font manager What i am doing w
  • 无法让我的脚本自动生成一些值以在有效负载中使用

    我创建了一个脚本 通过随后发送两个 https 请求来从目标页面获取 html 元素 我的脚本可以完美地完成这件事 但是 我必须从 chrome 开发工具复制四个值来填充其中的四个键payload为了发送最终的http请求到达目标页面 这是
  • 在 Jupyter Notebook 上使用 virtualenv

    我尝试使用virtualenv在 jupyter 笔记本上 使用环境中安装的所有软件包 但在 jupyter 内部它们无法识别 已经尝试过 pip install tornado 4 5 3 pip install ipykernel 4

随机推荐

  • 在 DOM 中多次使用 React.render() 可以吗?

    我想使用 React 在整个 DOM 中多次添加组件 这把小提琴 http jsfiddle net ypcrumble gs7k1kth 1 显示了我想要做什么 并且它不会引发任何错误 这是代码 HTML div div div div
  • ASP.NET Core 中的自定义授权属性

    我正在研究 asp net core 但我不明白一些事情 例如 在 mvc net 5 中 我们可以使用 AuthorizeAttribute 创建类来过滤和授权操作 并将属性设置为操作 如下所示 public class AdminAut
  • 从对象数组中删除原始对象和重复对象 - JS

    我有一系列对象 const arr title sky artist Jon id 1 title rain artist Paul id 2 title sky artist Jon id 1 我想根据 id 从数组中删除所有重复项 最终
  • JpaRepository 缓存新创建的对象。怎么刷新呢?

    我有一个 JpaRepository 在 Spring MVC 应用程序中保存新创建的实体 这个实体看起来像这样 非常简单 Entity public class Translation Id GeneratedValue strategy
  • 将日期字符串解析为某个 Java 对象

    我正在从事一个读取文件和处理数据的项目 例如 我必须处理日期 2012 01 10 23 13 26 2012 年 1 月 13 日 我找到了 Joda 包 有点有趣 但不知道它是否是最简单的 我能够将第一个示例解析为 DateTime 对
  • 如何仅在 DateTime 对象中删除 C# 中日期的时间部分?

    我需要删除日期时间的时间部分 或者可能有以下格式的日期object形式不以string 06 26 2009 00 00 00 000 我无法使用任何string转换方法 因为我需要日期object form 我尝试首先转换DateTime
  • 如何使用 Vuejs 加载 url

    我正在建立一个包含几篇文章的网站 我正在使用 Vue Router 目前我的文章的 url 看起来像 article id 例如 http localhost 8080 article 85 如何在 URL 中添加文章标题 以便它可以htt
  • 如何在 Bitbucket wiki 上的 Markdown 中转义“@”

    谁知道如何逃脱 BitBucket wiki 上 markdown 中的字符 就我而言 后面紧跟着恰好是某人的用户名的单词 即 blahblah 到目前为止我尝试过的 64 但这些都不起作用 屏蔽被忽略 当我使用字符代码时 它只是按原样输出
  • DatePickerDialog 首先显示年份选择器

    我希望我的 DatePickerDialog 一打开就显示年份列表 For example when I show the dialog I see the calendar view If I tap on the text 1900 t
  • 在 div 类中使用 javascript 搜索文本 [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我想制作一个脚本 在其中我可以使用 document getElementByClassName 自动搜索某个字符串 没有文本框或任何内容
  • C++/CLR 托管单元测试存在链接器错误

    当将任何托管类包含到我的托管单元测试中时 编译会输出以下错误 1 gt UnitTest obj error LNK2020 unresolved token 0A000360 extern C int cdecl CrtDbgReport
  • GCC 的“vstring”是什么?

    我读了一些 GCC 错误报告 那里的人在谈论 vstring 搜索网络我注意到http gcc gnu org onlinedocs libstdc libstdc html USERS 4 2 vstring 8h html http g
  • sql server 2008 Management Studio 不检查我的查询的语法

    一如既往 我的惊讶将会有一个合理的解释 但在那之前 我有这个查询 delete from Photo where hs id in select hs id from HotelSupplier where id 142 执行得很好 后来我
  • Rails pub/sub 与 faye

    在 Rails 应用程序中 我使用 Faye 机架适配器 来推送通知 用于聊天 我想将 Faye 用于另一个用例 更多推送通知 但我似乎无法弄清楚 在我的应用程序中 可以从后台作业创建模型 因此我想在创建模型时刷新我的视图之一 例如索引操作
  • Python3:将PDF下载到内存并将第一页转换为图像

    我尝试执行以下操作 将 PDF 文件下载到内存 将第一页转换为图像 将该图像与 tweepy 一起使用 我尝试了以下代码 但遇到了错误 from PIL import Image from pdf2image import convert
  • 获取 JScrollPane 中显示的组件

    我有一个包含 JPanel 的 JScrollPane 我用许多按钮填充了这个 JPanel 是否有可能获取当前显示的按钮 我知道我可以通过以下方式访问 JPanel 的子项jpanel getComponents 但这些都是此窗格中的所有
  • NestJs - 使用具有 2 个主体类选项的类验证器验证请求主体

    我有一个休息电话 它可能会收到类型为 classA 和 classB 的主体 我需要将其保留为两个不同的类 例子 classes class ClassA IsString Length 1 128 public readonly name
  • “Skipcond”在 MARIE 汇编语言中如何工作?

    我正在尝试理解 MARIE 汇编语言 我不太明白skipcond为了 做类似的事情 lt or gt 或乘法或除法 我正在采用这个简单的程序 x 1 while x lt 10 do x x 1 endwhile 我不明白的是如何使用某些跳
  • 以 JSON/XML 格式呈现非活动记录对象 [RoR]

    我正在使用 ruby gem whois 测试一个小型 whois API 由于 whois 响应的格式非常有趣 有时我被要求不要使用 ActiveRecord 来保存响应 简而言之 它的工作原理如下 用户从视图中以表单形式输入域名 操作
  • 暂停和继续秒表

    我正在尝试创建秒表 我已经做到了 但我想随时暂停并继续时间 我尝试过一些事情 但我不知道该怎么做 有谁能解释一下我该怎么做吗 import time tkinter canvas tkinter Canvas width 1900 heig