前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python小工具-电话号码生成器

python小工具-电话号码生成器

作者头像
冰霜
发布2022-03-15 19:10:37
3K0
发布2022-03-15 19:10:37
举报
文章被收录于专栏:冰霜的软件测试技术分享
  • 任务背景

在测试某个系统时经常会用到手机号码,但是有时一个手机号使用后就不能再次使用了,经常要想一些可用的手机号,如18888888888等等,每次想手机号也挺麻烦的,所以这次想着做一个生成手机号的小工具。

  • 实现过程

1. 基本实现

代码语言:javascript
复制
import random

list_1 = ["134", "135", "136", "137", "138", "139", "147", "150", "151", "152", "157", "158", "159", "172", "178",
"182", "183", "184", "187", "188", "198"]  # 中国移动号码段

list_2 = ["130", "131", "132", "145", "155", "156", "166", "171", "175", "176", "185", "186"]  # 中国联通号码段

list_3 = ["133", "149", "153", "173", "177", "180", "181", "189", "191", "199", "193"]  # 中国电信号码段

num = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]  # 存放0-9数字,号码的4-11位从这里取

phone_all = list()  # 存放所有生成的电话号码
phone_output = list() # 存放去重后的电话号码


def create_phone(count, choice): # 参数1为生成号码的个数,参数2为运营商选择
for t in range(count):
        phone = random.choice(choice) + "".join(random.choice(num) for i in range(8))  #使用random函数生成电话号码
if phone not in phone_all:  # 判断该电话号码是不是出现过
            phone_output.append(phone)  # 没出现则放到phone_output
        phone_all.append(phone) # 把生成的每个号码都存起来,用去去重比对
    print(phone_output)  # 打印去重后的电话


if __name__ == '__main__':
    create_phone(10, list_3)

效果如下:

2. 使用Tkinter做一个界面小工具

代码如下:

代码语言:javascript
复制
# -*- coding:utf-8 -*-

import tkinter as tk
from tkinter import ttk
from tkinter import *
import random


class Phone():
def __init__(self):
self.window = tk.Tk()  # 创建window窗口
self.window.title("手机号码生成器")  # 定义窗口名称
# self.window.resizable(0,0)  # 禁止调整窗口大小
self.menu = ttk.Combobox(self.window, width=6)
self.path = StringVar()
# self.lab1 = tk.Label(self.window, text="目标路径:")
self.lab2 = tk.Label(self.window, text="选择运营商:")
self.lab3 = tk.Label(self.window, text="生成数量:")
self.count = tk.Entry(self.window, width=5)
self.info = tk.Text(self.window, height=20)  # 创建一个文本展示框,并设置尺寸

self.menu['value'] = ('中国联通', '中国移动', '中国电信')
self.menu.current(0)

# 添加一个按钮,用于触发生成号码
self.t_button1 = tk.Button(self.window, text='生成号码', relief=tk.RAISED, width=8, height=1,
                                   command=self.create_phone)
# 添加一个按钮,用于触发清空输出框功能
self.c_button2 = tk.Button(self.window, text='清空输出', relief=tk.RAISED, width=8, height=1, command=self.cle)

def gui_arrang(self):
"""完成页面元素布局,设置各部件的位置"""
# self.lab1.grid(row=0, column=0)
self.lab2.grid(row=0, column=0)  # 选择运营商标题按钮位置
self.menu.grid(row=0, column=1, sticky=W)  # 选择运营商下拉框位置
self.lab3.grid(row=1, column=0)  # 生成数量标题位置
self.count.grid(row=1, column=1, sticky=W)  # 生成数量输入框位置
self.info.grid(row=2, rowspan=5, column=0, columnspan=3, padx=15, pady=15)  # 展示结果文本框位置

self.t_button1.grid(row=0, column=2)  # 生成号码按钮位置
self.c_button2.grid(row=1, column=2)  # 清空输出按钮

def get_choice(self):
        category = {
'list_1': ["134", "135", "136", "137", "138", "139", "147", "150", "151", "152", "157", "158", "159", "172",
"178",
"182", "183", "184", "187", "188", "198"],  # 中国移动号码段
'list_2': ["130", "131", "132", "145", "155", "156", "166", "171", "175", "176", "185", "186"],  # 中国联通号码段
'list_3': ["133", "149", "153", "173", "177", "180", "181", "189", "191", "199", "193"]  # 中国电信号码段
        }
        cid = None
if self.menu.get() == "中国联通":
            cid = category["list_1"]
        elif self.menu.get() == "中国移动":
            cid = category["list_2"]
        elif self.menu.get() == "中国电信":
            cid = category["list_3"]
return cid

    @staticmethod
def basic_num():
        num = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
return num

def create_phone(self):
        phone_all = list()  # 存放所有生成的电话号码
        phone_output = list()  # 存放去重后的电话号码
for t in range(int(self.count.get())):
            phone = random.choice(self.get_choice()) + "".join(random.choice(self.basic_num()) for i in range(8))
if phone not in phone_all:
                phone_output.append(phone)  # 判断电话号码是不是出现过,没出现就追加到phone_output中
# phone_output = "".join(phone)
            phone_all.append(phone) # 把生成的每一个号码都追加到phone_all(去重参考物)
# phone_all = "".join(phone)
# print(phone_output)

        step = 6  # 设置一个值,每次显示6个号码
for b in [phone_output[i:i + step] for i in range(0, len(phone_output), step)]:  # 每次打印6个号码
            print(",".join(b))  # 把列表中的号码取出来并以","隔开,形式是字符串
self.info.insert('end', ",".join(b) + '\n')  # 输出到页面,并且每输出一组(6个)就追加一个换行符

def cle(self):
"""定义一个函数,用于清空输出框的内容"""
self.info.delete(1.0, "end")  # 从第一行清除到最后一行


def main():
    t = Phone()
    t.gui_arrang()
    tk.mainloop()


if __name__ == '__main__':
    main()

效果如下:

  • 遇到的问题

因为开始输出到界面的时候是按照显示框的大小自动换行的,所以有时会遇到一个号码分两行显示,为了解决这个问题,考虑如下: (1) 每次只输出6个电话号码,也就是6个为一组

(2) 输出一组后,紧接着输出一个换行符

关于第一点,在网上搜索了一下,如何把一个列表中的数据按照一定数量分组输出,方法如下:

代码语言:javascript
复制
参考博客:https://blog.csdn.net/Mr_Cat123/article/details/80584988
a = [1,2,3,4,5,6,7,8,9,10,11]
step = 3
b = [a[i:i+step] for i in range(0,len(a),step)]
print(b)

>>>[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11]] 
>>> b[1] 
[4, 5, 6]
上面的step是指每次输出3个数字

关于第二点,开始是在每个列表后追加一个换行符,发现每次显示到界面时,都会显示一个{},如下:

后来想着可能是数据格式的问题,不能把换行符加到列表中,然后处理了一下,先把列表转换成字符(使用join()方法),然后在每组字符后追加一个换行符,如下

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-09-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 冰霜blog 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档