我正在尝试使用tkinter和键盘输入事件。如何开发下面的代码,以便在按下某个键时(例如向上箭头),调用一个函数,将一些全局变量(画布形状位置的x和y)递增1,以便(例如)a画布形状可以在屏幕上移动吗?显然我在下面调用的是一个改变局部x的函数。如何将值返回主程序?任何帮助都会受到极大的重视。感谢
from tkinter import *
x = 10
y = 10
a = 100
b = 100
def change_coord(event):
x = x+1
window = Tk()
window.geometry("500x500")
canvas1=Canvas(window, height = 400, width = 400)
canvas1.grid(row=0, column=0, sticky=W)
coord = x, y, a, b
arc = canvas1.create_arc(coord, start=0, extent=150, fill="blue")
window.bind_all('<Up>', change_coord)
window.mainloop()
所以这是一种解决方法......
from tkinter import *
x = 50
y = 10
a = 200
b = 100
def change_coord(event):
global x
x = x+1
coord = x, y, a, b
arc = canvas1.create_arc(coord, start=0, extent=150, fill="blue")
window = Tk()
window.geometry("500x500")
canvas1=Canvas(window, height = 400, width = 400)
canvas1.grid(row=0, column=0, sticky=W)
window.bind_all('<Up>', change_coord)
window.mainloop()
但理想情况下,我喜欢在程序运行时出现的形状,而不是在按下按键时出现的形状。因此画布绘制代码需要放在main中。如何将更新的x值传递出函数,以便更新画布的坐标? 我会在这里得到一些帮助。谢谢!
答案 0 :(得分:1)
您可以使用canvas1.coords(arc, ...)
更新坐标。
如果您创建了coord
之类的coord = [x, y, a, b]
列表,则可以使用coord[0] +=1
在事件功能中更新它,并使用canvas1.coords(arc, *coord)
更新坐标。 *
会自动将列表解压缩为定义坐标的四个参数
如果这样做,您还必须在创建弧时将*
放在coord
之前
在列表中使用坐标的好处是可以更改值,元组是不可变的。
这是一个允许您在画布周围移动弧的示例
from tkinter import *
x = 10
y = 10
a = 100
b = 100
def change_coord(event):
global coord
if event.keysym == 'Up':
coord[1] -=1
coord[3] -=1
if event.keysym == 'Down':
coord[1] +=1
coord[3] +=1
if event.keysym == 'Right':
coord[0] +=1
coord[2] +=1
if event.keysym == 'Left':
coord[0] -=1
coord[2] -=1
canvas1.coords(arc, *coord)
window = Tk()
window.geometry("500x500")
canvas1=Canvas(window, height = 400, width = 400)
canvas1.grid(row=0, column=0, sticky=W)
coord = [x, y, a, b]
arc = canvas1.create_arc(*coord, start=0, extent=150, fill="blue")
window.bind_all('<Up>', change_coord)
window.bind_all('<Down>', change_coord)
window.bind_all('<Left>', change_coord)
window.bind_all('<Right>', change_coord)
window.mainloop()