在TKinter中使用键盘事件调用函数时,如何将值返回到主程序中?

时间:2014-09-27 16:50:21

标签: python tkinter

我正在尝试使用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值传递出函数,以便更新画布的坐标? 我会在这里得到一些帮助。谢谢!

1 个答案:

答案 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()