一、我的需求
我们在生活中时常会遇到需要进行单位转换的问题,而有时却无法想起单位的转换倍率,造成一些不方便,所以我们可以制作一个进行单位转换的工具,解决这些问题。
二、代码实现
一、引用必要模块
这部分就不必解释了。
import tkinter as tk
from tkinter import ttk, messagebox
from pint import UnitRegistry
二、搭建图形用户界面
这里使用了一个Combobox控件,它可以实现下拉菜单的效果。['value']指定了下拉菜单的内容,
current是指在你没有点开它时,显示什么, 0就表示['value']的第一项。
这里我把两个下拉菜单都绑定在了一个<FocusIn>事件中,这样可实现下拉菜单的同步更新。
converter_var = tk.IntVar()
unit = tk.Label(window, text='Unit:', font=30)
unit.place(x=10, y=10)
comboxlist = ttk.Combobox(window)
comboxlist['value'] = ('length', 'weight', 'temperature', 'square', 'speed'
, 'power', 'time', 'money', 'capacity', 'data')
comboxlist.current(0)
comboxlist.place(x=90, y=10)
from_ = tk.Label(window, text='From:', font=30)
from_.place(x=10, y=50)
to = tk.Label(window, text='To:', font=30)
to.place(x=10, y=90)
comboxlist_3 = ttk.Combobox(window)
comboxlist_3.bind('<FocusIn>', update_)
comboxlist_3.place(x=90, y=90)
comboxlist_2 = ttk.Combobox(window)
comboxlist_2.bind('<FocusIn>', update)
comboxlist_2.place(x=90, y=50)
number = tk.Label(window, text='Number:', font=30)
number.place(x=10, y=130)
number_entry = tk.Entry(window, textvariable=converter_var, width=20)
number_entry.place(x=90, y=130)
convert_b =tk.Button(window, text='Convert', width=15, command=convert)
convert_b.place(x=10, y=180)
clear_b = tk.Button(window, text='Clear', width=15)
clear_b.place(x=140, y=180)
cnvert_text = tk.Text(window, width=35, height=5)
cnvert_text.place(x=10, y=220)
三、实现下拉菜单同步更新的函数
这里使用两个函数,分别给两个下拉菜单提供更新,原理也非常简单,不必多说。
def update(arg):
if comboxlist.get() != 'length':
if comboxlist.get() == 'length':
comboxlist_2['value'] = ('nm', 'mm', 'cm', 'dm', 'm', 'km')
elif comboxlist.get() == 'weight':
comboxlist_2['value'] = ('mg', 'g', 'kg', 't')
elif comboxlist.get() == 'temperature':
comboxlist_2['value'] = ('°F', '°C')
elif comboxlist.get() == 'square':
comboxlist_2['value'] = ('mm^2', 'cm^2', 'dm^2', 'm^2')
elif comboxlist.get() == 'speed':
comboxlist_2['value'] = ('cm/s', 'm/s', 'km/h')
elif comboxlist.get() == 'power':
comboxlist_2['value'] = ('W', 'KW')
elif comboxlist.get() == 'time':
comboxlist_2['value'] == ('s', 'min', 'h', 'day')
elif comboxlist.get() == 'money':
comboxlist_2['value'] = ('USD', "CNY", "EUR", "JPY", "HKD", "KRW", 'GBP', "THB", "TWB"
,"RUB", 'CAD')
elif comboxlist.get() == 'capacity':
comboxlist_2['value'] = ('ml', "L", 'cm^3', 'mm^3', 'm^3')
elif comboxlist.get() == 'data':
comboxlist_2['value'] = ('B', 'KB', "MB", "GB", 'TB')
else:
messagebox.showwarning(message='The unit is wrong!')
else:
comboxlist_2['value'] = ('nm', 'mm', 'cm', 'dm', 'm', 'km')
def update_(arg):
if comboxlist.get() != 'length':
if comboxlist.get() == 'length':
comboxlist_3['value'] = ('nm', 'mm', 'cm', 'dm', 'm', 'km')
elif comboxlist.get() == 'weight':
comboxlist_3['value'] = ('mg', 'g', 'kg', 't')
elif comboxlist.get() == 'temperature':
comboxlist_3['value'] = ('°F', '°C')
elif comboxlist.get() == 'square':
comboxlist_3['value'] = ('mm^2', 'cm^2', 'dm^2', 'm^2')
elif comboxlist.get() == 'speed':
comboxlist_3['value'] = ('cm/s', 'm/s', 'km/h')
elif comboxlist.get() == 'power':
comboxlist_3['value'] = ('W', 'KW')
elif comboxlist.get() == 'time':
comboxlist_3['value'] == ('s', 'min', 'h', 'day')
elif comboxlist.get() == 'money':
comboxlist_3['value'] = ('USD', "CNY", "EUR", "JPY", "HKD", "KRW", 'GBP', "THB", "TWB"
,"RUB", 'CAD')
elif comboxlist.get() == 'capacity':
comboxlist_3['value'] = ('ml', "L", 'cm^3', 'mm^3', 'm^3')
elif comboxlist.get() == 'data':
comboxlist_3['value'] = ('B', 'KB', "MB", "GB", 'TB')
else:
messagebox.showwarning(message='The unit is wrong!')
else:
comboxlist_3['value'] = ('nm', 'mm', 'cm', 'dm', 'm', 'km')
四、单位转换核心功能
这里使用pint库实现单位转换
def convert():
ureg = UnitRegistry()
Q_ = ureg.Quantity
operation = Q_(converter_var.get(), f'{comboxlist_2.get()}')
convert_text = operation.to(f'{comboxlist_3.get()}')
cnvert_text.delete('1.0', 'end')
cnvert_text.insert('end', chars=f'{convert_text}')
三、完整代码
import tkinter as tk
from tkinter import ttk, messagebox
from pint import UnitRegistry
window = tk.Tk()
window.geometry('280x300')
window.title('converter')
def update(arg):
if comboxlist.get() != 'length':
if comboxlist.get() == 'length':
comboxlist_2['value'] = ('nm', 'mm', 'cm', 'dm', 'm', 'km')
elif comboxlist.get() == 'weight':
comboxlist_2['value'] = ('mg', 'g', 'kg', 't')
elif comboxlist.get() == 'temperature':
comboxlist_2['value'] = ('°F', '°C')
elif comboxlist.get() == 'square':
comboxlist_2['value'] = ('mm^2', 'cm^2', 'dm^2', 'm^2')
elif comboxlist.get() == 'speed':
comboxlist_2['value'] = ('cm/s', 'm/s', 'km/h')
elif comboxlist.get() == 'power':
comboxlist_2['value'] = ('W', 'KW')
elif comboxlist.get() == 'time':
comboxlist_2['value'] == ('s', 'min', 'h', 'day')
elif comboxlist.get() == 'money':
comboxlist_2['value'] = ('USD', "CNY", "EUR", "JPY", "HKD", "KRW", 'GBP', "THB", "TWB"
,"RUB", 'CAD')
elif comboxlist.get() == 'capacity':
comboxlist_2['value'] = ('ml', "L", 'cm^3', 'mm^3', 'm^3')
elif comboxlist.get() == 'data':
comboxlist_2['value'] = ('B', 'KB', "MB", "GB", 'TB')
else:
messagebox.showwarning(message='The unit is wrong!')
else:
comboxlist_2['value'] = ('nm', 'mm', 'cm', 'dm', 'm', 'km')
def update_(arg):
if comboxlist.get() != 'length':
if comboxlist.get() == 'length':
comboxlist_3['value'] = ('nm', 'mm', 'cm', 'dm', 'm', 'km')
elif comboxlist.get() == 'weight':
comboxlist_3['value'] = ('mg', 'g', 'kg', 't')
elif comboxlist.get() == 'temperature':
comboxlist_3['value'] = ('°F', '°C')
elif comboxlist.get() == 'square':
comboxlist_3['value'] = ('mm^2', 'cm^2', 'dm^2', 'm^2')
elif comboxlist.get() == 'speed':
comboxlist_3['value'] = ('cm/s', 'm/s', 'km/h')
elif comboxlist.get() == 'power':
comboxlist_3['value'] = ('W', 'KW')
elif comboxlist.get() == 'time':
comboxlist_3['value'] == ('s', 'min', 'h', 'day')
elif comboxlist.get() == 'money':
comboxlist_3['value'] = ('USD', "CNY", "EUR", "JPY", "HKD", "KRW", 'GBP', "THB", "TWB"
,"RUB", 'CAD')
elif comboxlist.get() == 'capacity':
comboxlist_3['value'] = ('ml', "L", 'cm^3', 'mm^3', 'm^3')
elif comboxlist.get() == 'data':
comboxlist_3['value'] = ('B', 'KB', "MB", "GB", 'TB')
else:
messagebox.showwarning(message='The unit is wrong!')
else:
comboxlist_3['value'] = ('nm', 'mm', 'cm', 'dm', 'm', 'km')
def convert():
ureg = UnitRegistry()
Q_ = ureg.Quantity
operation = Q_(converter_var.get(), f'{comboxlist_2.get()}')
convert_text = operation.to(f'{comboxlist_3.get()}')
cnvert_text.delete('1.0', 'end')
cnvert_text.insert('end', chars=f'{convert_text}')
converter_var = tk.IntVar()
unit = tk.Label(window, text='Unit:', font=30)
unit.place(x=10, y=10)
comboxlist = ttk.Combobox(window)
comboxlist['value'] = ('length', 'weight', 'temperature', 'square', 'speed'
, 'power', 'time', 'money', 'capacity', 'data')
comboxlist.current(0)
comboxlist.place(x=90, y=10)
from_ = tk.Label(window, text='From:', font=30)
from_.place(x=10, y=50)
to = tk.Label(window, text='To:', font=30)
to.place(x=10, y=90)
comboxlist_3 = ttk.Combobox(window)
comboxlist_3.bind('<FocusIn>', update_)
comboxlist_3.place(x=90, y=90)
comboxlist_2 = ttk.Combobox(window)
comboxlist_2.bind('<FocusIn>', update)
comboxlist_2.place(x=90, y=50)
number = tk.Label(window, text='Number:', font=30)
number.place(x=10, y=130)
number_entry = tk.Entry(window, textvariable=converter_var, width=20)
number_entry.place(x=90, y=130)
convert_b =tk.Button(window, text='Convert', width=15, command=convert)
convert_b.place(x=10, y=180)
clear_b = tk.Button(window, text='Clear', width=15)
clear_b.place(x=140, y=180)
cnvert_text = tk.Text(window, width=35, height=5)
cnvert_text.place(x=10, y=220)
window.mainloop()
运行结果如下图所示:
正正好好100行!
以上就是用100行代码实现单位转换器的全部内容,希望对大家有所帮助