【问题标题】:tkinter polygonstkinter 多边形
【发布时间】:2017-09-06 18:50:37
【问题描述】:

我对 tkinter 比较陌生,我正在制作一个只使用正方形的游戏。我要抄的书只显示三角形。代码如下:

# The tkinter launcher (Already complete)
from tkinter import *
HEIGHT = 500
WIDTH = 800
window = Tk()
window.title ('VOID')
c = Canvas (window, width=WIDTH, height=HEIGHT, bg='black')
c.pack()
# Block maker (Issue)
ship_id = c.create_polygon (5, 5, 5, 25, 30, 15, fill='red')

我没有收到任何错误,它只是一串数字 (5, 5, 5, 25, 30, 15) 我没有收到,因为我正在尝试制作一个正方形。

【问题讨论】:

  • 如果你想制作一个矩形,你必须给它四个 x/y 坐标而不是 3。
  • 你可以简单地谷歌如何做到这一点。它将在几个站点上列出,并且许多已经在堆栈溢出时回答了这里。看看画布小部件上的tkinter docs
  • OP,任何建议的答案都回答了您的问题吗?
  • @RagingRoosevelt 是的,但我遇到了其他问题。我会发布关于它的。

标签: python python-3.x tkinter


【解决方案1】:

Canvas.create_polygon definition的摘要:

如图所示,多边形有两部分:轮廓和内部。它的几何被指定为一系列顶点 [(x0, y0), (x1, y1), ... (xn, yn)] (...)

id = C.create_polygon(x0, y0, x1, y1, ..., option, ...)

所以你需要按照这个指定的顺序传递正方形的坐标。 例如:

myCanvas.create_polygon(5, 5, 5, 10, 10, 10, 10, 5)

可以读作

myCanvas.create_polygon(5,5, 5,10, 10,10, 10,5)

将创建一个顶点为(5, 5)(5, 10)(10, 10)(10, 5) 的正方形。

【讨论】:

    【解决方案2】:

    Here'screate_polygon 函数 (official docs) 的一些信息。

    根据nmt.edu页面,函数调用的格式为

    id = C.create_polygon(x0, y0, x1, y1, ..., option, ...)
    

    这意味着ship_id = c.create_polygon (5, 5, 5, 25, 30, 15, fill='red') 调用创建了一个具有以下顶点的多边形:(5,5), (5,25), (30, 15) 并用红色填充多边形。

    如果您想创建一个正方形,您必须执行以下操作:

    ship_id = c.create_polygon (5, 5, 5,  25, 25, 25, 25, 5,  fill='red')
    

    创建一个顶点为 (5,5), (5,25), (25,25), (25,5) 的矩形。

    如果你想要一种更可重复的方式来制造船只,你可以这样做

    def ship (x,y): 
        return [x-5, y-5, x+5, y-5, x+5, y+5, x-5, y+5]
    ship_id = c.create_polygon(*ship(100, 500),  fill='red')
    

    上面将创建一种船舶工厂(lambda 函数),您可以在其中指定船中心的 x 和 y,然后给出可用于 create_polygon 的顶点列表功能。

    您甚至可以更进一步,使用经过调整的 lambda 函数指定船舶尺寸

    def ship (x,y,w,h): 
        return [x-w/2, y-h/2, x+w/2, y-h/2, x+w/2, y+h/2, x-w/2, y+h/2]
    ship_id = c.create_polygon(*ship(100, 500, 8, 8),  fill='red')
    

    【讨论】:

    • 正如备注:一般不建议分配lambda表达式,使用def更好。参考:PEP8,没有锚但 ctrl+f -> lambda.
    • @Rightleg 啊,没有意识到这一点。对调试、可读性和 lambda 带来的唯一优势是有意义的。谢谢你让我直截了当。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-18
    • 1970-01-01
    • 1970-01-01
    • 2013-03-20
    • 1970-01-01
    • 1970-01-01
    • 2020-11-28
    相关资源
    最近更新 更多