python可视化电话号码转法文1.0

python 可视化电话号码转法文1.0

up主是第一次写文章,请大家多多指教,谢谢!

介绍

在自学法语的过程中,我发现大部分的学习者都觉得法语数字非常难,特别是在法国报电话号码的时候需要说一大长串的数字,如:
162 5641 6375(不是我的电话号码哈,只是举例子)
要说成:
cent-soixante-deux cinquante-six quarante et un soixante-trois soixante-quinze
这个烦人的东西让很多法语学习者叹为观止,所以我做了这样一个程序,将8位或11位的电话号码转成法文,一目了然地知道需要怎样说,非常方便。

代码

让我们看看代码:

# 导入区域
import sys
import tkinter.messagebox
import tkinter as tk

# 数据库区域
dic = {0: "zéro", 1: "un", 2: "deux", 3: "trois", 4: "quatre", 5: "cinq",
       6: "six", 7: "sept", 8: "huit", 9: "neuf", 10: "dix", 11: "onze",
       12: "douze", 13: "treize", 14: "quatorze", 15: "quinze", 16: "seize",
       20: "vingt", 30: "trente", 40: "quarante", 50: "cinquante", 60: "soixante", 100: "cent"}

#函数区域
def change(number: int):
    _text = dic[number]
    return _text


def get_input():
    return enter.get()


def command1():
    return [get_input(), screen.quit()]


def command2():
    return [screen.destroy(), sys.exit()]


def command3():
    return [screen2.destroy(), sys.exit()]

# 初始化区域
F = ""
lis = []
a = 0
screen = tk.Tk()
screen.title("电话号码转法文程序")
text = tk.Label(screen, text="请输入8位或13位电话号码:")
enter = tk.Entry(screen, show="*")
GetInputButton = tk.Button(screen, text="转换", command=command1)
QuitButton = tk.Button(screen, text="退出", command=command2)
text.grid()
enter.grid(row=0, column=1)
GetInputButton.grid(row=1, column=0)
QuitButton.grid(row=1, column=1)
screen.mainloop()
Chinese_telephone = get_input()
# 输出法语电话号码区域
if len(Chinese_telephone) == 8:
    while True:
        lis.append(Chinese_telephone[a:a+2])
        a += 2
        if a == 8:
            break
    for i in lis:
        if int(i) < 10:
            F += (change(0) + " " + change(int(i)) + " ")
        elif 10 <= int(i) < 17:
            F += (change(int(i)) + " ")
        elif 17 <= int(i) < 20:
            F += (change(10) + "-" + change(int(i[1])) + " ")
        elif 20 <= int(i) < 70:
            if int(i) % 10 == 0:
                F += (change(int(i)) + " ")
            elif i[1] == "1":
                F += (change(int(i)-1) + "et un" + " ")
            else:
                F += (change(int(i[0])*10) + "-" + change(int(i[1])) + " ")
        elif 70 <= int(i) < 77:
            if int(i) == 71:
                F += (change(60) + "et" + change(11) + " ")
            else:
                F += (change(60) + "-" + change(int(i)-60) + " ")
        elif 77 <= int(i) < 80:
            F += (change(60)+"-"+change(10) + "-" + change(int(i[1])) + " ")
        elif 80 <= int(i) < 97:
            if int(i) == 80:
                F += (change(4) + "-" + change(20) + "s" + " ")
            else:
                F += (change(4) + "-" + change(20) + "-" + change(int(i)-80) + " ")
        elif 97 <= int(i) < 100:
            F += (change(4) + "-" + change(20) + "-" + change(10) + "-" + change(int(i[1])) + " ")
