我正在编写一个简单的程序来在基数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输入框中的数字会根据按下按钮而改变。到目前为止,它将从书房改为另一个系统,然后拒绝改变或再次工作。我将不胜感激任何帮助或建议。谢谢
答案 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))