Python 2.7.3-32ビット(Windows))に問題があります。このコードを入力して、誰かがこのエラーを解決できるかどうかを確認します。コメントはスペイン語ですが、そうではありません。 tはコードに影響します。
import gtk
import numpy
import math
import os
#Pedimos el nombre de la imagen de origen
nombreFich = input("Por favor, introduzca el nombre de la imagen de origen:")
#Validar que existe el fichero
imagen1 = gtk.Image()
imagen1.set_from_file('C:\\Users\\xxx\\Desktop\\xxxx.png')
pb1 = imagen1.get_pixbuf()
pm1 = pb1.get_pixels_array()
#Hacemos una copia de la imagen
pm2 = pm1.copy()
#Validamos los puntos de distorsion hasta que sean validos
puntos = " "
arrayPuntos = " "
while(puntos == " " and len(arrayPuntos) < 4):
print"Por favor, introduzca los puntos de distorsión xc yc r e:"
puntos= raw_input()
arrayPuntos = puntos.split(" ")
#Sacamos los puntos separando la cadena por el caracter espacio
xc =(puntos[0])
yc =(puntos[1])
r =(puntos[2])
e =(puntos[3])
#función que calcula el grado de distorsión
def grado(self,z,e):
if(z>1):
return 1
Elif(e<0):
return (1/z)**(-e/(1-e))
else:
return z**e
#Distorsionamos la imagen
def distors(xc,yc,r,e,x,y):
d = math.sqrt(x**2+y**2)#Sacamos la distancia
z = d/r
if(z!=0):
g=grado(z,e)
xm=x*g
ym=y*g
return xm,ym
else:
xm=x
ym=y
return xm,ym
def recorrido (pm1, xc, yc, r, e):
pm2 = pm1.copy()
x= str(--r)
y= str(--r)
while (y <= r):
while (x <= r):
xm, ym = mover(xc, yc, r, e, x, y)
pm2[yc+y][xc+x] = pm1[yc+ym][xc+xm]
x = x+1
y= y+1
x= -r
return pm2
pm2 = recorrido(pm1, xc, yc, r, e)
#Guardamos los cambios
pb2 = gtk.gdk.pixbuf_new_from_array(pm2,pb1.get_colorspace(),pb1.get_bits_per_sample())
nomfich2 = nombreFich+"_copia"
ext = os.path.splitext("C:\\Users\xxx\Desktop\xxxx.png_copia")[1][1:].lower()
pb2.save("C:\\Users\xxx\Desktop\xxxx.png_copia",ext)
print"FINISH"
pythonコードを実行すると、次のエラーが発生します。
Traceback (most recent call last):
File "F:\Dropbox\Práctica Pitón\Práctica3.0.py", line 71, in <module>
pm2 = recorrido(pm1, xc, yc, r, e)
File "F:\Dropbox\Práctica Pitón\Práctica3.0.py", line 59, in recorrido
x= str(--r)
TypeError: bad operand type for unary -: 'str'
エラーメッセージは、r
が文字列であることを示しています。文字列を否定することはできません。
なぜ文字列なのですか?まあ、それはここから来ているようです:
# ...
puntos= raw_input()
arrayPuntos = puntos.split(" ")
# ...
r =(puntos[2])
文字列のsplit
メソッドは、文字列のリストを返します。
では、これをどのように解決しますか?たとえば、r
が文字列「22」の場合、float(r)
は浮動小数点数22.0
であり、int(r)
は整数22
です。それらの1つはおそらくあなたが望むものです。
たとえば、r=int(r)
を追加すると、--r
も例外ではなくなります。
しかし、それはおそらくあなたが望むものではありません。 Pythonでは、--r
は、r
の否定の否定を意味します。つまり、-(-(r))
と同じで、r
です。おそらく、変数をデクリメントして新しい値を返すCプレフィックスoperator--
に相当するものを探しています。 Pythonにはそのような演算子はありません。実際、変数を変更してから値を返す演算子はありません。
これはより大きな問題の一部です。 Pythonは、混乱を避けるために、ステートメントと式をできるだけ区別するように設計されています。Cは、入力を節約するために、できるだけ多くの式を作成するように設計されています。したがって、多くの場合、 1行ずつ他の行に翻訳します。
この場合、Thanasis Petsasが示すように、2つのステップでそれを行う必要があります。
r -= 1
x = str(r)
インクリメント++
およびデクリメント--
演算子はPythonではサポートされていません。代わりにこれを使用できます:
r -= 1
x = str(r)