Tkinter画布坐标中的浮点值

0 投票
1 回答
1904 浏览
提问于 2025-04-16 23:10

我该如何在创建画布对象时使用浮点坐标呢?
比如:

    from Tkinter import *
    import math

    main=Tk()
    w=Canvas(main, height=100, width=100)
    w.grid(row=0, column=0)
    for y in range(100):
        for x in range(100):
            if y==math.sin(x):
                w.create_oval(x, y, x, y)
        x=0

这样返回的是空白的表单……那么,我该如何使用浮点数作为坐标呢?

1 个回答

0

你遇到了几个问题。

  1. sin(x) 的值永远不会超过 1,也不会低于 -1,所以检查 y 到 100 是没有意义的。你的循环结构完全错了。
  2. 如果你想让 x 匹配 sin(x) 的整数值(1、0 和 -1),你需要把 x 乘以 math.pi/2
  3. 由于浮点数运算的特性,0==sin(pi)0==sin(2*pi) 这个判断不会成立,你需要检查类似 -0.01 < sin(pi) < 0.01 的条件。
  4. create_oval 需要两个不同的 x, y 坐标对——一个是左上角,一个是右下角。你给它传了相同的值,所以如果你到达这一步,可能只会看到一个点。
  5. x=0 是多余的,因为每次你去新的 y 值时,都会为 x 创建一个新的 range(100)

补充说明:@eryksun 在评论中指出,第 4 点可能是你的意图。如果是这样,那部分是对的,整体也更有意义——看起来你是在尝试绘制正弦曲线。这也意味着你不一定要把 x 乘以 math.pi / 2

如果是这样的话,你的代码可以改成这样(尽量少改动):

from Tkinter import *
import math

main=Tk()
w=Canvas(main, height=100, width=100)
w.grid(row=0, column=0)
for x in range(100):
    # this makes the sine curve y-value 
    # stretch from 0 to 100 instead of -1 to 1
    y = 49.5 - math.sin(x) * 49.5
    w.create_oval(x, y, x, y)

撰写回答