暂停和继续秒表

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(使用前将#替换为@)

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

随机推荐

  • 在 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