在 tkinter 中创建“填充”命令

Posted

技术标签:

【中文标题】在 tkinter 中创建“填充”命令【英文标题】:Creating a "Fill" command in tk inter 【发布时间】:2020-12-25 07:08:48 【问题描述】:

我对 Python 和一般编码都很陌生。我一直在研究一个本质上与 ms paint 相似的程序。到目前为止,我已经添加了创建多色矩形、线条、椭圆以及任何多边形的功能。

我一直在使用 tkinter GUI。我一直想添加一个填充命令,但我有点不知道如何启动它。我对它如何工作的想法是,它会检查用户当前悬停在上面的像素的颜色,然后检查上、下、左和右是否以像素为单位的相同颜色。如果它发现了,它会改变这些像素的颜色(我猜是通过创建一个非常小的矩形对象?)。这理论上可以填满一个区域。但是,我真的找不到任何关于如何在 tkinter 中访问像素颜色的信息。

我知道特定事件的位置是 event.x 和 event.y,但我找不到有关像素颜色的任何信息。我还没有真正为它编写任何代码,因为我不确定 tkinter 甚至可以访问像素的颜色而不仅仅是对象颜色。

【问题讨论】:

真的取决于你是怎么画的。如果您使用 PIL 图像作为绘图画布,那么您可以直接将其转换为 numpy 数组并完全按照您的描述进行操作。如果不是,我建议您切换到 PIL 图像,因为它会使保存和缩放图像等操作变得更加容易。 这被称为“洪水填充”,并不难实现。我写了一个 here 的例子(虽然它在 pygame 中)。问题是在 python 中手动执行此操作可能会遇到性能问题。为了让它在 tkinter 中工作,你必须创建一个图像来操作和 blit 到窗口上。这有点乏味,使用 pygame、pyglet 或 kivy 之类的库可能会更好。 【参考方案1】:

很遗憾,这是不可能的。我做了一些搜索,发现了其他几个类似的问题,但总体思路是 Tkinter 不支持这样的功能。考虑到 Tkinter 是一个 GUI 库,这是有道理的。

我在某处看到了一个建议,其中提出了使用Tkinter Canvas 创建 1x1 矩形以基本上模仿像素的想法。但是,这种方法最终会导致性能问题和滞后,因此也不推荐。

您可能想尝试探索其他一些库以与 Tkinter 一起使用。您可以保留 Tkinter GUI,但使用图像处理库或与 Tkinter 很好集成的类似工具来绘制实际的像素。

【讨论】:

以上是关于在 tkinter 中创建“填充”命令的主要内容,如果未能解决你的问题,请参考以下文章

在 Tkinter Python 中创建全局画布

如果在函数中创建,为啥 Tkinter 图像不显示?

如果在函数中创建,为啥 Tkinter 图像不显示?

在 Tkinter 中创建向导

如何在 Tkinter 中创建带有标签的超链接?

在 tkinter 类中创建一个切换按钮