Python+Tkinter实现一个简单的罗马数字转换工具

 更新时间:2026年06月10日 09:01:00   作者:金銀銅鐵  
这篇文章主要介绍了Python+Tkinter实现一个简单的罗马数字转换工具,可以实现将正整数转化为罗马数字,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下

背景

TkDocs tutorial 里介绍了 Tkinter,其中有 A First (Real) Example 一文,这篇文章里有一个使用 Tkinter 生成图形化界面的简单例子。我想在那篇文章的基础上实战一下,于是想到可以写一个正整数 ➡️ 罗马数字(输入的正整数不能大于 3999)的简易转化工具。

如何将正整数转化为罗马数字

转化规则可以参考 12. 整数转罗马数字 这道题目。以2026 为例,我们可以对每个数位进行转化

  • 千位是 2M 表示 11000MM 表示 2000
  • 百位是 0:不用转化
  • 十位是2X 表示 10XX 表示 20
  • 个位是 6I 表示 1V 表示5VI 表示 6

合在一起,就是MMXXVI

程序可以这样写 

def to_roman(value):
    convert_result = ""
    digit_base = 1
    while value > 0:
        remainder = value % (digit_base * 10)
        convert_result = convert_one_digit_to_roman(remainder, digit_base) + convert_result
        digit_base *= 10
        value -= remainder
    return convert_result

def convert_one_digit_to_roman(raw_value, digit_base):
    candidates = "IVXLCDM"
    index = 0
    temp = digit_base
    while temp > 1:
        temp /= 10
        index += 2
    value = raw_value // digit_base
    if value <= 3:
        return candidates[index] * value
    if value == 4:
        return candidates[index] + candidates[index + 1]
    if value <= 8:
        return candidates[index + 1] + candidates[index] * (value - 5)
    if value == 9:
        return candidates[index] + candidates[index + 2]
    raise ValueError("无效输入: " + str(raw_value))

完整的代码

A First (Real) Example 一文中有使用 Tkinter 生成图形化界面的简单例子。在它的基础上,可以写出以下Python3 代码

from tkinter import *
from tkinter import ttk

def convert():
    try:
        value = num.get()
        if (value <= 0) or (value > 3999):
            result.set("无效输入")
            return
        result.set(to_roman(value))
    except ValueError:
        pass

def to_roman(value):
    convert_result = ""
    digit_base = 1
    while value > 0:
        remainder = value % (digit_base * 10)
        convert_result = convert_one_digit_to_roman(remainder, digit_base) + convert_result
        digit_base *= 10
        value -= remainder
    return convert_result

def convert_one_digit_to_roman(raw_value, digit_base):
    candidates = "IVXLCDM"
    index = 0
    temp = digit_base
    while temp > 1:
        temp /= 10
        index += 2
    value = raw_value // digit_base
    if value <= 3:
        return candidates[index] * value
    if value == 4:
        return candidates[index] + candidates[index + 1]
    if value <= 8:
        return candidates[index + 1] + candidates[index] * (value - 5)
    if value == 9:
        return candidates[index] + candidates[index + 2]
    raise ValueError("无效输入: " + str(raw_value))


root = Tk()
root.title("整数转罗马数字小工具")

mainframe = ttk.Frame(root, padding=(3, 3, 12, 12))
mainframe.grid(column=0, row=0, sticky=(N, W, E, S))

num = IntVar()
num_entry = ttk.Entry(mainframe, width=4, textvariable=num)
num_entry.grid(column=2, row=1, sticky=(W, E))

ttk.Button(mainframe, text="转化为罗马数字", command=convert).grid(column=1, row=2, sticky=W)

ttk.Label(mainframe, text="请输入一个正整数 (不要超过3999)").grid(column=1, row=1, sticky=W)

result = StringVar()
ttk.Label(mainframe, textvariable=result).grid(column=2, row=2, sticky=W)

root.columnconfigure(0, weight=1)
root.rowconfigure(0, weight=1)
mainframe.columnconfigure(2, weight=1)
for child in mainframe.winfo_children(): 
    child.grid_configure(padx=5, pady=5)

num_entry.focus()
root.bind("<Return>", convert)

root.mainloop()

运行

请将上一小节展示的完整代码保存为 to_roman.py。使用如下命令可以运行 to_roman.py

python3 to_roman.py

运行效果如下

我们输入一个正数,例如当前年份2026,然后点击“转化为罗马数字”按钮,效果如下

再用其他数字验证一下(例如1949

运行结果符合预期

到此这篇关于Python+Tkinter实现一个简单的罗马数字转换工具的文章就介绍到这了,更多相关Python Tkinter罗马数字转换内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 教你用一行conda命令升级Anaconda中python到指定版本

    教你用一行conda命令升级Anaconda中python到指定版本

    这篇文章主要介绍了如何用一行conda命令升级Anaconda中python到指定版本的相关资料,通过查看版本、确认当前版本、执行升级命令完成升级,并记录过程,需注意代码修正以避免兼容性问题,需要的朋友可以参考下
    2025-05-05
  • Django渲染Markdown文章目录的方法示例

    Django渲染Markdown文章目录的方法示例

    这篇文章主要介绍了Django渲染Markdown文章目录的方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • python matplotlib实现坐标投影的示例代码

    python matplotlib实现坐标投影的示例代码

    这篇文章主要为大家详细介绍了python matplotlib实现坐标投影,文中的示例代码讲解详细,具有一定的参考价值,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-02-02
  • Django中create和save方法的不同

    Django中create和save方法的不同

    这篇文章主要给大家介绍了关于Django中create和save方法的不同之处,文中通过示例代码介绍的非常详细,对大家学习或者使用Django具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08
  • Python通过递归函数输出嵌套列表元素

    Python通过递归函数输出嵌套列表元素

    这篇文章主要介绍了Python通过递归函数输出嵌套列表元素,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • python一行输入多值的实现详解

    python一行输入多值的实现详解

    开发人员通常想要用户在一行中输入多个值或者输入。在python中有两种方式让用户在一行中输入多个值或者输入,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-09-09
  • Python中10个常用的内置函数详解

    Python中10个常用的内置函数详解

    这篇文章主要为大家介绍了Python常用的内置函数,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-12-12
  • PyTorch实现联邦学习的基本算法FedAvg

    PyTorch实现联邦学习的基本算法FedAvg

    这篇文章主要为大家介绍了PyTorch实现联邦学习的基本算法FedAvg,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • Python自动化办公Excel模块openpyxl原理及用法解析

    Python自动化办公Excel模块openpyxl原理及用法解析

    这篇文章主要介绍了Python自动化办公Excel模块openpyxl原理及用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • 利用Python实现给图像添加标签

    利用Python实现给图像添加标签

    这篇文章主要为大家详细介绍了如何利用Python实现给指定的图片添加标签,文中的示例代码讲解详细,具有一定的学习价值,需要的可以参考一下
    2023-07-07

最新评论