开源改变世界

tkInter 画布抗锯齿 hack! #986

推推 grbl 3年前 (2023-02-02) 301次浏览
关闭
Harvie 打开了这个问题 2018 年 9 月 30 日 · 6条评论
关闭

tkInter 画布抗锯齿 hack!#986

Harvie 打开了这个问题 2018 年 9 月 30 日 · 6条评论

注释

tkInter 画布抗锯齿 hack! #986
合作者
哈维 评论了 2018 年 9 月 30 日  

我想出了在 tkinter canvas 中进行抗锯齿的小技巧(否则已知它本身无法进行抗锯齿):

tkInter 画布抗锯齿 hack! #986

#No antialiasing
self.create_line(0,10,70,200, fill="#000", width=5)

#Antialiasing (do 0.5px thicker line with approx 33% of color intensity before rendering line)
self.create_line(10,10,80,200, fill="#AAA", width=5.5)
self.create_line(10,10,80,200, fill="#000", width=5)

5像素:
tkInter 画布抗锯齿 hack! #986

1像素:
tkInter 画布抗锯齿 hack! #986

它不是非常平滑的子像素抗锯齿,但我认为它在眼睛上更容易!
我们所要做的就是覆盖 tkinter Canvas 方法,如 create_line() 或 create_oval() 来执行此操作。
唯一的问题是我们必须以某种方式计算出正确的颜色。可以这样做:

                rgb = self.winfo_rgb("red")
                print rgb[0], rgb[1], rgb[2]
tkInter 画布抗锯齿 hack! #986 哈维 改了标题 画布抗锯齿 tkInter 画布抗锯齿 hack! 2018 年 9 月 30 日
tkInter 画布抗锯齿 hack! #986
贡献者
斯芬克斯 评论了 2018 年 9 月 30 日  

@Harvie如何应用它?
铣削深度是可以的,但坐标已经很小了。
出于我的目的,我有原始的 b-CNC,我想要抗锯齿但没有 rgb,我需要一条线……没有扭结……

tkInter 画布抗锯齿 hack! #986
贡献者

如果只是为了展示,那我觉得多此一举,因为你需要看看会做什么。

Harvie 向 Harvie/bCNC 添加了引用此问题的提交 2018 年 9 月 30 日

tkInter 画布抗锯齿 hack! #986
合作者作者

@sfinexer

如何应用它?

我已经在我的提交中应用了它

铣削深度是可以的,但是坐标已经很小了

它不影响铣削或精度

如果只是为了展示,那我觉得多此一举,因为你需要看看会做什么。

它不会影响您查看细节的能力(无论如何这在 bCNC 中是非常糟糕的)。目前 bCNC 的观点远非准确。它使用线等来近似圆弧…但是缺少抗锯齿是您无法准确看到线的原因之一。如果需要,请阅读有关该主题的内容。然而,我的眼睛被非抗锯齿线伤害了,所以我添加了这个,因为它很容易做到。

然而,在我们转向 OpenGL #591之前,这只是便宜的简单修复

tkInter 画布抗锯齿 hack! #986
合作者作者
哈维 评论了 2018 年 9 月 30 日  

如果有人正在寻找 Tkinter Canvas 抗锯齿,仅供参考:

ANTIALIAS_CHEAP = True

class CNCCanvas(Canvas, object):
	#Calculate arguments for antialiasing
	def antialias_args(self, args, winc=0.5, cw=2):
		nargs = {}

		#set defaults
		nargs['width'] = 1
		nargs['fill'] = "#000"

		#get original args
		for arg in args:
			nargs[arg] = args[arg]
		if nargs['width'] == 0:
			nargs['width'] = 1

		#calculate width
		nargs['width'] += winc

		#calculate color
		#cbg = self.winfo_rgb(CANVAS_COLOR)
		cbg = self.winfo_rgb(self.cget("bg"))
		cfg = list(self.winfo_rgb(nargs['fill']))
		#print cbg, cfg
		cfg[0] = (cfg[0] + cbg[0]*cw)/(cw+1)
		cfg[1] = (cfg[1] + cbg[1]*cw)/(cw+1)
		cfg[2] = (cfg[2] + cbg[2]*cw)/(cw+1)
		nargs['fill'] = '#%02x%02x%02x' % (cfg[0]/256, cfg[1]/256, cfg[2]/256)
		#nargs['fill'] = '#AAA'
		#print cfg, nargs['fill']

		return nargs

	#Override alias method if antialiasing enabled:
	if ANTIALIAS_CHEAP:
		def create_line(self, *args, **kwargs):
			nkwargs = self.antialias_args(kwargs)
			super(CNCCanvas, self).create_line(*args, **nkwargs)
			return super(CNCCanvas, self).create_line(*args, **kwargs)