2013-05-24 31 views
7

Per una GUI tkinter, è necessario leggere un indirizzo esadecimale sotto forma di "0x00" per impostare un indirizzo I2C. Il modo Attualmente sto facendo è leggendo l'ingresso come stringa, convertendo la stringa in un intero, quindi la conversione che integer a un valore effettivo Hex come illustrato nel codice parziale di seguito:Convertire un numero intero in un valore esadecimale a 2 byte in Python

inizializzazione GUI:

self.I2CAddress=StringVar() 
self.I2CAddress.set("0x00") #Sets Default value of '0x00' 
Label(frame, text="Address: ").grid(row=5, column=4) 
Entry(frame, textvariable=self.I2CAddress).grid(row=5, column=5) 

Poi all'interno della funzione:

addr = self.I2CAddress.get() 
addrint = int(addr, 16) 
addrhex = hex(addrint) 

Questo funziona per la maggior parte dei valori, ma il mio problema è che se entro in un piccolo valore stringa esadecimale come '0x01', converte al corretto intero di 1, ma poi viene convertito in un valore esadecimale di 0x1 anziché 0x01.

Sono un EE e ho un'esperienza di programmazione molto limitata, quindi qualsiasi aiuto è molto apprezzato.

risposta

13

Utilizza la format() function:

format(addrint, '#04x') 

Questo formatta il valore di ingresso come stringa esadecimale 2 cifre con zeri per rendere la lunghezza, e # include il 'prefisso standard', 0x in questo caso. Si noti che la larghezza di 4 include quel prefisso. x produce stringhe esadecimali in lettere minuscole; usa X se hai bisogno di lettere maiuscole.

Demo:

>>> for i in range(8, 12): 
...  print format(i, '#04x') 
... 
0x08 
0x09 
0x0a 
0x0b 
+0

Grazie! Ha funzionato come un incantesimo, lo apprezzo molto. –

+0

Hai risposto così velocemente che devo aspettare qualche minuto prima di consentirmi, ma io assolutamente lo farò –

+0

Puoi semplicemente usare '{: # 02x}' invece dell'esplicativo '0x'. Il '# aggiungerà il" prefisso standard ", che per i numeri esadecimali è' 0x'. (Anche questo funziona allo stesso modo con% -formatting e C 'printf', POSIX command-line' printf', ecc.) – abarnert

Problemi correlati