Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 有可能使这些线在tkinter中沿对角线移动吗?_Python_Python 3.x_Tkinter_Tkinter Canvas - Fatal编程技术网

Python 有可能使这些线在tkinter中沿对角线移动吗?

Python 有可能使这些线在tkinter中沿对角线移动吗?,python,python-3.x,tkinter,tkinter-canvas,Python,Python 3.x,Tkinter,Tkinter Canvas,在下面的程序中,我可以左右、上下移动线条。但是,是否有可能使线沿对角线移动?例如,同时按下向上箭头和向右箭头时,程序会使对角线移动NE from tkinter import * canvas_height = 400 canvas_width = 600 canvas_colour = "orange" p1_x = canvas_width / 2 p1_y = canvas_height p1_colour = "black" line_width = 10 line_length =

在下面的程序中,我可以左右、上下移动线条。但是,是否有可能使线沿对角线移动?例如,同时按下向上箭头和向右箭头时,程序会使对角线移动NE

from tkinter import *


canvas_height = 400
canvas_width = 600
canvas_colour = "orange"
p1_x = canvas_width / 2
p1_y = canvas_height
p1_colour = "black"
line_width = 10
line_length = 10


def p1_move_N(event):
    global p1_y
    canvas.create_line(p1_x, p1_y, p1_x, (p1_y - line_length),
                       width=line_width, fill=p1_colour)
    p1_y = p1_y - line_length


def p1_move_S(event):
    global p1_y
    canvas.create_line(p1_x, p1_y, p1_x, p1_y + line_length,
                       width=line_width, fill=p1_colour)
    p1_y = p1_y + line_length


def p1_move_E(event):
    global p1_x
    canvas.create_line(p1_x, p1_y, p1_x + line_length, p1_y,
                       width=line_width, fill=p1_colour)
    p1_x = p1_x + line_length


def p1_move_W(event):
    global p1_x
    canvas.create_line(p1_x, p1_y, p1_x - line_length, p1_y,
                       width=line_width, fill=p1_colour)
    p1_x = p1_x - line_length


def erase_all(event):
    canvas.delete(ALL)

window = Tk()
window.title("Drawing Software")
canvas = Canvas(bg=canvas_colour, height=canvas_height,
                width=canvas_width, highlightthickness=0)
canvas.pack()

window.bind("<Up>", p1_move_N)
window.bind("<Down>", p1_move_S)
window.bind("<Left>", p1_move_W)
window.bind("<Right>", p1_move_E)
从tkinter导入*
画布高度=400
画布宽度=600
画布颜色=“橙色”
p1_x=画布宽度/2
p1_y=画布高度
p1_color=“黑色”
线宽=10
直线长度=10
def p1_移动(事件):
全球p1_y
画布。创建线(p1_x,p1_y,p1_x,(p1_y-线长度),
宽度=线条\宽度,填充=p1\颜色)
p1_y=p1_y-线长度
def p1_移动(事件):
全球p1_y
画布。创建线(p1_x,p1_y,p1_x,p1_y+线长度,
宽度=线条\宽度,填充=p1\颜色)
p1_y=p1_y+线长度
def p1_移动(事件):
全局p1_x
画布。创建线(p1_x,p1_y,p1_x+线长度,p1_y,
宽度=线条\宽度,填充=p1\颜色)
p1_x=p1_x+线路长度
def p1_移动_W(事件):
全局p1_x
画布。创建线(p1_x,p1_y,p1_x-线长度,p1_y,
宽度=线条\宽度,填充=p1\颜色)
p1_x=p1_x-线长度
def erase_all(事件):
canvas.delete(全部)
window=Tk()
窗口标题(“绘图软件”)
画布=画布(背景=画布颜色,高度=画布高度,
宽度=画布宽度,高光厚度=0)
canvas.pack()
window.bind(“,p1\u move\N)
window.bind(“,p1\u move\S)
window.bind(“,p1\u move\u W)
window.bind(“,p1\u move\u E)

添加如下函数:

def p1_move_NE(event):
    global p1_y,p1_x
    canvas.create_line(p1_x, p1_y, p1_x + line_length, (p1_y - line_length),
                   width=line_width, fill=p1_colour)
    p1_x = p1_x + line_length
    p1_y = p1_y - line_length
然后将其与:

window.bind("9", p1_move_NE)
我对您的程序的其他建议是使用类和通用函数,如下所示:

def p1_move(dx, dy):
    global p1
    canvas.create_line(p1[0], p1[1], p1[0] + dx, p1[1] + dy,
                   width=line_width, fill=p1_colour)
    p1 = (p1[0] + dx, p1[1] + dy)

(我在示例中使用了元组p1,但类点会更好。)

你所说的“对角移动”到底是什么意思?例如,如果同时按下左箭头和上箭头,它应该在左上角绘制一条伪对角线…问题在于正方形的大小,这并不会使它看起来像一条完美的线…@Xenomorph尝试同时进行两个输入的问题在于其配置方式,它一次只能处理一个输入…我建议使用数字键盘,将9绑定到NE,3绑定到SE等等。谢谢@Ericleveil,你知道什么代码可以实现这个结果吗,我很难想出正确的代码来移动diagnally@JamesCorteen您是否尝试过简单地将
p1\u move\u N
p1\u move\u W
绑定到
7
?(请注意,您需要向bind添加
add=True
,以便将多个函数绑定到同一个键)