带有strftime的python Tkinter中的七段数字时钟与系统时间

Posted

技术标签:

【中文标题】带有strftime的python Tkinter中的七段数字时钟与系统时间【英文标题】:Seven segment digits clock with the system time in python Tkinter with strftime 【发布时间】:2019-04-17 16:03:57 【问题描述】:

我需要一个带有time.strftime 的七段时钟。我有这个时钟:

import sys
from tkinter import *
import time

def tick():
    time_string = time.strftime("%M:%S")
    clock.config(text=time_string)
    clock.after(200, tick)

root = Tk()
clock = Label(root, font = ("times", 250, "bold"), bg="white")
clock.grid(row=0, column=1)
tick()
root.mainloop()

这是数字:

offsets = (
    (0, 0, 1, 0),  # top
    (1, 0, 1, 1),  # upper right
    (1, 1, 1, 2),  # lower right
    (0, 2, 1, 2),  # bottom
    (0, 1, 0, 2),  # lower left
    (0, 0, 0, 1),  # upper left
    (0, 1, 1, 1),  # middle
)

digits = (
    (1, 1, 1, 1, 1, 1, 0),  # 0
    (0, 1, 1, 0, 0, 0, 0),  # 1
    (1, 1, 0, 1, 1, 0, 1),  # 2
    (1, 1, 1, 1, 0, 0, 1),  # 3
    (0, 1, 1, 0, 0, 1, 1),  # 4
    (1, 0, 1, 1, 0, 1, 1),  # 5
    (1, 0, 1, 1, 1, 1, 1),  # 6
    (1, 1, 1, 0, 0, 0, 0),  # 7
    (1, 1, 1, 1, 1, 1, 1),  # 8
    (1, 1, 1, 1, 0, 1, 1),  # 9
    (1, 1, 1, 0, 1, 1, 1),  # 10=A
    (0, 0, 1, 1, 1, 1, 1),  # 11=b
    (1, 0, 0, 1, 1, 1, 0),  # 12=C
    (0, 1, 1, 1, 1, 0, 1),  # 13=d
    (1, 0, 0, 1, 1, 1, 1),  # 14=E
    (1, 0, 0, 0, 1, 1, 1),  # 15=F
)


class Digit:
    def __init__(self, canvas, *, x=10, y=10, length=20, width=3):
        self.canvas = canvas
        l = length
        self.segs = []
        for x0, y0, x1, y1 in offsets:
            self.segs.append(canvas.create_line(
                x + x0*l, y + y0*l, x + x1*l, y + y1*l,
                width=width, state = 'hidden'))
    def show(self, num):
        for iid, on in zip(self.segs, digits[num]):
            self.canvas.itemconfigure(iid, state = 'normal' if on else 'hidden')

但是,我不知道如何组合它们。

我们将不胜感激对实际代码的任何改进,如果您发现应该删除或替换某些内容,请随时进行更改。我不需要使用这个确切的实现,但这就是我所拥有的。如果库中有什么功能可以让工作变得更容易,请告诉我。

【问题讨论】:

为什么不能在 tkinter 中使用常规时间跨度?你想用 arduino 做点什么吗? Seven segment display in Tkinter的可能重复 我需要七段代码,因为我有另一个 opencv 脚本来测试摄像机是否识别数字时钟。不过,我在下面的答案中得到了解决方案。 【参考方案1】:

好的,我尝试根据您提供的代码将 strftime 转换为 7 段时钟。

我的目标是为格式化的 timestrafe 字符串的每个数字生成一个画布列表。然后在时钟的每一圈只需使用Digit 类来更新每个画布项目。

如果您有任何问题,请告诉我。

import tkinter as tk
import time
# Order 7 segments clockwise from top left, with crossbar last.
# Coordinates of each segment are (x0, y0, x1, y1) 
# given as offsets from top left measured in segment lengths.
offsets = (
    (0, 0, 1, 0),  # top
    (1, 0, 1, 1),  # upper right
    (1, 1, 1, 2),  # lower right
    (0, 2, 1, 2),  # bottom
    (0, 1, 0, 2),  # lower left
    (0, 0, 0, 1),  # upper left
    (0, 1, 1, 1),  # middle
    )
# Segments used for each digit; 0, 1 = off, on.
digits = (
    (1, 1, 1, 1, 1, 1, 0),  # 0
    (0, 1, 1, 0, 0, 0, 0),  # 1
    (1, 1, 0, 1, 1, 0, 1),  # 2
    (1, 1, 1, 1, 0, 0, 1),  # 3
    (0, 1, 1, 0, 0, 1, 1),  # 4
    (1, 0, 1, 1, 0, 1, 1),  # 5
    (1, 0, 1, 1, 1, 1, 1),  # 6
    (1, 1, 1, 0, 0, 0, 0),  # 7
    (1, 1, 1, 1, 1, 1, 1),  # 8
    (1, 1, 1, 1, 0, 1, 1),  # 9
    (1, 1, 1, 0, 1, 1, 1),  # 10=A
    (0, 0, 1, 1, 1, 1, 1),  # 11=b
    (1, 0, 0, 1, 1, 1, 0),  # 12=C
    (0, 1, 1, 1, 1, 0, 1),  # 13=d
    (1, 0, 0, 1, 1, 1, 1),  # 14=E
    (1, 0, 0, 0, 1, 1, 1),  # 15=F
)

class Digit:
    def __init__(self, canvas, *, x=10, y=10, l=20, wt=3):
        self.canvas = canvas
        canvas.delete("all")
        self.segs = []
        for x0, y0, x1, y1 in offsets:
            self.segs.append(canvas.create_line(x + x0*l, y + y0*l, x + x1*l, y + y1*l, width=wt, state='hidden'))

    def show(self, num):
        for iid, on in zip(self.segs, digits[num]):
            self.canvas.itemconfigure(iid, state='normal' if on else 'hidden')

def tick():
    global canvas_list
    for ndex, num in enumerate(time.strftime("%M:%S").replace(':', '')):
        Digit(canvas_list[ndex]).show(int(num))
    root.after(1000, tick)

root = tk.Tk()
clock_frame = tk.Frame(root)
clock_frame.grid(row=1, column=0)

canvas_list = []

time_col = 0
canvas_count = 0

for i in range(5):
    if i == 2:
        tk.Label(clock_frame, text=":", font = ("times", 40, "bold")).grid(row=0, column=time_col)
        time_col += 1
    else:
        canvas_list.append(tk.Canvas(clock_frame, width=30, height=50))
        canvas_list[canvas_count].grid(row=0, column=time_col)
        canvas_count += 1
        time_col += 1

tick()
root.mainloop()

请记住,OP 的代码只是查看 min/sec,所以这个时钟会反映这一点。

结果:

【讨论】:

非常感谢。效果很好,这正是我真正需要的

以上是关于带有strftime的python Tkinter中的七段数字时钟与系统时间的主要内容,如果未能解决你的问题,请参考以下文章

Python tkinter时钟的主题和夜主题

带有 cx_freeze 的 python 3.2 tkinter 图标

让 tkinter 在带有 asdf 的 macos 上使用 python 3.x

带有 MySQLdb 的 Python Tkinter 列表框

带有 Tkinter 和多个文件的 Python GUI

python 3.5 上带有 tkinter 应用程序的 Pyinstaller 问题