我想在cm,mm和km之间创建一个单位转换器。
我希望这些值随着用户在其中一个输入中输入而不断变化,例如,如果用户开始在“厘米”字段中键入内容,我想在他输入时显示毫米和公里。我是Python的新手。
这是我到目前为止尝试过的:
from tkinter import *
def get_option_value(unit):
if unit == 'Length':
length_frame.pack()
if unit == 'Tempratur':
print('Tempratur')
if unit == 'Area':
print('Area')
if unit == 'Volume':
print('Volume')
def convert_length(event, type):
if type == 'm':
print('do some stuff')
if type == 'cm':
print('do some stuff')
if type == 'km':
print('do some stuff')
window = Tk()
window.geometry('500x500')
window.resizable(0, 0)
t_frame = Frame(window, width=200, height=40)
b_frame = Frame(window, width=400, height=200)
t_frame.pack_propagate(0)
b_frame.pack_propagate(0)
t_frame.pack(padx=30, pady=10)
b_frame.pack(ipadx=20, ipady=20)
option_menu_label = Label(t_frame, text="Select Unit To Convert")
option_menu_label.pack()
options = ["Length", "Temprature", "Area", "Volume",]
default_value = StringVar()
default_value.set('Select Unit')
option_menu = OptionMenu(t_frame, default_value, *options, command=get_option_value)
option_menu.pack()
# Length Converter
length_frame = Frame(b_frame, width=50, height=50)
mm_label = Label(length_frame, text="Millimeters").grid(row=0)
mm = IntVar()
mm_entry = Entry(length_frame, textvariable=mm)
mm_entry.bind("<Key>", lambda event: convert_length(event, 'm'))
cm_label = Label(length_frame, text="Centimeters").grid(row=1, column=0)
cm = IntVar()
cm_entry = Entry(length_frame, textvariable=cm)
cm_entry.bind("<Key>", lambda event: convert_length(event, 'cm'))
km_label = Label(length_frame, text="Kilometers").grid(row=2, column=0)
km = IntVar()
km_entry = Entry(length_frame, textvariable=km)
km_entry.bind("<Key>", lambda event: convert_length(event, 'k'))
# convert_length_button = Button(length_frame, text="Convert Length", command=convert_length)
mm_entry.grid(row=0, column=1)
cm_entry.grid(row=1, column=1)
km_entry.grid(row=2, column=1)
# convert_length_button.grid(columnspan=2)
# Temprature Converter
c_label = Label(b_frame, text="Celsius")
c = StringVar()
c_entry = Entry(b_frame, textvariable=c)
window.mainloop()
我该如何实现?
答案 0 :(得分:1)
我重构了一些代码,这是一个解决方案
#validates the input
def is_number(s):
try:
float(s)
return True
except ValueError:
return False
def convert_length(unit, event=None):
if unit == 'm':
val = mm_entry.get()
if (is_number(val)):
mm = float(val)
cm = mm / 10
km = mm / 1000000
cm_entry.delete(0, END)
km_entry.delete(0, END)
cm_entry.insert(0, cm)
km_entry.insert(0, km)
else:
cm_entry.delete(0, END)
km_entry.delete(0, END)
if (val == ''):
cm_entry.insert(0, '')
km_entry.insert(0, '')
else:
cm_entry.insert(0, 'NaN')
km_entry.insert(0, 'NaN')
mm_label = Label(length_frame, text="Millimeters").grid(row=0)
mm_entry = Entry(length_frame)
mm_entry.bind("<KeyRelease>", lambda value : convert_length('m'))
对于您要完成的工作,建议您将"<KeyRelease>"
用作事件处理程序,而不要使用"<Key>"
。原因是insert()
小部件的delete()
和Entry()
函数被延迟了(是否有专门的术语?),从而为您提供先前输入的计算结果,如果您使用"<key>"
。 "<KeyRelease>"
将立即执行这些功能,使您可以查看条目小部件中的更改。
如果您想查看"<Key>"
和"<KeyRelease>"
的效果,只需切换它们即可。
只需对剩余的计算单位应用相同的逻辑和模式。