100行代码实现单位转换器(文末附源码)

一、我的需求

我们在生活中时常会遇到需要进行单位转换的问题,而有时却无法想起单位的转换倍率,造成一些不方便,所以我们可以制作一个进行单位转换的工具,解决这些问题。

二、代码实现

一、引用必要模块

这部分就不必解释了。

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行代码实现单位转换器的全部内容,希望对大家有所帮助

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值