将列表传递给函数以便在tkinter中移动对象(python 3)

时间:2016-03-04 22:19:11

标签: python-3.x tkinter tkinter-canvas

我正在做一个rubiks幻灯片游戏。我正在做的第一个功能按钮是顺时针按钮(每隔一个按钮什么都不做)。我有四个方块的位置,并将它们放在一个名为board的列表中。然后我从顺时针按钮将列表调用到顺时针_move函数,并且它应该在所述的任何位置移动方块。我无法理解为什么这不起作用。

from tkinter import *
from tkinter import ttk

# --- Functions ---

def clockwise_move(square):
    canvas.coords(square[0], 500, 2, 250, 250)
    canvas.coords(square[1], 500, 490, 249, 250)
    canvas.coords(square[2], 2, 2, 249, 249)
    canvas.coords(square[3], 2, 490, 249, 250)


# --- Setup ---

main = Tk()

main.title("Rubik's Slide")
main.resizable(width=FALSE, height=FALSE)
main.geometry("700x550")

# --- Objects ---

frame = ttk.Frame(main)
button_frame = ttk.Frame(frame)
canvas = Canvas(frame, width=500, height=700)


#squares
square1 = canvas.create_rectangle(2, 2, 249, 249, fill="red")
square2 = canvas.create_rectangle(500, 2, 250, 250, fill="white")
square3 = canvas.create_rectangle(2, 490, 249, 250, fill="blue")
square4 = canvas.create_rectangle(500, 490, 250, 250, fill="black")

board = [square1,square2,square3,square4]

#buttons
clockwise = ttk.Button(button_frame, text="Clockwise", command=clockwise_move(board))
clockwise.grid(column=2, row=3)

counter_clockwise = ttk.Button(button_frame, text="Counterclock")
counter_clockwise.grid(column=3, row=3)

right = ttk.Button(button_frame, text="Right")
right.grid(column=2, row=1)

left = ttk.Button(button_frame, text="Left")
left.grid(column=2, row=2)

up = ttk.Button(button_frame, text="Up")
up.grid(column=3, row=1)

down = ttk.Button(button_frame, text="Down")
down.grid(column=3, row=2)

start = ttk.Button(button_frame, text="Start")
start.grid(column=2, row=4)

reset = ttk.Button(button_frame, text="Reset")
reset.grid(column=3, row=4)

#frame grid
frame.grid(column=1, row=1)
canvas.grid(column=1, row=1)
button_frame.grid(column=2, row=1)

#misc settings
for child in button_frame.winfo_children():
    child.grid_configure(padx=10, pady=20)

main.mainloop() #end of GUI

2 个答案:

答案 0 :(得分:0)

在您将命令clockwise_function分配到按钮上的行中,您将对函数的结果进行指定。结果是,在您启动应用程序而不单击按钮后调用您的函数。

证明你可以简单地将打印(“呼叫”)放入clockwise_function的定义中。相反,您可以将函数调用包装为lambda表达式command=lambda:clockwise_move(board))。因此,不是传递函数的结果,而是传递一个匿名函数的实例。

另一种方法是删除参数square并使用全局变量。

如果没有参数,您只需:

def prototype():
    print("do something")

... command = prototype # the reference to the function

然后按下按钮就像command()

一样

为了让事情变得更轻松,你也可以像字典,列表或枚举一样保存你的位置:

这里我使用字典

# Top Left | Top Right | Bottom Left | Bottom Right
p= {"tr":[500, 2, 250, 250],
    "br":[500, 490, 249, 250],
    "tl":[2, 2, 249, 249],
    "bl":[2, 490, 249, 250]}

def clockwise_move(square):
    canvas.coords(square[0], *p["tr"])
    canvas.coords(square[1], *p["br"])
    canvas.coords(square[2], *p["tl"])
    canvas.coords(square[3], *p["bl"])

答案 1 :(得分:0)

clockwise_move()将在创建按钮时成为执行者。如果您想传递参数,请使用lambda关键字:

ttk.Button(button_frame, text="Clockwise", command=lambda: clockwise_move(board))