elif len(Chinese_telephone) == 11:
    lis.append(Chinese_telephone[0:3])
    a = 3
    while True:
        lis.append(Chinese_telephone[a:a + 2])
        a += 2
        if a == 11:
            break
    for i in lis:
        if int(i) < 10:
            F += (change(0) + " " + change(int(i)) + " ")
        elif 10 <= int(i) < 17:
            F += (change(int(i)) + " ")
        elif 17 <= int(i) < 20:
            F += (change(10)+"-"+change(int(i[1])) + " ")
        elif 20 <= int(i) < 70:
            if int(i) % 10 == 0:
                F += (change(int(i)) + " ")
            elif i[1] == "1":
                F += (change(int(i)-1) + "et un" + " ")
            else:
                F += (change(int(i[0])*10) + "-" + change(int(i[1])) + " ")
        elif 70 <= int(i) < 77:
            if int(i) == 71:
                F += (change(60) + "et" + change(11) + " ")
            else:
                F += (change(60) + "-" + change(int(i)-60) + " ")
        elif 77 <= int(i) < 80:
            F += (change(60) + "-" + change(10) + "-" + change(int(i[1])) + " ")
        elif 80 <= int(i) < 97:
            if int(i) == 80:
                F += (change(4) + "-" + change(20) + "s" + " ")
            else:
                F += (change(4) + "-" + change(20) + "-" + change(int(i)-80) + " ")
        elif 97 <= int(i) < 100:
            F += (change(4) + "-" + change(20) + "-" + change(10) + "-" + change(int(i[1])) + " ")
        elif int(i) >= 100:
            if int(i) == 100:
                F += (change(100) + " ")
            elif 100 < int(i) <= 116:
                F += (change(100) + "-" + change(int(i)[1:]) + " ")
            elif 116 < int(i) < 120:
                F += (change(100) + "-" + change(10) + "-" + change(int(i[-1])) + " ")
            elif 120 <= int(i) <= 160:
                if int(i) % 10 == 0:
                    F += (change(100) + "-" + change(int(i[1])*10) + "-" + change(int(i[-1])) + " ")
                elif int(i) % 10 == 1:
                    F += (change(100) + "-" + change(int(i[1])*10) + "et un" + " ")
                else:
                    F += (change(100) + "-" + change(int(i[1])*10) + "-" + change(int(i[-1])) + " ")
            elif 160 < int(i) < 177:
                F += (change(100) + "-" + change(60) + change(int(i) - 160) + " ")
            elif 177 <= int(i) < 180:
                F += (change(100) + "-" + change(60) + change(10) + change(int(i[-1])) + " ")
            elif int(i) == 180:
                F += (change(100) + "-" + change(4) + "-" + change(20) + "s ")
            elif 180 < int(i) <= 196:
                F += (change(100) + "-" + change(4) + "-" + change(20) + "-" + change(int(i) - 180) + " ")
            elif 196 < int(i) < 200:
                F += (change(100) + "-" + change(4) + "-" + change(20) + "-" + change(10) + change(int(i[-1])) + " ")
            else:
                raise ValueError("Something's wrong.")
else:
    print(tkinter.messagebox.showwarning("中文电话号码转法文程序", "警告⚠:您输入的不是8位或13位电话号码。"))

# 可视化输出区域
screen2 = tk.Tk()
screen2.title("电话号码转法文程序")
France = tk.Label(screen2, text="您的法语电话号码是:" + F)
France.grid(row=0)
QuitButton2 = tk.Button(screen2, text="退出", command=command3)
QuitButton2.grid(row=2)
screen2.mainloop()

注意:去掉注释后本代码完全符合PEP8规范。

教程

只需要用的话,后面可以直接跳过。
想要知道如何制作电话号码转法文程序,先要了解法语数字的说法及法语电话号码的说法。(如您是法语学习者,可以跳过这段)

法语数字

需要用到的基础法语数字有:

0: zéro
1: un
2: deux
3: trois
4: quatre
5: cinq
6: six
7: sept
8: huit
9: neuf
10: dix
11: onze
12: douze
13: treize
14: quatorze
15: quinze
16: seize
20: vingt
30: trente
40: quarante
50: cinquante
60: soixante
100: cent

可以发现,这其中缺失了很多数字,这就要说到法语数字“变态”的说法了。


在法语中,0-16的说法是固定的,可以看上面的基础数字。
17-19就有变化了,分别是dix-septdix-huitdix-neuf,相当于10+7、10+8、10+9。
20-69分三种可能:

  1. 末尾为0(除以10余数为0)的话读基础读法。如:20: vingt,50: cinquante
  2. 末尾为1(除以10余数为1)的话读几十的基础读法+et un,相当于几十加一。如:31: trente et un,61: soixante et un
  3. 其他时候读几十的基础读法+杠(-)+个位上的数字的基础读法,相当于几十几。如:28: vingt-huit, 42: quarante-deux

