Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 传递函数引用时传递参数_Python_Function_Python 3.x_Tkinter - Fatal编程技术网

Python 传递函数引用时传递参数

Python 传递函数引用时传递参数,python,function,python-3.x,tkinter,Python,Function,Python 3.x,Tkinter,对于这个特定的例子,可能有一种更简单的方法。基本上,我想知道的是,当在command=draw\u mine\u field中传递函数引用时,如何在不运行函数的情况下传递(x,y)?一般来说,这是如何工作的?使用functool.partials函数进行闭包 import tkinter as tk from tkinter import ttk def draw_mine_field(x=5, y=3): mine_frame = tk.Toplevel(root) mine

对于这个特定的例子,可能有一种更简单的方法。基本上,我想知道的是,当在
command=draw\u mine\u field
中传递函数引用时,如何在不运行函数的情况下传递
(x,y)
?一般来说,这是如何工作的?

使用
functool.partials
函数进行闭包

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()
有些人会告诉您使用lambda,但这只适用于文本。除非你确切知道它是如何工作的,否则我会避免使用lambda。我一直在工作


此外,如果希望避免将来出现错误,请不要将布局(包、网格或位置)与初始化放在同一行上

使用
functool.partials
函数进行闭包

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()
有些人会告诉您使用lambda,但这只适用于文本。除非你确切知道它是如何工作的,否则我会避免使用lambda。我一直在工作


此外,如果希望避免将来出现错误,请不要将布局(包、网格或位置)与初始化放在同一行上

如果不是默认值,那么x和y来自哪里?如果不运行函数,就不能将值传递给函数。在这个设计中,您可以设置一些全局变量,让函数使用这些变量,而不是参数,但这并不是一个很好的设计。通常,在GUI中,您可以将x和y值输入到输入小部件(文本框或旋转框)中,并从中读取draw函数。如果x和y不是默认值,那么它们从何而来?如果不运行该函数,则无法将值传递给该函数。在这个设计中,您可以设置一些全局变量,让函数使用这些变量,而不是参数,但这并不是一个很好的设计。通常在GUI中,您可以将x和y值输入到输入小部件(文本框或旋转框)中,并从中读取draw函数。只有在创建
按钮
小部件时参数值已知时,才能使用类似的
部分
。如果是这种情况,OP也可以使用默认参数值(如问题中的代码所示)。只有在创建
按钮
小部件时参数值已知时,才可以使用类似的
partial
。如果是这种情况,OP还可以使用默认参数值(如问题中的代码所示)。