【问题标题】:Passing args when passing a function reference [duplicate]传递函数引用时传递 args [重复]
【发布时间】:2017-08-06 12:58:55
【问题描述】:
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)?一般来说,这是如何工作的?

【问题讨论】:

  • 如果不是默认值,x 和 y 是从哪里来的?
  • 你不能在不运行的情况下将值传递给函数。在这个设计中你可以做的是设置一些全局变量并让函数使用这些变量而不是参数,但这并不完全是优雅的设计。通常在 GUI 中,您会将 x 和 y 值输入到输入小部件(文本框或旋转框)中并从中读取绘图函数。

标签: python function python-3.x tkinter


【解决方案1】:

使用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。一直在部分工作。

另外,如果您想避免以后出现错误,请不要将布局(包、网格或位置)与初始化放在同一行。

【讨论】:

  • 只有在创建Button 小部件时知道参数的值时,像这样使用partial 才有效。如果是这种情况,OP 也可以使用默认参数值(如他们问题中的代码所示)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多