到了70及以上,法语数字“变态”的地方就要显现出来了。
70-76的话要说六十加十几,如:74: soixante-quatorze (60+14),76: soixante-seize (60+16)。注意71不说成60+11(soixante-onze),要说soixante et onze。
77-79可以参考70-76的方法,但有不同,因为17~19并没有基础读法,需要由两个数拼接而成,所以这个区间的数要说六十加十加7/8/9。如:77:soixante-dix-sept (60+10+7),79: soixante-dix-neuf (60+10+9)
感受到变态了吗?咱们继续看:
前面的数字还只用到了加法,80以上的数字又要开始用乘法了。
80这个数要说四乘二十,也就是quatre-vingt。
81-89的说法就是四乘二十加几,如:84: quatre-vingt-quatre,87: quatre-vingt-sept。注意在这里81不用说成80和1(quatre-vingt et un),说成quatre-vingt-un
90-97的说法和70-76的说法大致相同,说成四乘二十加十几,如:93: quatre-vingt-treize,96: quatre-vingt-seize
那大家能猜出来97、98、99怎么说吗?
答案是:97: quatre-vingt-dix-sept,98: quatre-vingt-dix-huit,99: quatre-vingt-dix-neuf
现在读者们可以体会到为什么我在开头说“大部分的学习者都觉得法语数字很难”了吧。
如果是100-999的数字,就是几百(几十几),“几百”就是说成xxx-cent,把这个和后边两位数的说法用杠(-)连接就可以了。如:245: deux-cent-quarante-cinq。注意:如果只是一百(几十几)的话,不说un cent,只说cent。
再大的数我就不一一概述了,这个程序用不到那么大的数,应该为此庆幸的,因为再大的数更复杂。。。
举个例子吧,999,999,999说成neuf-cent-quatre-vingt-dix-neuf-million-neuf-cent-quatre-vingt-dix-neuf-milli-neuf-cent-quatre-vingt-dix-neuf。(ˉ▽ˉ;)...
咱们再来看看:

法语电话号码说法

中文的电话号码有座机号码(8位)和手机号码(13位)之分,两种号码的说法也不同。

座机号码

座机号码有8位,法国人的习惯是两位两位地说,如:83957297说成83、95、72、93,也就是quatre-vingt-trois quatre-vingt-quinze soixante-douze quatre-vingt-dix-sept
注意,如果分的两位数是0x的话,说0的基础读法和个位数字的基础读法。如果是00的话,只说一个zéro。


手机号码

手机号码有13位,法国人的习惯是先说三位,然后两位两位地说,如:18503641849说成185、03、64、18、49,也就是cent-quatre-vingt-cinq zéro trois soixante-quatre dix-huit quarante-neuf


代码教程

说了这么多,终于可以看看代码到底是怎么写的了。
首先,需要导入我们需要的库,在这个代码中需要导入sys、tkinter(命名为tk),还需要tkinter里面的一个小分支————messagebox。
**注意:tkinter是开发可视化窗口的内置库,教程详见这里

import sys
import tkinter.messagebox
import tkinter as tk

然后,我们需要做一个数据库来把基础数字放进去。
这里我用的是词典:

dic = {0: "zéro", 1: "un", 2: "deux", 3: "trois", 4: "quatre", 5: "cinq",
       6: "six", 7: "sept", 8: "huit", 9: "neuf", 10: "dix", 11: "onze",
       12: "douze", 13: "treize", 14: "quatorze", 15: "quinze", 16: "seize",
       20: "vingt", 30: "trente", 40: "quarante", 50: "cinquante", 60: "soixante", 100: "cent"}

为了后面写代码的时候方便在基础数字和读法之间转换,需要写一个函数,参数为一个基础数字,返回这个基础数字的读法。
可以利用前边的dic词典来完成:

# 定义将基础数字转换为读法的函数
def change(number: int):
    _text = dic[number] # 将数字对应的读法存到变量_text里
    return _text # 返回变量

把这个函数放到函数区域里。


现在我们可以开始写输入电话的可视化窗口了。
先打开一个tkinter窗口,并命名为screen:

