Python3 - 在不同数字系统之间进行转换的问题

时间:2016-05-01 11:32:30

标签: python python-3.x tkinter binary converter

我正在编写一个简单的程序来在基数10,2,8和16之间切换一个数字。但是我遇到了多次转换或转换回来的问题。这是我使用

的代码
#! 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()

正如您所看到的,想法是ent TK输入框中的数字会根据按下按钮而改变。到目前为止,它将从书房改为另一个系统,然后拒绝改变或再次工作。我将不胜感激任何帮助或建议。谢谢

2 个答案:

答案 0 :(得分:0)

请注意4行中缺乏对称性:

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))

在第一个中,没有命令,第二个是有意义的(但仍有问题),第三个和第四个缺少对第四个的int的调用。为什么不让所有4条线看起来更像第二条线?另外 - 请注意,如果int()为基数采用可选参数。也许你想对这个论点做些什么,涉及CurrentSystem。请注意,为此目的,CurrentSystem可能更好地保存诸如2,8,10或16之类的int而不是字符串。

最后,请注意,出于显示目的,您可能希望显示类似于100101而非0b100101的内容。为此,您可以使用切片运算符:if s = '0b100101'然后s[2:] = '100101'

答案 1 :(得分:0)

这包括两部分,从字符串到整数然后再返回。因此,为每个功能单元创建一个函数是个好主意。

将字符串转换为整数。

int('100', 8) == 8**2  # second argument is the base

将整数转换为字符串。

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'

然后在TK代码中使用这些功能。像这样:

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))