2017-03-15 100 views
0
import tkinter as tk 
from tkinter import ttk 

def draw_mine_field(x=5, y=3): 
    mine_frame = tk.Toplevel(root) 
    mine_frame.grid() 
    root.withdraw() 

    for a in range(x): 
     for b in range(y): 
      ttk.Button(mine_frame, text='*', width=3).grid(column=a, row=b) 

root = tk.Tk() 
root.title("MS") 

startframe = ttk.Frame(root) 

ttk.Label(root,text="y").grid(row=1,column=1) 
y_entry_box = ttk.Entry(root).grid(row=1,column=2) 

ttk.Label(root,text="x").grid(row=1,column=3) 
x_entry_box = ttk.Entry(root).grid(row=1,column=4) 

ttk.Button(root,text="Start",command=draw_mine_field).grid(row=2,column=1) 
ttk.Button(root,text="Quit",command=root.destroy).grid(row=2,column=2) 

root.mainloop() 

对于此特定示例可能有一种更简单的方法。基本上,我想知道的是在command=draw_mine_field中传递参数时,如何在不运行该函数的情况下通过(x, y)?总的来说,这是如何工作的?通过函数参考时传递参数

+1

x和y来自哪里,如果不是默认值? –

+0

您不能将值传递给函数而不运行它。在这个设计中你可以做的是设置一些全局变量,并且使用这些函数而不是参数,但这并不完全是优雅的设计。通常在GUI中,您需要将x和y值输入到输入窗口小部件(文本框或旋转框)中,并从中读取绘图函数。 –

回答

2

使用functool.partials函数进行闭包。

from functools import partial 
#... 
btn = ttk.Button(root,text="Start",command=partial(draw_mine_field, 5, 3)) 
btn.grid(row=2,column=1) 

有些人会告诉你使用lambda,但只适用于文字。除非你确切知道它是如何工作的,否则我会避免使用lambda。部分时间工作。另外,如果您希望在将来避免错误,请不要将布局(包,网格或位置)与初始化位于同一行。

+0

像这样使用'partial'只在参数的值在其创建的Button按钮时已知。如果是这种情况,OP可能会使用默认参数值(如其问题中的代码所示)。 – martineau