最近我开始玩Python,我遇到了一些特殊的闭包方式.请考虑以下代码:
adders=[0,1,2,3]
for i in [0,1,2,3]:
adders[i]=lambda a: i+a
print adders[1](3)
Run Code Online (Sandbox Code Playgroud)
它构建了一个简单的函数数组,它接受单个输入并返回由数字添加的输入.函数在for循环中构造,迭代器i从中循环0到3.对于这些数字中的每一个,lambda都会创建一个函数i,该函数捕获并将其添加到函数的输入中.最后一行将第二个lambda函数3作为参数调用.令我惊讶的是输出结果是6.
我期待一个4.我的理由是:在Python中,一切都是一个对象,因此每个变量都是指向它的指针.在创建lambda闭包时i,我希望它存储一个指向当前指向的整数对象的指针i.这意味着当i分配一个新的整数对象时,它不应该影响先前创建的闭包.遗憾的是,adders在调试器中检查数组表明它确实存在.所有的lambda功能指的最后一个值i,3,这将导致adders[1](3)返回6.
这让我想知道以下内容:
lambda函数以更改其值i时不会受到影响的方式捕获当前i值?Python函数可以作为另一个函数的参数吗?
说:
def myfunc(anotherfunc, extraArgs):
# run anotherfunc and also pass the values from extraArgs to it
pass
Run Code Online (Sandbox Code Playgroud)
所以这基本上是两个问题:
BTW,extraArgs是anotherfunc参数的列表/元组.
如何将参数绑定到Python方法以存储一个用于以后调用的nullary仿函数?与C++类似boost::bind.
例如:
def add(x, y):
return x + y
add_5 = magic_function(add, 5)
assert add_5(3) == 8
Run Code Online (Sandbox Code Playgroud) 我的代码是:
from Tkinter import *
admin = Tk()
def button(an):
print an
print 'het'
b = Button(admin, text='as', command=button('hey'))
b.pack()
mainloop()
Run Code Online (Sandbox Code Playgroud)
按钮不起作用,在没有我的命令的情况下打印'hey'和'het'一次,然后,当我按下按钮时没有任何反应.
我试图在for循环中创建tkinter中的按钮.并且每个循环都将i count值作为参数传递给命令值.因此,当从命令值调用函数时,我可以判断按下了哪个按钮并相应地执行操作.问题是,假设len为3,它将创建3个按钮,标题为"Game 1"到"Game 3",但是当按下任何按钮时,打印值总是2,即最后一次迭代.因此看起来按钮是作为单独的实体制作的,但命令参数中的i值似乎完全相同.这是代码:
def createGameURLs(self):
self.button = []
for i in range(3):
self.button.append(Button(self, text='Game '+str(i+1),command=lambda:self.open_this(i)))
self.button[i].grid(column=4, row=i+1, sticky=W)
def open_this(self, myNum):
print(myNum)
Run Code Online (Sandbox Code Playgroud)
有没有办法在每次迭代时获得当前的i值以坚持使用该特定按钮?
我有两个按钮,分别命名为'ButtonA','ButtonB'.如果点击任何按钮,我希望程序打印'hello,ButtonA'和'hello,ButtonB'.我的代码如下:
def sayHi(name):
print 'hello,', name
root = Tk()
btna = Button(root, text = 'ButtonA', command = lambda: text)
btna.pack()
Run Code Online (Sandbox Code Playgroud)
当我单击ButtonA时,会发生错误,text not defined.
我理解这个错误,但是如何将ButtonA的文本传递给lambda?
我正在尝试创建一个使用此 lambda 函数单击的按钮列表:
button1.config(command=(lambda x: (clicked.append(x)))(button1.cget("text")))
Run Code Online (Sandbox Code Playgroud)
它似乎有点工作,但它立即打印按钮文本,即它不等待用户单击按钮。
关于如何使其响应按钮点击有什么想法吗?
class GraphicsInterface:
def __init__(self):
self.window = Tk()
self.window.geometry("720x500")
clicked=[]
button1 = Button(self.window, text="Dice 1", width=13)
button1.place(x=60, y=160)
button1.config(command=(lambda x: (clicked.append(x)))(button1.cget("text")))
print(clicked)
Run Code Online (Sandbox Code Playgroud) 我需要在 Python 2.7 中使用 Tkinter 创建按钮表,它有n行和n列,右下角没有按钮。
问题是,当我按下按钮时,在它的位置上,我需要创建可用空间并将该按钮移动到之前为空的空间,但我不能这样做,因为我不知道如何获取网格(x 轴和 y 轴) ) 按下按钮的信息以使用它来创建可用空间。
这是我当前的代码:
from Tkinter import *
#Input:
n=int(raw_input("Input whole positive number: "))
L = range(1,n+1)
k = n
m = n
#Program:
root = Tk()
for i in L:
for j in L:
frame = Frame(root)
frame.grid(row = i, column = j)
if j == k and i == m:
pass
else:
button = Button(frame)
button.grid(row = i, column = j)
root.mainloop()
Run Code Online (Sandbox Code Playgroud)
这将是这样的,我想获得按钮网格位置,并使用它来更改k和 …
我一直在阅读有关Tkinter中浏览按钮问题的几篇帖子,但我找不到答案.
所以我编写了这段代码,以便在单击"浏览"按钮时获取目录路径,并在输入字段中显示此路径.它的部分内容是:当我运行脚本时,会直接弹出一个文件浏览器窗口.我确实在输入字段中获取了路径但是如果我想要使用我的浏览按钮更改文件夹它不起作用.
我不想让浏览器从一开始就弹出,但只有当我点击浏览时!谢谢你的回答
from Tkinter import *
from tkFileDialog import askdirectory
window = Tk() # user input window
MyText= StringVar()
def DisplayDir(Var):
feedback = askdirectory()
Var.set(feedback)
Button(window, text='Browse', command=DisplayDir(MyText)).pack()
Entry(window, textvariable = MyText).pack()
Button(window, text='OK', command=window.destroy).pack()
mainloop()
Run Code Online (Sandbox Code Playgroud) 我用tkinkerin 编写了一个脚本python.当我运行脚本时,它会收到一个输入并将其打印到控制台.它工作得很好.
我想要做的是以这样的方式向现有脚本添加任何功能,以便在填写inputbox按下get按钮后,它将在控制台中打印值并自动退出.我的现有脚本再一次能够打印值.我需要在打印完成后立即退出该按钮.任何有关这方面的帮助将受到高度赞赏.
这是我到目前为止所尝试的:
from tkinter import *
master = Tk()
e = Entry(master)
e.pack()
e.focus_set()
callback = lambda : get_val(e.get())
get_val = lambda item: print(item) #this extra function is for further usage
Button(master, text="get", width=10, command=callback).pack()
master.mainloop()
Run Code Online (Sandbox Code Playgroud)
这是inputbox看起来像:
我有一个简单的 Tkinter gui,上面有大约 20 个按钮。当我单击一个按钮时,脚本会运行大约 5 分钟。在此期间,我必须等到脚本停止运行才能单击其他按钮。有没有办法设置窗口,以便我可以在第一个单击的脚本运行时单击其他按钮?
from Tkinter import *
import Tkinter as tk
import time
def function1():
time.sleep(60)
print 'function1'
def function2():
time.sleep(60)
print 'function2'
root = Tk()
w = 450 # width for the Tk root
h = 500# height for the Tk root
frame = Frame(root, width=w,height =h)
button1=Button(frame, text = 'function 1',fg='black',command=function1).grid(row=1,column=1)
button2=Button(frame, text = 'function 2',fg='black',command=function2).grid(row=1,column=2)
frame.pack()
root.mainloop()
Run Code Online (Sandbox Code Playgroud)
我希望能够在仍在运行function2后点击function1