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-sept、dix-huit和dix-neuf,相当于10+7、10+8、10+9。
20-69分三种可能:
- 末尾为0(除以10余数为0)的话读基础读法。如:
20: vingt,50: cinquante。 - 末尾为1(除以10余数为1)的话读几十的基础读法+et un,相当于几十加一。如:
31: trente et un,61: soixante et un。 - 其他时候读几十的基础读法+杠(-)+个位上的数字的基础读法,相当于几十几。如:
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()
至此,程序就写完啦!
