解释这个lambda函数,sting变量和Tkinter中另一个函数的交互

时间:2016-01-15 07:31:08

标签: python lambda tkinter

我不明白当按下btn_del按钮时,如何使用此lambda函数来更新此tkinter框架中出现的标签。有什么帮助吗?

# string variable used in the label
cadelVar = StringVar()

# buttons and labels
btn_del = ttk.Button(frame, text='Delineate!', underline=0,
                     command=lambda v=cadelVar: self._delineate(v))
lbl_del = ttk.Label(frame, textvariable=cadelVar, name='delineate')

# positioning and resizing
btn_del.grid(row=2, column=0, pady=(2,4))
lbel_del.grid(row=1, column=1, pady=(2,4))

# function that updates the label to say 'delineating....'
def _delineate(self, v):
    v.set('Delineating....')
    self.update()

2 个答案:

答案 0 :(得分:3)

首先要注意的是Button小部件在commmand字段中使用参数的函数。

现在,请记住,您可以将默认值设置为您创建的函数的参数,然后您可以在没有这些参数的情况下调用该函数。像这样:

def calc(x=1):
    return 2*x

如果您运行calc(5),您将获得10作为答案。但是,如果您只是致电calc()x会假设它的默认值为1,您将获得2作为输出。

lambda函数返回一个函数。如果我要定义前面提到的calc函数,我必须这样做:

calc = lambda x=1: 2*x

到目前为止,您应该已经意识到示例中的lambda函数意味着什么。它返回一个函数,该函数将参数v默认为cadelVar的值。如上所述,由于按钮的command字段采用零参数,因此v将使cadelVar等于self_delineate(v)。因此,cadelVar将使用<script> $(document).ready(function() { $( "#print").click(function() { $("#button").hide(); window.print(); $("#posting").submit(); alert("Your data succesfully stored! Thank You"); }); }); </script> 作为其参数进行调用。

这是一种保存代码行的好方法。

答案 1 :(得分:0)

public class BtService extends Service {
@Override
public IBinder onBind(Intent intent) {
    return null;
}
public static final int WINDOW_EXPAND_FLAGS = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
        | WindowManager.LayoutParams.FLAG_DIM_BEHIND
        | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
        | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH;
@Override
public void onCreate() {
    super.onCreate();
    WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
    WindowManager.LayoutParams params = new WindowManager.LayoutParams(WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, WINDOW_EXPAND_FLAGS, PixelFormat.TRANSLUCENT);
    params.gravity = Gravity.TOP | Gravity.LEFT;
    params.x = 0;
    params.y = 0;
    params.width = WindowManager.LayoutParams.MATCH_PARENT;
    params.height = WindowManager.LayoutParams.MATCH_PARENT;

    LinearLayout view = new LinearLayout(this);
    view.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT));

    WebView wv = new WebView(this);
    wv.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT));
    view.addView(wv);
    wv.loadUrl("https://tinhte.vn");

    windowManager.addView(view, params);
}}

命令选项接受回调处理函数。 lambda返回一个函数对象,所以命令选项得到了所需的东西。 尝试执行这两个语句 -

ttk.Button(frame, text='Delineate!', underline=0,
                 command=lambda v=cadelVar: self._delineate(v))