【问题标题】:Simpler way to draw a circle with tkinter?用 tkinter 画圆的更简单方法?
【发布时间】:2023-04-06 08:26:01
【问题描述】:

tkinter Canvas 上画一个圆通常由create_oval 方法完成。然而,提供边界框通常是考虑绘制圆的一种令人困惑的方式。想出一个快捷方式并不是特别难,但我找不到其他人在做类似的事情,所以我会发布它,希望其他人觉得它有用。

【问题讨论】:

    标签: python tkinter geometry


    【解决方案1】:

    这是一个称为monkey patching 的技巧,我们实际上将一个成员添加到tkinter/TkinterCanvas。下面是一个功能齐全的程序(Python 2.7 和 3.x),其中第三段很有趣。将其添加到您的代码中,您可以将tk.Canvas.create_circle(x, y, r, options...) 视为内置方法,其中选项与create_oval 相同。我们对create_arc(第四段)做了类似的事情,并提供了指定end 角度而不是extent 的选项。

    try:
        import tkinter as tk
    except ImportError:
        import Tkinter as tk  # Python 2
    
    root = tk.Tk()
    canvas = tk.Canvas(root, width=200, height=200, borderwidth=0, highlightthickness=0,
                       bg="black")
    canvas.grid()
    
    def _create_circle(self, x, y, r, **kwargs):
        return self.create_oval(x-r, y-r, x+r, y+r, **kwargs)
    tk.Canvas.create_circle = _create_circle
    
    def _create_circle_arc(self, x, y, r, **kwargs):
        if "start" in kwargs and "end" in kwargs:
            kwargs["extent"] = kwargs["end"] - kwargs["start"]
            del kwargs["end"]
        return self.create_arc(x-r, y-r, x+r, y+r, **kwargs)
    tk.Canvas.create_circle_arc = _create_circle_arc
    
    canvas.create_circle(100, 120, 50, fill="blue", outline="#DDD", width=4)
    canvas.create_circle_arc(100, 120, 48, fill="green", outline="", start=45, end=140)
    canvas.create_circle_arc(100, 120, 48, fill="green", outline="", start=275, end=305)
    canvas.create_circle_arc(100, 120, 45, style="arc", outline="white", width=6,
                             start=270-25, end=270+25)
    canvas.create_circle(150, 40, 20, fill="#BBB", outline="")
    
    root.title("Circles and Arcs")
    root.mainloop()
    

    结果:

    【讨论】:

      【解决方案2】:

      更简单的解决方案:

      from tkinter import *
      root = Tk()
      myCanvas = Canvas(root)
      myCanvas.pack()
      
      def create_circle(x, y, r, canvasName): #center coordinates, radius
          x0 = x - r
          y0 = y - r
          x1 = x + r
          y1 = y + r
          return canvasName.create_oval(x0, y0, x1, y1)
      
      create_circle(100, 100, 20, myCanvas)
      create_circle(50, 25, 10, myCanvas)
      root.mainloop()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-15
        • 1970-01-01
        • 2013-06-08
        • 2015-04-11
        • 1970-01-01
        • 2011-06-17
        • 1970-01-01
        相关资源
        最近更新 更多