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



我正在尝试处理tkinter和键盘输入事件。我如何开发下面的代码,以便当按下一个键(例如向上箭头)时,调用一个函数,将一些全局变量(画布形状位置的x和y)增加1,以便(例如)画布形状可以在屏幕上移动?显然,我下面调用的是一个改变局部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值从函数中传递出去,以便它可以更新画布绘制的坐标?我很想在这里得到一些帮助。非常感谢。

您可以使用canvas1.coords(arc, ...)更新坐标。

如果你像coord = [x, y, a, b]一样列出coord,你可以用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()

最新更新