【问题标题】:Create Oval Python Tkinter Canvas创建椭圆形 Python Tkinter 画布
【发布时间】:2019-12-06 04:32:43
【问题描述】:

我想在 python tkinter 中创建这个形状:

但我必须使用的唯一选项是

canvas.create_polygon
canvas.create_line
canvas.create_arc
canvas.create_oval

以上这些选项都没有能力生成这样的形状。是否有任何替代方法或方法可以使用这些选项创建此形状?

【问题讨论】:

  • 我相信它们可以通过Canvas.create_arc()创建。
  • 你所描述的实际上是一个弧线。
  • @BryanOakley 当我使用 Arc 时,它会在底部创建一条线作为弧的轮廓 - 我怎样才能摆脱它?

标签: python tkinter


【解决方案1】:

作为@martineau cmets,create_arc() 是方法,但理解 tkinter 的 create_oval() 至关重要,因为弧是椭圆的一部分:

import tkinter as tk

WINDOW_WIDTH, WINDOW_HEIGHT = 600, 300
OVAL_WIDTH, OVAL_HEIGHT = 576, 290

# (x0, y0, x1, y1) rectangle for oval
BOUNDS = ( \
    (WINDOW_WIDTH - OVAL_WIDTH) / 2, \
    (WINDOW_HEIGHT - OVAL_HEIGHT) / 2, \
    3*WINDOW_WIDTH/2 - OVAL_WIDTH/2, \
    3*WINDOW_HEIGHT/2 - OVAL_HEIGHT/2 \
)

root = tk.Tk()

canvas = tk.Canvas(root, width=WINDOW_WIDTH+20, height=WINDOW_HEIGHT+20)  # +20 for window "chrome"
canvas.pack()

rectangle = canvas.create_rectangle(*BOUNDS, outline="blue")  # just for illustration
oval = canvas.create_oval(*BOUNDS, outline="red")  # just for illustration
arc = canvas.create_arc(*BOUNDS, start=30, extent=120, style=tk.ARC, width=3)

root.after(3000, canvas.delete, rectangle)  # remove rectangle illustration
root.after(6000, canvas.delete, oval)  # remove oval illustration

root.mainloop()

当我使用 Arc 时,它会在底部创建一条线作为轮廓 弧线 - 我怎样才能摆脱它?

上面的style=tk.ARC 处理了这个问题——默认是一个饼图。

此弧的末端如何终止与您的插图不同。据我所知,tkinter 的 capstylejoinstyle 选项不适用于 arcs。

【讨论】:

  • 我对 BOUNDS 变量的用途感到困惑 - 它在做什么?
  • @jakethefake, BOUNDS 定义了定义椭圆的矩形。弧线是这个椭圆的一部分。我也会更新我的代码来说明这一点。
  • 矩形的使用帮助我理解了。有没有办法让圆从矩形的一个角开始,到对角结束?
【解决方案2】:

create_arc 方法是您想要使用的。它以style 参数指定的三种不同样式之一创建弧。这就是official tcl/tk documentation 描述style 选项的方式:

如果 type 是 pieslice(默认),那么弧的区域由椭圆的周长的一部分加上两条线段定义,一条线位于椭圆的中心和周长截面的每一端之间.如果类型是chord,那么弧的区域由椭圆的周长部分加上连接周长部分的两个端点的单线段定义。如果 type 是 arc 则弧的区域仅由周长的一部分组成。在最后一种情况下,fill 选项被忽略。

以下是三种样式的示例:

import tkinter as tk

root = tk.Tk()
canvas = tk.Canvas(root, background="black")
canvas.pack(side="top", fill="both", expand=True)

canvas.create_arc(0, 20, 100, 120, outline="red", style="pieslice")
canvas.create_arc(80, 20, 180, 120, outline="red", style="chord")
canvas.create_arc(160, 20, 260, 120, outline="red", style="arc")
root.mainloop()

【讨论】:

  • 当您使用 (160, 20, 260, 120) 创建第三条弧线时 - 这些是画布的坐标吗?
  • @jakethefake:坐标给出了包围定义弧的椭圆的矩形区域的两个对角对角的坐标。
  • 我明白了,无论如何我可以让弧从矩形的一个角开始并在矩形的对角角结束吗?使用start?
  • @jakethefake:你为什么不对所有可用的选项做一些实验呢?简短的回答是,您可以创建数学允许的任何弧线。
【解决方案3】:

我想这就是你要找的。​​p>

import tkinter as tk

root = tk.Tk()

canvas = tk.Canvas(root, width=400, height=400)
canvas.pack()

coord = 10, 50, 240, 210
arc = canvas.create_arc(coord, start=30, extent=120, style=tk.ARC, width=3)

root.mainloop()

【讨论】:

    猜你喜欢
    • 2018-07-03
    • 2022-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多