将列表传递给一个函数以移动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))