2016-05-01 14 views
0

Ich schreibe ein einfaches Programm, um eine Zahl zwischen Basis 10, 2, 8 und 16 zu wechseln. Allerdings habe ich Probleme mit mehreren Konvertierungen oder Konvertierung zurück zu denary. Hier ist der Code ich verwendePython3 - Probleme mit der Konvertierung zwischen verschiedenen Zahlensystemen

#! python3 

import tkinter as tk 
from tkinter import ttk 

CurrentSystem = 'd' 

def clearEnt(): 
    ent.delete(0, last = None) 

def baseConverter(value,base): 
    try: 
     if base == 2: 
      clearEnt() 
      ent.insert(0, bin(value)) 
      CurrentSystem = 'b' 
     if base == 8: 
      clearEnt() 
      ent.insert(0, oct(value)) 
      CurrentSystem == 'o' 
     if base == 16: 
      clearEnt() 
      ent.insert(0, hex(value)) 
      CurrentSystem == 'h' 
     if base == 10: 
      if CurrentSystem == 'b': 
       clearEnt() 
       ent.insert(0, int(value, 2)) 
      if CurrentSystem == 'o': 
       clearEnt() 
       ent.insert(0, int(value, 8)) 
      if CurrentSystem == 'h': 
       clearEnt() 
       ent.insert(0, int(value, 16)) 
    except ValueError: 
     clearEnt() 
     ent.insert(0, 'ERROR') 

root = tk.Tk() 
root.title('Number Converter') 

ent = ttk.Entry() 
ent.grid (row = 0, column = 1, columnspan = 2, padx = 5) 

button1 = ttk.Button(root, text = "Den") 
button2 = ttk.Button(root, text = "Bin", command = lambda:baseConverter(int(ent.get()), 2)) 
button3 = ttk.Button(root, text = "Oct", command = lambda:baseConverter(ent.get(), 8)) 
button4 = ttk.Button(root, text = "Hex", command = lambda:baseConverter(ent.get(), 16)) 

button1.grid(row = 1, column = 0) 
button2.grid(row = 1, column = 1) 
button3.grid(row = 1, column = 2) 
button4.grid(row = 1, column = 3) 

root.mainloop() 

Wie Sie sehen können, ist die Idee, dass die Zahl in den ent TK-Eingabefeld ändert sich basierend auf den Knopf drücken. Bis jetzt wird es von der Höhle zu einem anderen System wechseln und sich dann weigern, sich zu ändern oder wieder zu arbeiten. Ich würde mich über jede Hilfe oder Beratung zu diesem Thema freuen. Danke

+0

Machen Sie Ihren Code modular. Vergessen Sie den Tkinter für eine Weile komplett und konzentrieren Sie sich nur darauf, die Konvertierungsfunktion oder Funktionen richtig zu machen. Dann - rufe sie in deinen Event-Handlern auf. Welche Probleme haben Sie mit der Umstellung selbst? –

+0

Beim Ausführen mit Python3.4 gibt es ständig Fehlermeldungen wie: ent.insert (0, okt (Wert)) TypeError: 'str' Objekt kann nicht als eine ganze Zahl interpretiert werden. Höchstwahrscheinlich besteht das Problem darin, dass die Werte als Strings dargestellt werden und Ihre oct/hex-Befehle fehlschlagen. –

+3

Um meinen letzten Kommentar zu erweitern, wäre es eine gute Strategie, eine Python-Funktion 'changeBase (s, a, b)' zu schreiben, die eine * string * 's', eine int' a', die die aktuelle Basis von 's' und ein int' b', das die Zielbasis darstellt und eine Zeichenfolge zurückgibt, die die Zahl in der Zielbasis darstellt. Holen Sie sich das, so dass es einwandfrei in der Shell läuft (vielleicht schreiben Sie ein Testskript dafür, das alle 4x4 = 16 gültige Fälle testet) und sich dann sorgen, wie man es in tkinter einbindet –

Antwort

0

Hinweis des Mangel an Symmetrie in den vier Linien:

button1 = ttk.Button(root, text = "Den") 
button2 = ttk.Button(root, text = "Bin", command = lambda:baseConverter(int(ent.get()), 2)) 
button3 = ttk.Button(root, text = "Oct", command = lambda:baseConverter(ent.get(), 8)) 
button4 = ttk.Button(root, text = "Hex", command = lambda:baseConverter(ent.get(), 16)) 

