2017-03-15 21 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にfucntionリファレンスを渡すときです。機能を実行しないで(x, y)をどうやって渡すのですか?一般的にどのように機能しますか?関数参照を渡すときにargsを渡す

+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) 

ラムダの使用を指示する人もいますが、これはリテラルでのみ機能します。ラムダの仕組みが分かっていなければ、ラムダを避けるだろう。部分的には常に動作します。

また、今後のバグを回避したい場合は、レイアウト(パック、グリッド、場所)を初期化と同じ行に置かないでください。

+0

'partial'というようなものを使用すると、' Button'ウィジェットが作成されたときに引数の値が分かっている場合にのみ動作します。 OPの場合は、デフォルトの引数値を使用することもできます(問題のコードに示されているように)。 – martineau

関連する問題