¿Cómo puedo usar la salida de tkFileDialog.askdirectory para llenar un cuadro de entrada tkinter

Tengo un cuadro de entrada tkinter en el que el usuario puede insertar una ruta al directorio. Alternativamente, el usuario puede hacer clic en un botón para seleccionar el directorio. ¿Cómo puedo configurar la salida del botón para llenar el cuadro de entrada? He intentado lo siguiente, pero dirname no es una variable global y, por lo tanto, UserFileInput no lo reconoce. También cómo puedo enlazar el botón al lado del campo de entrada.

 from Tkinter import * import tkFileDialog def askdirectory(): dirname = tkFileDialog.askdirectory() return dirname def UserFileInput(status,name): optionFrame = Frame(root) optionLabel = Label(optionFrame) optionLabel["text"] = name optionLabel.pack(side=LEFT) text = str(dirname) if dirname else status var = StringVar(root) var.set(text) w = Entry(optionFrame, textvariable= var) w.pack(side = LEFT) optionFrame.pack() return w if __name__ == '__main__': root = Tk() dirBut = Button(root, text='askdirectory', command = askdirectory) dirBut.pack(side = RIGHT) directory = UserFileInput("", "Directory") root.mainloop() 

Su UserFileInput debe devolver var , no w . Luego, puede usar var.set(dirname) en su función askdirectory , que no tiene que devolver nada.

Sin embargo, no estoy seguro de lo que intentas lograr con text = str(dirname) if dirname else status . ¿Por qué no usar text = status ya que dirname aún no se puede definir allí?

Editar: Esto debería funcionar de la manera que quieras. El botón ‘imprimir texto de entrada’ muestra que puede recuperar lo que esté en el cuadro de entrada, ya sea escrito por el usuario o puesto allí por el código.

 from Tkinter import * import tkFileDialog def askdirectory(): dirname = tkFileDialog.askdirectory() if dirname: var.set(dirname) def UserFileInput(status,name): optionFrame = Frame(root) optionLabel = Label(optionFrame) optionLabel["text"] = name optionLabel.pack(side=LEFT) text = status var = StringVar(root) var.set(text) w = Entry(optionFrame, textvariable= var) w.pack(side = LEFT) optionFrame.pack() return w, var def Print_entry(): print var.get() if __name__ == '__main__': root = Tk() dirBut = Button(root, text='askdirectory', command = askdirectory) dirBut.pack(side = RIGHT) getBut = Button(root, text='print entry text', command = Print_entry) getBut.pack(side = BOTTOM) w, var = UserFileInput("", "Directory") root.mainloop()