【问题标题】:45 Degree Angle Python Tkinter Canvas45 度角 Python Tkinter 画布
【发布时间】:2017-02-04 16:14:20
【问题描述】:

在 tkinter,python 中,我目前正在尝试输出,所以当单击按钮时,将有角度的线(指向 45 度方向)放在画布上。这是我到目前为止尝试过的代码:

from tkinter import *
root = Tk()
root.geometry("900x900")
canvas = Canvas(root, width=800, height=820)
canvas.pack()
png = PhotoImage(file = r'C:\Users\--\Desktop\Programming\GP\europe1.gif') #Map of europe
canvas.create_image(0, 0, image = png, anchor = "nw")
london = canvas.create_rectangle(5, 0, 10, 5, fill='red')
londontext = canvas.create_text(10, 10, text="London") #Creating labelled cities for europe picture
paris = canvas.create_rectangle(5, 0, 10, 5, fill='red')
paristext = canvas.create_text(10, 10, text="Paris")
canvas.move(london, 226, 390)
canvas.move(londontext, 210, 374)
canvas.move(paristext, 230, 447) # Sets correct coords for the two cities
canvas.move(paris, 247, 462)
def gotoparis():
    parisline = canvas.create_line(100, 0, 100, 100, 45) 
def gotolondon():                 # Trying to make a line form between the two cities
    londonline = canvas.create_line(100, 0, 100, 100, 45) 
def londonclick(event):
    londoninterface = Tk()
    londoninterface.geometry("400x400")
    ll = Label(londoninterface, text="London Airport")
    ll.pack()
    blank = Label(londoninterface, text="")    # Creating new windows
    blank.pack()
    l1 = Label(londoninterface, text="Send Flight To:")
    l1.pack()
    toparis = Button(londoninterface, text="Paris", command=gotoparis)
    toparis.pack()
def parisclick(event):
    parisinterface = Tk()
    parisinterface.geometry("400x400")
    ll = Label(parisinterface, text="Paris Airport")
    ll.pack()
    blank = Label(parisinterface, text="")
    blank.pack()
    l1 = Label(parisinterface, text="Send Flight To:")
    l1.pack()
    tolondon = Button(parisinterface, text="London")
    tolondon.pack()

canvas.tag_bind(london, '<ButtonPress-1>', londonclick)    # Makes it so when rectangle is clicked, a new window pops up
canvas.tag_bind(paris, '<ButtonPress-1>', parisclick) 

正如您可能知道的那样,我正在尝试制作一个类似机场的游戏,您可以在其中将飞机设置到目的地,并以此创建一条最终到达的路线。这段代码有点难以理解我想要做什么,但简而言之,我想在单击 tkinter 按钮时在两个画布创建的矩形之间创建一条线。澄清一下,我使用的是 python 3.5.2 tkinter。 此外,此代码不会创建错误消息或任何类型的错误,但不会执行我希望它执行的操作。基本上就是这样总结了。

【问题讨论】:

  • 我在点击伦敦点后点击Paris 按钮时收到错误消息:_tkinter.TclError: wrong # coordinates: expected an even number, got 5,因为您在canvas.create_line(100, 0, 100, 100, 45) 中给出了 5 个坐标而不是偶数。
  • 45 表示角度大小,例如45°角
  • 我在您的问题中没有看到任何问题。你有什么需要帮助的?您所做的只是告诉我们您想做什么,但没有解释您遇到的问题。
  • 您是否在某处阅读过一些说明create_line 方法将角度作为参数的文档?它没有。
  • 我想尝试这样做,当单击按钮时,会在两点之间创建一条线,但我不知道如何。

标签: python canvas tkinter


【解决方案1】:

这是在画布上创建线条的语法:

Canvas.create_line(x_1, y_1, x_2, y_2, ..., x_n, y_n, **kwargs)

(x_i, y_i) 是将由线条链接的点,并且 kwargs 设置线条的样式(填充、宽度、...参见here 以获得详尽的列表)。因此,您不能给出 45° 角作为论据。

我使用每个正方形中心的坐标来绘制它们之间的线。一个城市的初始中心在(7.5, 2.5),然后移动(x_city, y_city):

london = canvas.create_rectangle(5, 0, 10, 5, fill='red')
londontext = canvas.create_text(10, 10, text="London") #Creating labelled cities for europe picture
paris = canvas.create_rectangle(5, 0, 10, 5, fill='red')
paristext = canvas.create_text(10, 10, text="Paris")

# Sets correct coords for the two cities
x_london, y_london = 226, 390
canvas.move(london, x_london, y_london)
canvas.move(londontext, 210, 374)
x_paris, y_paris = 247, 462
canvas.move(paris, x_paris, y_paris)
canvas.move(paristext, 230, 447) 

def gotoparis():
    parisline = canvas.create_line(x_london + 7.5, y_london + 2.5, 
                                   x_paris + 7.5, y_paris + 2.5) 
def gotolondon():                
    londonline = canvas.create_line(x_london + 7.5, y_london + 2.5, 
                                    x_paris + 7.5, y_paris + 2.5)

【讨论】:

  • 按下“前往伦敦”按钮时,没有任何反应。 - 编辑:我在按钮命令上犯了一个错误,这确实有效,谢谢:)
【解决方案2】:

tkinter 画布的 line 项目不支持 text 项目所做的“角度”选项,但您可以通过以下方式旋转 line(或 polygon): (1) 计算旋转项目的新坐标,以及 (2) 使用coords() 方法更新项目的坐标。 如果您知道所需直线的起点和终点,则可以将它们传递给 create_line() 方法,您将获得所需直线以您想要的方式直接倾斜。

当一条线仅由一条线段/两个点组成时,旋转一条线很简单,例如 coords=(x1, y1, x2, y2)。但请注意,您可以添加额外的点/坐标来制作更复杂的线。

【讨论】:

    猜你喜欢
    • 2020-05-15
    • 2022-01-01
    • 2017-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多