Lo que pasa es que incurriste en varias malas practicas. Pero por ahora solo apuntare a una.
Vamos a ver la definición de la función.
Código Python:
Ver originaldef Agregar():
archivo = open("/home/b0nete/Documents/Ninja-IDE/Listado/personasFILE.csv", "a") #a = APPEND
archivo.write(txtNombre.get() +","+ txtApellido.get() + "\n")
archivo.close()
Como puedes ver, ¿Donde esta definido txtApellido y txtNombre? No esta dentro de tu función esto hace que tu funcion este fuertemente ligada a donde quiera que estén txtApellido y txtNombre.
¿Como hacer esto un poco mas reusable?
Código Python:
Ver originaldef Agregar(nombre, apellido):
archivo = open("/home/b0nete/Documents/Ninja-IDE/Listado/personasFILE.csv", "a") #a = APPEND
archivo.write(nombre +","+ apellido + "\n")
archivo.close()
Mira que ahora nombre y apellido si estan definidas en la función porque son parámetros que estas esperando. Mas aun, estas esperando solamente el string nada de objetos secundarios que esperas que tengan el método get. Tampoco te importa de donde vengan, tal vez vienen de cajitas de texto o de string hardcodeadas, de un raw_input, de un archivo, realmente no importa de donde lo saques, solo sabes que quieres 2 strings y punto.
El error que te marca
Código:
NameError: global name 'txtNombre' is not defined
Es porque cuando llega a la parte de
archivo.write(txtNombre.get() +","+ txtApellido.get() + "\n")
txtNombre no se encuentra definido.
Mi recomendaciones:
1. No copies y pegues código sin leerlo.
2. Haz tus funciones reusables.