screen = tk.Tk()

再将这个窗口的标题命名为“电话号码转法文程序1.0”:

screen.title("电话号码转法文程序1.0")

创建一段文本,显示输入电话号码的信息;再创建一个输入框,显示输入进去的东西为星号(像密码一样,保护隐私):

text = tk.Label(screen, text="请输入8位或13位电话号码:")
enter = tk.Entry(screen, show="*")

继续创建两个按钮,一个是转换按钮,另一个是退出按钮。
这里如果点击转换按钮的话,需要获取输入框里的电话号码(这是一个自定义函数)并暂时不将自己设为主窗口,也就是两个命令,而tkinter的按钮在创建的时候是不允许有两个命令在command参数中的,所以需要用一个函数来将这两个命令变成一个列表,并在command参数中调用这个函数。
获取输入框里电话号码的函数这样写:

def get_input():
    return enter.get()

get_input()和暂时不将自己设为主窗口(screen.quit())两个函数合成到一起的函数要这样写:

def command1():
    return [get_input(), screen.quit()]

将这两个函数放到函数区域。
另一个退出按钮和上面同理,只不过需要将退出窗口的函数和退出程序的函数合成到一个函数。可以这样写函数:

def command2():
    return [screen.destroy(), sys.exit()]

再将这个函数放到函数区域。
这时就可以创键两个按钮了,创建方法如下:

GetInputButton = tk.Button(screen, text="转换", command=command1)
QuitButton = tk.Button(screen, text="退出", command=command2)

然后,将文本、输入框和两个按钮显示到窗口上,并设置放在窗口的位置,需要这样写:

text.grid()
enter.grid(row=0, column=1)
GetInputButton.grid(row=1, column=0)
QuitButton.grid(row=1, column=1)

然后,将这个窗口形成循环:

screen.mainloop()

下面,就可以写将电话号码转换为法语的语句了。语句如下:

# 座机号码转换
if len(Chinese_telephone) == 8:
    while True:
        # 将电话号码两位两位地放到事先创建好的列表里(将lis = []放到初始化区域)
        lis.append(Chinese_telephone[a:a+2])
        a += 2
        if a == 8:
            break
    # 循环遍历lis列表,将每两位按照法语转换方法转换,并存进事先创建好的字符串中(将F = ""放到初始化区域),在后面写上空格
    for i in lis:
        # 将法语数字的规律转换为程序
        if int(i) < 10:
            F += (change(0) + " " + change(int(i)) + " ")
        elif 10 <= int(i) < 17:
            F += (change(int(i)) + " ")
        elif 17 <= int(i) < 20:
            F += (change(10) + "-" + change(int(i[1])) + " ")
        elif 20 <= int(i) < 70:
            if int(i) % 10 == 0:
                F += (change(int(i)) + " ")
            elif i[1] == "1":
                F += (change(int(i)-1) + "et un" + " ")
            else:
                F += (change(int(i[0])*10) + "-" + change(int(i[1])) + " ")
        elif 70 <= int(i) < 77:
            if int(i) == 71:
                F += (change(60) + "et" + change(11) + " ")
            else:
                F += (change(60) + "-" + change(int(i)-60) + " ")
        elif 77 <= int(i) < 80:
            F += (change(60)+"-"+change(10) + "-" + change(int(i[1])) + " ")
        elif 80 <= int(i) < 97:
            if int(i) == 80:
                F += (change(4) + "-" + change(20) + "s" + " ")
            else:
                F += (change(4) + "-" + change(20) + "-" + change(int(i)-80) + " ")
        elif 97 <= int(i) < 100:
            F += (change(4) + "-" + change(20) + "-" + change(10) + "-" + change(int(i[1])) + " ")
