微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在画布 tkinter 中创建数字时间

如何解决在画布 tkinter 中创建数字时间

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

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,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,command=self.Logs)
        self.logs_win = self.canvas.create_window(225,200,window=self.logs_btn)
        self.settings_btn = Button (self.canvas,image=self.settings_photo,command=self.Settings)
        self.settings_win = self.canvas.create_window(225,300,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',command=self.MainMenu)
        self.ReturnMenu_win = self.canvas.create_window(0,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.winfo_width() 获取画布的宽度并减去一些数字以将其放置在所需位置。

如果您希望时间在调整窗口大小后仍停留在右上角,则将 Configure 绑定到一个函数并使用 .coords.moveto 移动文本。

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

from tkinter import font
class MainMenu:
    def __init__(self,root):        
        ...
        self.time = self.canvas.create_text(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 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。