7

Windows で Python 2.7.3-32 ビットに問題があります。誰かがこのエラーで私を助けてくれるかどうかを確認するために、このコードを入れました。コメントはスペイン語ですが、コードには影響しません。

 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'
4

2 に答える 2

7

エラーメッセージは、それrが文字列であることを示しています。文字列を否定することはできません。

なんで文字列なの?さて、それはここから来ているようです:

# ...
puntos= raw_input()
arrayPuntos = puntos.split(" ")
# ...
r =(puntos[2])

文字列に対するsplitメソッドは、文字列のリストを返します。

それで、あなたはこれをどのように解決しますか?rたとえば、 が文字列 "22" の場合、はfloat(r)float 22.0int(r)は integer22です。それらの1つはおそらくあなたが望むものです。

たとえば、 を追加するとr=int(r)、あなた--rはもはや例外ではなくなります。


しかし、それはおそらくあなたが望むものではありません。Python では、--rjust は の否定の否定を意味しrます — つまり、 と同じ-(-(r))ですr--おそらく、変数をデクリメントして新しい値を返すC のプレフィックス operator に相当するものを探しているでしょう。Python にはそのような演算子はありません。実際、変数を変更してから値を返す演算子はありません。

これはより大きな問題の一部です。Python は、混乱を避けるために、ステートメントと式をできるだけ区別するように設計されています。C は、タイピングを節約するために、できるだけ多くの式を作成するように設計されています。そのため、多くの場合、行ごとに一方を他方に翻訳することはできません。

この場合、Thanasis Petsas が示すように、2 つのステップでそれを行う必要があります。

r -= 1
x = str(r)
于 2013-04-05T23:41:36.703 に答える
3

インクリメント++およびデクリメント--演算子は、Python ではサポートされていません。代わりにこれを使用できます:

r -= 1
x = str(r)
于 2013-04-05T23:33:55.657 に答える