我try 使用TKinter来创建一个简单的应用程序,这通常是我喜欢的工作方式.然而,在使用透明形式时,存在一些美学问题.我在黑底悬停时使用的字体是白色像素边框.

有没有可能以某种方式摆脱这种"神器"?随着ClearType的使用,"构件"变少了,但它们仍然存在,这使得应用程序看起来很难看.

以下是我相当简单的代码:

from tkinter import *
import tkinter.font
import sys
import pyglet
from datetime import datetime, timedelta
import re

bgc = "#ffffff"
fgc = "#e34646"
pyglet.font.add_file("digital_7mono.ttf")

def timer(start_time):
    now_time = datetime.now()
    delta = now_time-start_time
    delta = '{:02d}'.format(delta.days//3600) + ":" \
            + '{:02d}'.format(delta.seconds//60) + ":" \
            + '{:02d}'.format(delta.seconds)
    #delta = delta.strftime("%H:%M:%S")
    return [delta, now_time]

class timerWindows(Tk):
    def __init__(self, *args, **kwargs):
        Tk.__init__(self, *args, **kwargs)
        self.overrideredirect(True)
        self.title("Timer")
        self.geometry('420x110')

        self.wm_attributes("-topmost", True)
        #self.wm_attributes("-disabled", True)
        self.wm_attributes("-transparentcolor", "white")

        self.resizable(width=False, height=False)
        self.configure(bg = bgc)
        font = tkinter.font.Font(family="digital-7 Mono", size=80)
        #self.start_time.strftime("%H:%M:%S")
        self.l1 = Label(text = "00:00:00", bg = bgc,  font=font, )#fg = fgc)
        self.l1.configure()
        self.l1.grid(row=0, column=0, )#padx=5, sticky=NW)
        self.grid_rowconfigure(0, weight=1)
        self.grid_columnconfigure(0, weight=1)
        self.bind("<Button-1>", self.form_click)
        self.bind('<Double-Button-1>', self.double_form_click)
        self.bind('<B1-Motion>', self.on_drag)

        self.menu = tkinter.Menu(self, tearoff=0)
        self.menu.add_command(label="Закрыть", command=self.close_time)
        self.bind("<Button-3>", self.show_popup)
        #self.text.grid()

        self.start_time = datetime.now()
        self.pause_time = self.start_time
        self.checkpoint = True
        self.time_delta = timedelta(0)

    def on_drag(self, event):
        rect = re.fullmatch(r'\d+x\d+\+(?P<x>-?\d+)\+(?P<y>-?\d+)',
                            self.geometry()).groupdict()
        # NOTE: self.winfo_root*() is content's coordinate without window decorations
        x = int(rect['x']) + (event.x - self.start_x)
        y = int(rect['y']) + (event.y - self.start_y)
        self.geometry(f'+{x}+{y}')

    def show_popup(self, event):
        self.menu.tk_popup(event.x_root, event.y_root)

    def close_time(self):
        self.quit()

    def form_click(self, event):
        self.start_x = event.x
        self.start_y = event.y
        if self.checkpoint==True:
            self.checkpoint=False
        else:
            self.checkpoint = True
            self.start_reading(self.checkpoint)


    def double_form_click(self, event):
        self.checkpoint=False
        self.start_time = datetime.now()
        self.pause_time = self.start_time
        self.time_delta = timedelta(0)
        self.l1['text']="00:00:00"

    def start_reading(self, arg):
        if arg:
            if self.pause_time>self.start_time:
                self.start_time=datetime.now()
            start_time_return = timer(self.start_time-self.time_delta)
            self.l1['text'] = start_time_return[0]
            self.l1.update()
            self.after(1000, self.start_reading, self.checkpoint)  # repeat the call
        if not arg:
            self.pause_time=datetime.now()
            self.time_delta = self.time_delta+(self.pause_time-self.start_time)


def main(argv):
    window = timerWindows()
    window.after(1000, window.start_reading, True)
    window.mainloop()


if __name__ == '__main__':
    main(sys.argv)

推荐答案

在环顾四周一段时间后,似乎没有合法的方法来移除这些"神器".

However,我相信如果您将变量bgc设置为与黑色(例如#000001)接近但不相同的值, colored颜色 的差异将如此之小,以至于伪像将变得不可察觉.


记住还要将透明 colored颜色 设置为新的背景 colored颜色 .

self.wm_attributes("-transparentcolor", bgc)


Edit after comment:

我不确定你的原则是什么意思,但我猜你想要一种动态改变 colored颜色 的方法,而且仍然没有人工制品.

所以我们要做的是将bgc设置为始终与fgc相差1个值.

我们可以通过将十六进制值转换为整数并递增来实现这一点.然后将新值转换为十六进制代码.

首先,让我们将fgc设置为十六进制代码.

fgc = "#000000"

接下来,让我们将fgc配置为一个新变量(fgc_),以便将其转换为整数.我们将用replace()go 掉#,并使用int的内置十六进制到基数10的转换.(16参数)

fgc_ = int(fgc.replace("#", ""), 16)

#output of above line
fgc_ = 0

我们可以使用.format()将变量bgc设置为递增后的值:

bgc = '#{:06x}'.format(fgc_ + 1)

此行确保bgc将只有6个字符(不包括#).

请注意,由于我们正向递增,因此值#ffffff将不起作用.但是,正如我上面提到的,您可以使用一个非常接近那个值(#fffffe)的值,它将工作得很好,肉眼看不到.

我希望这更接近你要找的东西!

以下是最终代码:

fgc = "#000000" #whatever you want it to be (except #ffffff)

fgc_ = int(fgc.replace("#", ""), 16) #remove pound and convert from base-16 to base-10

bgc = '#{:06x}'.format(fgc_ + 1) #increment +1 and format back to hex.

Python相关问答推荐

_repr_html_实现自定义__getattr_时未显示

按列分区,按另一列排序

如何在python polars中停止otherate(),当使用when()表达式时?

Python中绕y轴曲线的旋转

如何在Raspberry Pi上检测USB并使用Python访问它?

迭代嵌套字典的值

不允许访问非IPM文件夹

如何在BeautifulSoup/CSS Select 器中处理regex?

OpenGL仅渲染第二个三角形,第一个三角形不可见

使用__json__的 pyramid 在客户端返回意外格式

在电影中向西北方向对齐""

一个telegram 机器人应该发送一个测验如何做?""

如何从比较函数生成ngroup?

如何防止html代码出现在quarto gfm报告中的pandas表之上

如果服务器设置为不侦听创建,则QWebSocket客户端不连接到QWebSocketServer;如果服务器稍后开始侦听,则不连接

一维不匹配两个数组上的广义ufunc

使用Scikit的ValueError-了解

如何使用Polars从AWS S3读取镶木地板文件

多个布尔条件的`jax.lax.cond`等效项

如何在开始迭代自定义迭代器类时重置索引属性?