在 canvas tkinter 中创建数字时间

creating digital time in canvas tkinter

我是 Python 使用 tkinter 的新手,我有一个我无法解决的问题。Digital time 我想把数字时间放在我的应用程序的右上角(请看图片)。我试图在网上搜索如何创建数字时间,但它是在全局根和框架配置上,我找不到为 canvas 制作的数字时钟。我还想使用网格将我的按钮放在中间,但我找不到解决方案。谁能帮帮我吗?我会在这里粘贴我的代码。

from tkinter import *
from tkinter import ttk
from datetime import date
import time
import sys


class main_menu(object):
    def __init__(self, root):
        self.root = root
        self.root.title('System')
        self.root.geometry('780x488')

        self.background = PhotoImage(file='images/bg.png')
        self.canvas = Canvas (root)
        self.canvas.grid(sticky=N+S+W+E)
        self.canvas.create_image(0,0, image=self.background, anchor="nw")

        self.scan_photo = PhotoImage (file='images/scan.png')
        self.logs_photo = PhotoImage (file='images/logs.png')
        self.settings_photo = PhotoImage (file='images/settings.png')

        self.scan_btn = Button (self.canvas, image=self.scan_photo, borderwidth=0, command=self.StartScan)
        self.scan_win = self.canvas.create_window(225, 100, anchor="nw", window=self.scan_btn)
        self.logs_btn = Button (self.canvas, image=self.logs_photo, borderwidth=0, command=self.Logs)
        self.logs_win = self.canvas.create_window(225, 200, anchor="nw", window=self.logs_btn)
        self.settings_btn = Button (self.canvas, image=self.settings_photo, borderwidth=0, command=self.Settings)
        self.settings_win = self.canvas.create_window(225, 300, anchor="nw", window=self.settings_btn)

        self.today = date.today()
        self.format = self.today.strftime("%b. %d, %Y")
        self.canvas.create_text(730, 30, text=self.format, font=("Helvetica", 10))

        self.InstructionsLabel = Label(root, text="""
            

            tadahhhhhh""", fg="black", font=("Calibri", 14))

        self.Return_photo = PhotoImage (file='images/back_24x24.png')
        self.ReturnMenu_btn = Button (self.canvas, image=self.Return_photo, background='white',activebackground='white', borderwidth=0, command=self.MainMenu)
        self.ReturnMenu_win = self.canvas.create_window(0, 0, anchor="nw", window=self.ReturnMenu_btn)
        ###self.ReturnMenu = Button(root, image=self.back_photo, command=self.MainMenu, )
        self.MainMenu()

    def MainMenu(self):
        self.RemoveAll()
        self.ReturnMenu_btn.grid_remove()
        self.scan_btn.grid(padx=215)
        self.logs_btn.grid(padx=215)
        self.settings_btn.grid(padx=215)

    def StartScan(self):
        self.RemoveAll()

    def Logs(self):
        self.RemoveAll()
        self.ReturnMenu.grid()

    def Settings(self):
        self.RemoveAll()
        self.ReturnMenu.grid()

    def RemoveAll(self):
        self.scan_btn.grid_remove()
        self.logs_btn.grid_remove()
        self.settings_btn.grid_remove()
        self.InstructionsLabel.grid_remove()
        self.ReturnMenu_btn.grid_remove()


if __name__ == '__main__':

    root = Tk()
    root.columnconfigure(0, weight=1)
    root.rowconfigure(0, weight=1)
    main_menu = main_menu(root)
    root.mainloop()

要将时间放在右上角,您需要知道 canvas 的宽度。因此,使用 canvas.winfo_width() 获取 canvas 的宽度并减去一些数字以将其放置在所需位置。

如果即使 window 已调整大小,您也希望时间保留在右上角,然后将 Configure 绑定到一个函数并使用 .coords.moveto 移动文本。

示例代码(此代码将确保时间始终位于右上角)。

from tkinter import font
class MainMenu:
    def __init__(self, root):        
        ...
        self.time = self.canvas.create_text(0, 0, text=self.format, font=("Helvetica", 10))
        self.canvas.bind('<Configure>', self.adjustTimePosition)
        ...
    def adjustTimePosition(self, event):

        family, size = self.canvas.itemcget(self.time, 'font').split()  # get the font-family and font size
        text = self.canvas.itemcget(self.time, 'text')
        
        txt_font = font.Font(family=family, size=size)
        width, height = txt_font.measure(text), txt_font.metrics("ascent")  # measures the width and height of the text
        self.canvas.coords(self.time, self.canvas.winfo_width()-width, height)  # moves the text