【问题标题】:Create hollow cylinder or pipe in python using tkinter canvas使用 tkinter 画布在 python 中创建空心圆柱体或管道
【发布时间】:2017-01-01 22:53:34
【问题描述】:

我正在使用画布在 tkinter 中创建一个简单的 CAD 应用程序。空心圆柱体是通过使用两个椭圆形对象创建的,如下面的示例代码所示。内圈/椭圆形的填充与画布的背景相同,从而产生空心物体的错觉。

如果我用不同的填充(如矩形所示)将圆柱体绘制在另一个对象上,空心效果就会丢失。

不可能知道将在画布上创建的每个对象的颜色,或者用户可能会在某一点创建一个圆柱体并将其移动到不同的位置/在具有不同填充颜色的不同对象上。

在这些情况下如何创建空心对象?

示例代码:

import Tkinter as tk

root = tk.Tk()
canvas = tk.Canvas(root, width=400, height=350, background="RoyalBlue4")
canvas.pack()

#Plot on the canvas
def cylinder(OD, ID):
    canvas.create_oval(OD, outline="black", fill="SkyBlue1")
    canvas.create_oval(ID, outline="black", fill="RoyalBlue4")

def rectangle(dim):
    canvas.create_rectangle(dim, outline="black", fill="white")


rectangle([10, 10, 250, 150])
cylinder([75, 30, 175, 130], [85, 40, 165, 120])

cylinder([150, 200, 250, 300], [175, 225, 225, 275])

root.mainloop()

【问题讨论】:

  • 一个很厚的width 的圆圈,也许没有填充?
  • @TadhgMcDonald-Jensen 感谢您的来信。我试过了,但效果不好。画布还有其他方法,包括移动/滚动、缩放等。当我缩小时,宽度较粗的圆柱体会变成颜色的飞溅(可能不是正确的工作)。在绘制圆柱体后,我还必须对圆柱体的尺寸进行一些计算。如果使用带有粗width 的圆圈,仍然可以完成计算(尽管有更多的数学运算)。使用width 的主要问题是对象如何缩放。

标签: python canvas tkinter


【解决方案1】:

您需要获取至少圆柱体中心下方像素的颜色。在没有 get_pixel_color 方法的情况下,我想出了您的圆柱体功能的扩展。

def cylinder(OD, ID):
    x, y = (ID[0]+ID[2])/2, (ID[1]+ID[3])/2
    under = canvas.find_overlapping(x, y, x, y)
    fillcolor = canvas.itemcget(under[0], 'fill') if under else "RoyalBlue4"
    print('x, y, under, color = ', x, y, under, fillcolor)
    canvas.create_oval(OD, outline="black", fill="SkyBlue1")
    canvas.create_oval(ID, outline="black", fill=fillcolor)

应命名画布背景颜色,并在此处和画布创建语句中使用该名称。开发需要打印。

如果圆柱下方有多个项目,您将不得不尝试看看顶部是第一个(如上所述)还是最后一个(在这种情况下,使用 -1 而不是 0)。 (希望顺序不是随机的。)如果圆柱体部分重叠,则需要透明颜色(不可用,至少来自 tkinter)或更精细的颜色。

【讨论】:

  • 我现在正在使用它,同时研究如何处理重叠对象的随机顺序和部分重叠。谢谢。
猜你喜欢
  • 2014-03-24
  • 2019-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-25
  • 2012-08-03
  • 1970-01-01
相关资源
最近更新 更多