AttributeError: 'float' - Objekt hat kein Attribut 'center'
Ich bin nur zu lernen, Python, und ich kann nicht herausfinden, wie zu lösen, ist ein Fehler. Der Python-code weiter unten schreibt einige Nachrichten auf dem Raspberry Pi 16x2-Bildschirm. Auf der 3. Satz von Nachrichten #AVG SPEED, wenn ich drucken print avgspeed
es funktioniert einwandfrei, aber wenn ich die Ausgabe auf den Bildschirm bekomme ich diesen Fehler AttributeError: 'float' object has no attribute 'center'
import RPi.GPIO as GPIO
import time
from time import sleep
import socket
import fcntl
import struct
from pycgminer import CgminerAPI
LCD_RS = 25
LCD_E = 24
LCD_D4 = 23
LCD_D5 = 17
LCD_D6 = 18
LCD_D7 = 22
LCD_WIDTH = 16
LCD_CHR = True
LCD_CMD = False
LCD_LINE_1 = 0x80
LCD_LINE_2 = 0xC0
E_PULSE = 0.00005
E_DELAY = 0.00005
def main():
GPIO.setmode(GPIO.BCM)
GPIO.setup(LCD_E, GPIO.OUT)
GPIO.setup(LCD_RS, GPIO.OUT)
GPIO.setup(LCD_D4, GPIO.OUT)
GPIO.setup(LCD_D5, GPIO.OUT)
GPIO.setup(LCD_D6, GPIO.OUT)
GPIO.setup(LCD_D7, GPIO.OUT)
lcd_init()
#UNIT
lcd_byte(LCD_LINE_1, LCD_CMD)
lcd_string("UNIT 1",2)
lcd_byte(LCD_LINE_2, LCD_CMD)
lcd_string("MODEL BETA",2)
sleep(5)
#CLEAR
lcd_byte(LCD_LINE_1, LCD_CMD)
lcd_string("",2)
lcd_byte(LCD_LINE_2, LCD_CMD)
lcd_string("",2)
sleep(0.4)
#IP ADDRESS
pi_ip = get_ip_address('eth0')
lcd_byte(LCD_LINE_1, LCD_CMD)
lcd_string("IP Address",2)
lcd_byte(LCD_LINE_2, LCD_CMD)
lcd_string(pi_ip,2)
sleep(5)
#CLEAR
lcd_byte(LCD_LINE_1, LCD_CMD)
lcd_string("",2)
lcd_byte(LCD_LINE_2, LCD_CMD)
lcd_string("",2)
sleep(0.4)
# AVG SPEED
cgminer = CgminerAPI()
summary = cgminer.summary()
avgspeed = avg_speed()
lcd_byte(LCD_LINE_1, LCD_CMD)
lcd_string("Avg. Speed",2)
lcd_byte(LCD_LINE_2, LCD_CMD)
lcd_string(avgspeed,2)
sleep(5)
#CLEAR
lcd_byte(LCD_LINE_1, LCD_CMD)
lcd_string("",2)
lcd_byte(LCD_LINE_2, LCD_CMD)
lcd_string("",2)
sleep(0.4)
def get_ip_address(ifname):
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
return socket.inet_ntoa(fcntl.ioctl(
s.fileno(),
0x8915, # SIOCGIFADDR
struct.pack('256s', ifname[:15])
)[20:24])
def avg_speed():
cgminer = CgminerAPI()
summary = cgminer.summary()
avg_speed_value = cgminer.command('summary')['SUMMARY'][0]['MHS av']
return avg_speed_value
def lcd_init():
lcd_byte(0x33,LCD_CMD)
lcd_byte(0x32,LCD_CMD)
lcd_byte(0x28,LCD_CMD)
lcd_byte(0x0C,LCD_CMD)
lcd_byte(0x06,LCD_CMD)
lcd_byte(0x01,LCD_CMD)
def lcd_string(message,style):
if style==1:
message = message.ljust(LCD_WIDTH," ")
elif style==2:
message = message.center(LCD_WIDTH," ")
elif style==3:
message = message.rjust(LCD_WIDTH," ")
for i in range(LCD_WIDTH):
lcd_byte(ord(message[i]),LCD_CHR)
def lcd_byte(bits, mode):
GPIO.output(LCD_RS, mode)
GPIO.output(LCD_D4, False)
GPIO.output(LCD_D5, False)
GPIO.output(LCD_D6, False)
GPIO.output(LCD_D7, False)
if bits&0x10==0x10:
GPIO.output(LCD_D4, True)
if bits&0x20==0x20:
GPIO.output(LCD_D5, True)
if bits&0x40==0x40:
GPIO.output(LCD_D6, True)
if bits&0x80==0x80:
GPIO.output(LCD_D7, True)
time.sleep(E_DELAY)
GPIO.output(LCD_E, True)
time.sleep(E_PULSE)
GPIO.output(LCD_E, False)
time.sleep(E_DELAY)
GPIO.output(LCD_D4, False)
GPIO.output(LCD_D5, False)
GPIO.output(LCD_D6, False)
GPIO.output(LCD_D7, False)
if bits&0x01==0x01:
GPIO.output(LCD_D4, True)
if bits&0x02==0x02:
GPIO.output(LCD_D5, True)
if bits&0x04==0x04:
GPIO.output(LCD_D6, True)
if bits&0x08==0x08:
GPIO.output(LCD_D7, True)
time.sleep(E_DELAY)
GPIO.output(LCD_E, True)
time.sleep(E_PULSE)
GPIO.output(LCD_E, False)
time.sleep(E_DELAY)
if __name__ == '__main__':
main()
Traceback:
Traceback (most recent call last):
File "screen.py", line 165, in <module>
main()
File "screen.py", line 81, in main
lcd_string(avgspeed,2)
File "screen.py", line 117, in lcd_string
message = message.center(LCD_WIDTH," ")
AttributeError: 'float' object has no attribute 'center'
Kann mir jemand helfen mit diesem?
Dank
Poste bitte die ganze Ausnahme-und traceback-statt nur versuchen, zu beschreiben, wo der Fehler passiert.
Post geändert mit traceback Antwort. Dank
Post geändert mit traceback Antwort. Dank
InformationsquelleAutor Andrei | 2013-12-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eindeutig an einem gewissen Punkt, die Sie aufrufen
lcd_string
mit etwas, das nicht einen string, sondern ein float. Also, wenn es das tut:... das schlägt fehl, weil
float
Objekte haben keinecenter
Methode.Die Tatsache, dass es andernfalls in der
center
Fall heißt es muss einer der Orte, wo Sie anrufenlcd_string(<something>, 2)
. Meine erste Vermutung wärelcd_string(avgspeed,2)
, weilavgspeed
sicher, dass wie etwas klingt, das wäre ein float statt eines Strings.(Jetzt, du hast geschrieben das traceback, es sagt Ihnen direkt, was ich hatte, zu erraten. Die Zeile, die fehlschlägt, ist genau die, die ich sagte, es wäre, und die Linie, dass heißt es ist genau der, den ich vermutet anrufen würde. Und das ist, warum Sie sollten immer Blick auf die tracebacks, und fügen Sie Sie zu Ihren Fragen—sonst hast du den code Scannen und erraten.)
Der Grund, es scheint zu funktionieren, wenn Sie, ersetzen Sie, dass mit nur
print message
ist, dass dieprint
Befehl automatisch stringifies seine Argumente, so dass selbst wenn Sie es übergebenfloat
, druckt es aus, dassfloat
.Wenn Sie möchten, dass Ihre
lcd_string
- Funktion zu arbeiten, die gleiche Weise, die Sie tun können, ziemlich einfach durch hinzufügen einer Zeile am Anfang:Alternativ ändern Sie Ihren code so nie nennen
lcd_string
mit etwas anderes. Also:... oder, wenn Sie möchten mehr Kontrolle über die Formatierung, so etwas wie dieses:
Da alle Entwickler, die gebunden ist, um die Schraube, die sich manchmal (zumindest ich würde, und Sie sicherlich auch), und Sie haben eine harte Zeit, debugging diese screwups sich selbst, möchten Sie vielleicht fügen Sie eine Zeile am Anfang der Funktion zu geben, Sie besser zu Fehlermeldungen, wie:
align = {1: '<', 2: '^', 3: '>'}[style]; return '{:{}{}}'.format(message, align, LCD_WIDTH)
aber es hängt davon ab, ob das erlaubt sein sollte oder nicht... Auch nur die änderung der lookupstr.ljust, str.center and str.rjust
wäre gut, wenn...Ja, das wäre eine schöne Verbesserung der Lesbarkeit... obwohl, warum haben sogar die API
1
,2
oder3
in den ersten Platz? Das ist mehr eine Lesbarkeit problem als die elif-Kette in der Umsetzung. Jedenfalls, gegeben, die er zu haben scheint, kopieren-einfügen dieser code von woanders, ich bin mir nicht sicher, wie viel Stil Führung Wert ist...Gibt es eine Möglichkeit, ich kann loop diejenigen Nachrichten, die für eine unbegrenzte Zeit? #EINHEIT #KLAR #IP-ADRESSE #KLAR #AVG SPEED #DEAKTIVIEREN --> LOOP
Ich bin mir nicht sicher, was du meinst, aber (a) das klingt wie eine völlig separate Frage, dass Sie sollten post getrennt, und (b) Sie sind gerade auf der Suche nach einem
while True:
irgendwo inmain
mit den meisten der Mut dermain
eingerückt darunter? (Wenn Sie nicht wissen, was das bedeutet, finden Sie unter tutorial.)InformationsquelleAutor abarnert
lcd_string
es erfordert, wird der erste parameter einstring
Check out this post:
lcd-Modul raspberry pi
LCD_STRING
im OP-code, der in dem verlinkten blog-post, oder in den zugrunde liegenden API. Ich finden Sie einelcd_string
, aber es ist eine Funktion, die OP definiert sich selbst, also kann er machen was er will.InformationsquelleAutor sanjeev mk