将列表传递给一个函数以移动tkinter中的对象(python 3)

问题描述:

我在制作一个rubiks幻灯片游戏。我正在做的第一个功能按钮是顺时针按钮(每隔一个按钮什么都不做)。我有四个位置的正方形,并将它们放在名为板子的列表中。然后,我将该列表从顺时针按钮中调用到clockwise_move函数,并且它应该在指定的任何位置移动方块。我不明白为什么这不起作用。将列表传递给一个函数以移动tkinter中的对象(python 3)

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 

在你行,你指派命令clockwise_function到按钮,您的asigning作用的结果。所以结果是,你的功能在你启动你的应用程序后被调用,而不需要点击按钮。

证明这一点,您可以简单地将打印(“呼叫”)放入您的定义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"]) 

clockwise_move()将在你想通过创建button.If的执行器参数使用lambda关键字:

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