# 手机号码转换
elif len(Chinese_telephone) == 11:
    # 将电话号码的前三位放进lis列表中,再两位两位地将剩下的数字放进列表里
    lis.append(Chinese_telephone[0:3])
    a = 3
    while True:
        lis.append(Chinese_telephone[a:a + 2])
        a += 2
        if a == 11:
            break
    # 循环遍历lis列表,将每两位按照法语转换方法转换,并存进事先创建好的字符串中(将F = ""放到初始化区域),在后面写上空格
    for i in lis:
        # 0-100和前面相同,复制前面的代码
        if int(i) < 10:
            F += (change(0) + " " + change(int(i)) + " ")
        elif 10 <= int(i) < 17:
            F += (change(int(i)) + " ")
        elif 17 <= int(i) < 20:
            F += (change(10)+"-"+change(int(i[1])) + " ")
        elif 20 <= int(i) < 70:
            if int(i) % 10 == 0:
                F += (change(int(i)) + " ")
            elif i[1] == "1":
                F += (change(int(i)-1) + "et un" + " ")
            else:
                F += (change(int(i[0])*10) + "-" + change(int(i[1])) + " ")
        elif 70 <= int(i) < 77:
            if int(i) == 71:
                F += (change(60) + "et" + change(11) + " ")
            else:
                F += (change(60) + "-" + change(int(i)-60) + " ")
        elif 77 <= int(i) < 80:
            F += (change(60) + "-" + change(10) + "-" + change(int(i[1])) + " ")
        elif 80 <= int(i) < 97:
            if int(i) == 80:
                F += (change(4) + "-" + change(20) + "s" + " ")
            else:
                F += (change(4) + "-" + change(20) + "-" + change(int(i)-80) + " ")
        elif 97 <= int(i) < 100:
            F += (change(4) + "-" + change(20) + "-" + change(10) + "-" + change(int(i[1])) + " ")
        # 将大于100的数转换
        elif int(i) >= 100:
            if int(i) == 100:
                F += (change(100) + " ")
            elif 100 < int(i) <= 116:
                F += (change(100) + "-" + change(int(i)[1:]) + " ")
            elif 116 < int(i) < 120:
                F += (change(100) + "-" + change(10) + "-" + change(int(i[-1])) + " ")
            elif 120 <= int(i) <= 160:
                if int(i) % 10 == 0:
                    F += (change(100) + "-" + change(int(i[1])*10) + "-" + change(int(i[-1])) + " ")
                elif int(i) % 10 == 1:
                    F += (change(100) + "-" + change(int(i[1])*10) + "et un" + " ")
                else:
                    F += (change(100) + "-" + change(int(i[1])*10) + "-" + change(int(i[-1])) + " ")
            elif 160 < int(i) < 177:
                F += (change(100) + "-" + change(60) + change(int(i) - 160) + " ")
            elif 177 <= int(i) < 180:
                F += (change(100) + "-" + change(60) + change(10) + change(int(i[-1])) + " ")
            elif int(i) == 180:
                F += (change(100) + "-" + change(4) + "-" + change(20) + "s ")
            elif 180 < int(i) <= 196:
                F += (change(100) + "-" + change(4) + "-" + change(20) + "-" + change(int(i) - 180) + " ")
            elif 196 < int(i) < 200:
                F += (change(100) + "-" + change(4) + "-" + change(20) + "-" + change(10) + change(int(i[-1])) + " ")
            else:
                raise ValueError("Something's wrong.")
# 既不是8位又不是11位
else:
    print(tkinter.messagebox.showwarning("中文电话号码转法文程序", "警告⚠:您输入的不是8位或13位电话号码。"))

代码有点长,可以看看新添加的注释。
最后,就可以将转换后的法语电话号码(存进了字符串F里)输出了。
先创建一个新的窗口并设置标题:

screen2 = tk.Tk()
screen2.title("电话号码转法文程序")

再创建并在窗口上显示法语电话号码:

France = tk.Label(screen2, text="您的法语电话号码是:" + F)
France.grid(row=0)

继续创建并在窗口上显示退出按钮,这里又要加一个新的合并函数了,需要将screen2窗口关闭并退出程序,函数写法如下:

def command3():
    return [screen2.destroy(), sys.exit()]

将这个函数放到函数区域中。
然后是退出按钮:

QuitButton2 = tk.Button(screen2, text="退出", command=command3)
Quitbutton2.grid(row=1)

最后,将这个窗口形成循环:

screen2.mainloop()

至此,程序就写完啦!

posted @ 2023-01-12 13:16  WellPythonUser  阅读(14)  评论(1)    收藏  举报