【问题标题】:Options of an arc in Tkinter (Python)Tkinter(Python)中弧的选项
【发布时间】:2016-02-04 00:43:24
【问题描述】:

.create_arc() 的 4 个初始数字是多少?

如:

myArc = myCanvas.create_arc(p1, p2, p3, p4, start=p5, extent=p6)

“p”是“参数”。

我不明白p1-p4 做了什么。

如何创建一个圆弧并将其放置在画布的左下角,其半径与画布的宽度/高度相同?

我需要知道这一点,因为我必须编写一个用于蒙特卡罗模拟的 GUI 来近似 Pi。

【问题讨论】:

  • Check here,就是整个弧的bbox。
  • 调用序列实际上是create_arc(x0, y0, x1, y1, option, ...)。参见Canvas arc objects——它是一个切片或楔形,从数学上是椭圆的椭圆中取出,所以也请看Canvas oval objects。您使用的两个选项是角度的起点和范围(以度为单位)。

标签: python user-interface canvas tkinter automatic-ref-counting


【解决方案1】:

坐标代表一个矩形的对角,该矩形将包围定义弧的椭圆。换句话说,圆弧只会出现在该矩形所包围的区域内。

来自官方 tcl/tk 文档(构建 tkinter 的技术)(参见http://tcl.tk/man/tcl8.5/TkCmd/canvas.htm#M111):

arc 类型的项目在显示屏上显示为弧形区域。一条弧线 是由两个角(由 -start 和 -extent 选项)并以多种方式之一显示 (由 -style 选项指定)。

使用以下形式的小部件命令创建弧:

pathName create arc x1 y1 x2 y2 ?option value option value ...?
pathName create arc coordList ?option value option value ...?

参数 x1、y1、x2 和 y2 或 coordList 给出坐标 矩形区域的两个对角相对的角包围 定义圆弧的椭圆。坐标后面可能有 选项值对的数量,每个选项值对设置一个 项目的配置选项。这些相同的期权价值对可能 在 itemconfigure 小部件命令中用于更改项目的 配置。当鼠标移动时,弧项目成为当前项目 指针位于任何已绘制的部分或(完全透明时) 如果 -fill 和 -outline 选项都是 非空。

【讨论】:

  • 在高度/宽度为 1000 的画布中的含义我需要 0、1000、1000、0 以使整个画布可用于绘制我的弧线?
  • @steveroch_rs:仅当您希望弧线与整个画布一样高和宽时。
【解决方案2】:

当然可以。

像这样:

# -*- coding: utf-8 -*-

from Tkinter import *
from random import randint
root = Tk()
can = Canvas(root,width=400.5,height=400,bg="#CCCCCC",highlightbackground="#006699")
can.place(x=10,y=10)

"""
Sec = SECTOR
--------------------
|Sec-1       Sec-2 | 
|                  |
|                  |
|                  |
|                  |
|Sec-4       Sec-3 |
--------------------
"""
deviation = 2 #NEED SHOW ALL ARCs IN CANVAS(FULL)
size = 5  #MEAN WIDTH(BORDER THICKNES)
def setARC(radius,sector,deviation,size):
    w,h = can.config("width")[-1],can.config("height")[-1]
    startAngle = 0
    position = list()
    if sector == 1 :
        positions = 0+deviation,radius+size+deviation,radius+size+deviation,0+deviation
        startAngle = 90
    elif sector == 2 :
        positions = int(w)-radius-size-deviation,deviation,int(w)-deviation,radius+deviation+size
    elif sector == 3:
        positions = int(w)-radius-size-deviation,int(h)-deviation,int(w)-deviation,int(h)-radius-deviation-size
        startAngle = 270
    elif sector == 4:
        positions = deviation,int(h)-radius-deviation-size,radius+deviation+size,int(h)-deviation
        startAngle = 180
    can.create_arc(positions,start=startAngle,extent=90,outline="black",width=size,style=ARC,tags="Sector-"+str(sector))
    sizer.set(radius)

def change(e):
    w,h = int(can.config("width")[-1]),int(can.config("height")[-1])
    radius = sizer.get()
    for x in can.find_all():
        wrd = can.gettags(x)[0]
        if wrd.startswith("Sector-") :
            position = list()
            if wrd[-1] == "1":
                position = [0+deviation,radius+size+deviation,radius+size+deviation,0+deviation]
            elif wrd[-1] == "2":
                position = [w-radius-size-deviation,deviation,w-deviation,radius+deviation+size]
            elif wrd[-1] == "3":
                position = [w-radius-size-deviation,h-deviation,w-deviation,h-radius-deviation-size]
            elif wrd[-1] == "4":
                position = [deviation,h-radius-deviation-size,radius+deviation+size,h-deviation]
            can.coords(x, tuple(position))
            Rcolor = (min(w,h)*255)/(radius if radius > 0 else 1)
            outColor = "#%02X%02X%02X"%tuple(randint(0,255) for i in range(3))
            can.itemconfig(x,outline=outColor)


sizer = Scale(root, from_=0, to=min(can.config("width")[-1],can.config("height")[-1]), orient=VERTICAL,command=change)
sizer.place(x=10+int(can.place_info()["x"])+int(can.config("width")[-1]),y=int(can.place_info()["y"]),\
            height=min(int(can.config("width")[-1]),int(can.config("height")[-1])))

sizer.set(200)

for i in range(1,5,1):
    setARC(200,i,2,5)


root.geometry("800x450+50+50")
root.config(bg="#006699")
root.mainloop()

考虑的重点是确定项目的纵横比。

w,h = int(can.config("width")[-1]),int(can.config("height")[-1])

您还必须向画布元素添加标签。

can.create_arc(positions,start=startAngle,extent=90,outline="black",width=size,style=ARC,tags="Sector-"+str(sector))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-10
    • 2013-08-17
    • 2018-04-05
    相关资源
    最近更新 更多