Im ersten gibt es keinen Befehl ist, macht die zweite Sinn (aber immer noch ein Problem) und die dritten und vierten fehlt der Anruf an int, die in der vierten ist. Warum nicht alle 4 Zeilen mehr wie die zweite Zeile aussehen lassen? Beachten Sie auch, dass int() ein optionales Argument für die Basis verwendet. Vielleicht möchten Sie etwas mit diesem Argument tun, etwas, das CurrentSystem beinhaltet. Beachten Sie, dass es für diesen Zweck besser sein könnte, für CurrentSystem einen int wie 2,8,10 oder 16 statt einer Zeichenfolge zu halten.

Beachten Sie, dass Sie zu Anzeigezwecken möglicherweise etwas anzeigen möchten, das wie 100101 statt 0b100101 aussieht. Dazu können Sie einen Slice-Operator verwenden: if s = '0b100101' dann s[2:] = '100101'

+0

Ich habe den Unterschied zwischen Button 2 und 3/4 komplett verpasst . Ich habe diese Änderung vorgenommen. Ich habe ehrlich gesagt keine Ahnung, was ich für die erste Taste tun soll, obwohl –

+0

Sie wahrscheinlich durch das Fehlen einer Basis-10-Version von "bin, oct, hex" verwirrt sind. Verwenden Sie einfach 'str()' in diesem Fall. Base-10 ist die * default * Zeichenfolgendarstellung eines 'int'. Sie müssen nichts Besonderes tun. Beachten Sie auch, dass 'int (" 123 ", 10) = 123)'. Das Geben der Basis (10) ist nicht notwendig - aber es schadet auch nichts. –

+0

Was passiert, wenn ich zu einem System konvertiere und möchte, dass es zurück in die Höhle geht? Ich werde Radiobuttons hinzufügen, um das aktuelle Zahlensystem anzuzeigen, das vom Wert im Eintrag –

0

Dieser besteht aus zwei Teilen, die von einer Zeichenkette zu einer Ganzzahl und wieder zurück gehen. Es ist also eine gute Idee, eine Funktion für jede Funktionseinheit zu erstellen.

Konvertieren einer Zeichenfolge in eine ganze Zahl.

Konvertieren Sie eine Ganzzahl in eine Zeichenfolge.

def int_to_str(number, base): 
    assert isinstance(number, int) 
    char = {2:'b', 8:'o', 10:'d', 16:'x'}[base] 
    return '{0:{1}}'.format(number, char) 

int_to_str(8**2, 8) == '100' 

Dann verwenden Sie diese Funktionen in Ihrem TK-Code. Etwas wie dieses:

button1 = ttk.Button(root, text="Dec", command=lambda:int(ent.get(), 10)) 
button2 = ttk.Button(root, text="Bin", command=lambda:int(ent.get(), 2)) 
button3 = ttk.Button(root, text="Oct", command=lambda:int(ent.get(), 8)) 
button4 = ttk.Button(root, text="Hex", command=lambda:int(ent.get(), 16)) 
+0

Was Sie sagen, ist, dass ich die erste Zeile als Lambdas benutze und sie dann durch die Funktion vor dem Drucken setzen? –

+0

Aus der Eingabebox erhalten Sie eine Zeichenfolge. Um dies in eine ganze Zahl zu konvertieren, müssen Sie die Basis kennen. Ihr Code zeigt an, dass die Benutzer Ihnen die Basis mitteilen, indem Sie die entsprechende Schaltfläche drücken. Daher verwenden Sie die "int" -Funktion und übergeben sie sowohl die Eingabezeichenfolge als auch die Basis, um die tatsächliche Ganzzahl zu erhalten, die die Benutzer wünschen. Um die Basis für die Ausgabe der Nummer zu erhalten, benötigen Sie eine dritte Information aus z. ein TK Radiobutton. Dann rufen Sie den 'int_to_str' mit der zu konvertierenden Ganzzahl (Ergebnis von' int' vorher) und der Ausgabebasis auf und zeigen dem Benutzer die resultierende Zeichenkette an. – Alvra