我正在做一个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
答案 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))