自制模块
ImgChangeBase64.py
"""
This modules is used to convert image format to base64 format.
"""
def pic_change_base64():
import PySimpleGUI as sg
import base64
layout = [
[sg.Text("文件路径", font=15, text_color='black'),
sg.Input(key='-IN1-',
size=(35, 2),
font='宋体',
border_width=2,
enable_events=True),
sg.FileBrowse("选择文件", size=(8, 1))],
[sg.Button("确定转换", bind_return_key=True, border_width=5, size=(30, 1)),
sg.Button("取消转换", bind_return_key=True, border_width=5, size=(30, 1))]
]
window = sg.Window("Change_To_Base64", layout)
def change(path):
with open(path, 'rb') as f1:
pic = f1.read()
return base64.b64encode(pic)
while True:
event, values = window.read()
print(event, values)
if not event:
break
if event == '取消转换':
break
if event == '确定转换':
if values['-IN1-'] == '':
return None
else:
return change(values['-IN1-'])
window.close()
if __name__ == '__main__':
print(pic_change_base64())
ASCIIconversion.py
"""
This module converts characters and numbers according to the ASCII table.
"""
def change_character(choose=1):
if choose == 1 or choose == 2:
character = input("请输入字符:")
lt = []
for i in character:
lt.append(ord(i))
if choose == 1:
lt_s = []
for i in lt:
lt_s.append(str(i))
return ' '.join(lt_s)
else:
return lt
else:
return '参数错误'
def change_number(choose=1):
number = input("请输入编号[请用空格符进行间隔]>>>")
if choose == 1 or choose == 2:
lt = number.split(' ')
lt_s = []
for i in lt:
lt_s.append(chr(int(i)))
if choose == 1:
return ''.join(lt_s)
else:
return lt_s
else:
return '参数错误'
if __name__ == '__main__':
print(change_character())
print(change_number())
JudgeInput.py
"""
This module is used to determine the number of letters and numbers in a string.
"""
function_dict = {
'1': "判断(字符串)是否为:纯字母 [返回值:True or False]",
'2': "判断(字符串)是否为:纯数字 [返回值:True or False]",
'3': "统计(字符串)中不同字符总个数 [返回值:int]",
'4': "统计(字符串)中‘大写字母’、‘小写字母’、‘数字’、‘其他字符’的个数 [返回值:dict]"
}
def judge(strings='', funcnum=3, scan=False, ):
if scan:
for i in function_dict:
print("{}:{}".format(i, function_dict[i]))
if funcnum == 1:
return strings.isalpha()
elif funcnum == 2:
return strings.isdigit()
elif funcnum == 3:
set_1 = set()
for i in strings:
set_1.add(i)
return len(set_1)
elif funcnum == 4:
capital_letter = 0
lower_letter = 0
number = 0
others = 0
for i in strings:
if 65 <= ord(i) <= 90:
capital_letter += 1
elif 97 <= ord(i) <= 122:
lower_letter += 1
elif 48 <= ord(i) <= 57:
number += 1
else:
others += 1
letter_total = capital_letter + lower_letter
result_dict = {
'字符串长度': len(strings),
'数字字符': number,
'字母字符': letter_total,
'大写字母字符': capital_letter,
'小写字母字符': lower_letter,
'其他字符': others
}
return result_dict
else:
return None
if __name__ == '__main__':
print(judge(scan=True))
案例1: 刮刮乐
import random
from JudgeInput import judge
def scratch_off_game(probiblity=1 / 3):
if 0 < probiblity <= 1:
return main(probiblity)
else:
return '参数错误_正确范围[0~1]'
def main(probiblity):
n = int(6 / probiblity - 6)
list_prize = ['一等奖', '二等奖', '二等奖', '三等奖', '三等奖', '三等奖']
list_mix = list_prize + ['谢谢惠顾'] * n
random.shuffle(list_mix)
while True:
res = input("请输入你想要刮开的号码\n--->").strip()
if judge(res, 2):
if judge(res) == 1:
if res.startswith('0', 0, 1):
print('对不起,没有0或全为0的号码!')
continue
else:
res = int(res)
break
else:
lt = list(res)
while True:
if lt[0] == '0':
lt = lt[1::]
continue
else:
res = ''.join(lt)
res = int(res)
break
break
else:
print('请输入数字!', end='')
if 0 < res <= (n + 6):
return list_mix[res - 1]
else:
res = res % (n + 6)
return (list_mix[res - 1])
if __name__ == '__main__':
print(scratch_off_game(1 / 2))
案例2: 平润年
import time
def year():
year = int(input("请输入年份:").strip())
while True:
if year > 0:
if year % 400 == 0 or (year % 4 == 0 and year % 100 != 0):
return [year, "平年"]
else:
return [year, "闰年"]
else:
print('请正确输入!')
def month(year):
while True:
month = int(input("请输入月份:").strip())
if month in [1, 3, 5, 7, 8, 10, 12]:
return f"{year}年{month}月,有31天"
elif month in [4, 6, 9, 11]:
return f"{year}年{month}月,有30天"
elif month == 2:
if year % 400 == 0 or (year % 4 == 0 and year % 100 != 0):
return f"{year}年{month}月,有28天"
else:
return f"{year}年{month}月,有29天"
else:
print('请正确输入!')
def main():
while True:
print('\n1.只查询年份\n2.查询到月份\n3.退出')
num = input('\n请输入功能号\n--->').strip()
if num == '1':
lt = year()
print("{}年是{}".format(lt[0], lt[1]))
time.sleep(3)
elif num == '2':
lt = year()
print(month(lt[0]))
time.sleep(3)
elif num == '3':
break
else:
print('请正确输入!')
if __name__ == '__main__':
main()
案例3: 手机通讯录
import os
# 通讯录功能---展示部分:
program = {"1": "添加联系人", "2": "查看通讯录", "3": "修改联系人", "4": "删除联系人", "5": "清空通讯录", "6": "退出"}
# 手机通讯录date目录:
address = os.path.abspath('') # 当前py文件的上一级目录
old_address = fr"{address}\手机通讯录date.txt"
new_address = fr"{address}\手机通讯录date(copy).txt"
# 辅助函数
def quit():
if input("任意键退出查询") != '':
return None
def write_infomation():
per_name = input_not_empty("联系人的姓名:")
if is_exist(per_name):
print("此人已在通讯录中!")
return None
phone_num = input_not_empty("联系人的手机号:")
per_email = input_not_empty("联系人的邮箱:")
per_address = input_not_empty("联系人的地址:")
# 信息整合
per_infomation = f"姓名-{per_name}---手机号-{phone_num}---邮箱-{per_email}---地址-{per_address}\n"
return per_infomation
def input_not_empty(str):
""" 此函数的功能是判断输入的内容是否为空 """
while True:
content = input(str).strip()
if content == '':
print("内容不能为空,请重新输入!")
continue
return content
def is_exist(name, switch=1):
"""
此函数的功能是判断某人的信息是否已经存在于手机通讯录的数据中
参数 switch = 1 ---> 只查询模式
参数 switch = 2 ---> 返回对象模式
"""
if switch == 1:
with open(old_address, mode='rt', encoding='utf-8') as f1:
for line in f1:
list1 = line.strip().split("---") # [姓名-per_name, 手机号-phone_num, 邮箱-per_email, 地址-per_address]
list2 = list1[0].split('-') # [姓名, per_name]
if list2[1] == name:
return True
return False
if switch == 2:
with open(old_address, mode='rt', encoding='utf-8') as f1:
for line in f1:
list1 = line.strip().split("---") # [姓名-per_name, 手机号-phone_num, 邮箱-per_email, 地址-per_address]
list2 = list1[0].split('-') # [姓名, per_name]
if list2[1] == name:
return list1
return False
def date_is_empty():
with open(old_address, mode='rt', encoding='utf-8') as f1:
if f1.readline() == '':
return True
return False
def change_or_delete(switch):
"""
此函数的功能是修改或删除某人的信息
参数 switch = 1 ---> 修改模式
参数 switch = 2 ---> 删除模式
"""
# 文件信息转移:
def main(switch):
n = 0 # 名字异常(不用修改文件,直接退出到系统首页)-- 计数
with open(old_address, mode='rt', encoding='utf-8') as f1:
with open(new_address, mode='wt', encoding='utf-8') as f2:
# 主体部分:
if switch == 1:
name = input("请输入要修改信息的联系人的姓名:").strip()
if is_exist(name):
# change核心开始
# 先存好其他联系人的信息:
for line in f1:
# 辅助查找名字部分
list1 = line.strip().split(
"---") # [姓名-per_name, 手机号-phone_num, 邮箱-per_email, 地址-per_address]
list2 = list1[0].split('-') # [姓名, per_name]
# 查找名字:
if list2[1] == name:
old_per_info = line # 对要修改的信息,先备一份,以防要使用旧的数据
continue
# 主线部分
f2.write(line)
# 循环保存好了之后,再追加修改后的信息:
print('请进行修改...')
res = write_infomation()
if res:
f2.write(res)
print('修改成功!')
return quit()
print('修改失败!')
f2.write(old_per_info) # 修改失败后将旧的信息写入
return quit()
# change核心结束
print('修改失败!通讯录查无此人')
n = 1 # 计数为1,不用修改文件
quit()
return n
if switch == 2:
name = input("请输入要删除的联系人的姓名:").strip()
if is_exist(name):
# delete核心开始
# 先存好其他联系人的信息:
for line in f1:
# 辅助查找名字部分
list1 = line.strip().split(
"---") # [姓名-per_name, 手机号-phone_num, 邮箱-per_email, 地址-per_address]
list2 = list1[0].split('-') # [姓名, per_name]
# 查找名字:
if list2[1] == name:
continue
# 主线部分
f2.write(line)
# 循环保存结束
print("删除成功!")
return quit()
# delete核心结束
print('删除失败!通讯录查无此人')
n = 1 # 计数为1,不用修改文件
quit()
return n
# 文件伪装部分:
def camouflage():
os.remove(old_address)
os.rename(new_address, old_address)
# 执行部分:
if main(switch) != 1: # 返回值为n,若n的计数为1,不用修改文件(也就不用进行伪装部分),否则,进行修改文件,而且下一步要进行文件伪装的操作
camouflage()
# 通讯录功能函数
def func1():
# 信息写入
with open(old_address, mode='at', encoding='utf-8') as f1:
res = write_infomation()
if res:
f1.write(res)
print("保存成功!")
def func2():
per_info_list = []
all_info_list = []
while True:
funcnum = input('1.查看通讯录中所有信息\n2.查看某人的信息\n--->').strip()
if funcnum == '1':
if date_is_empty():
print("通讯录暂无信息")
return None
with open(old_address, mode='rt', encoding='utf-8') as f1:
for line in f1:
list1 = line.strip().split("---") # [姓名-per_name, 手机号-phone_num, 邮箱-per_email, 地址-per_address]
for i in range(4):
per_info_list.append(
list1[i].split('-')[1]) # 将列表中的第二个元素添加到--->个人列表中, 如:[姓名, per_name] 中的per_name
all_info_list.append(list1)
print(all_info_list) # 显示所有信息
return quit()
if funcnum == '2':
if date_is_empty():
print("通讯录暂无信息")
return None
name = input("被查询者的姓名:").strip()
if is_exist(name):
print(is_exist(name, 2))
return quit()
print("查询失败!通讯录中查无此人")
return quit()
print("输入有误,请重试!")
def func3():
change_or_delete(1)
def func4():
change_or_delete(2)
# 手机通讯录’核心‘执行函数
def address_book():
print("欢迎使用手机通讯录")
while True:
print("\n<<功能列表>>")
for i in program:
print(f"{i}:{program[i]}")
funcnum = input("请输入功能号>>").strip()
if funcnum == '1':
func1()
continue
if funcnum == '2':
func2()
continue
if funcnum == '3':
func3()
continue
if funcnum == '4':
func4()
continue
if funcnum == '5':
while True:
num = input("是否真的清空通讯录?数据不可恢复,请慎重考虑!\n1.Yes 2.No\n").strip()
if num == '1':
with open(old_address, 'at', encoding='utf-8') as f1:
f1.seek(0)
f1.truncate() # 清空--此刻光标所在位置之后的内容
print('已清空通讯录!')
break
if num == '2':
print('已取消——清空命令')
break
print("输入有误,请重试!")
continue
if funcnum == '6':
break
print("输入错误,请重新尝试!")
if __name__ == '__main__':
address_book()
案例4: 星期类单词识别
# 方法一
day_dict_1 = {'m': 'Monday', 'w': 'Wednesday', 'f': 'Friday'}
day_dict_2 = {'tu': 'Tuesday', 'th': 'Thursday', 'sa': 'saturday', 'su': 'Sunday'}
def func1():
while True:
# 先解决一个字母的
one = input("请输入第一个字母:").strip()
one = one.lower() # 将字母化为小写的形式
for i in day_dict_1:
if one == i:
print(day_dict_1[i])
return None
else:
if one.lower() in 'ts':
two = input("请输入第二个字母:")
two = two.lower() # 将字母化为小写的形式
for i in day_dict_2:
if one + two == i:
print(day_dict_2[i])
return None
else:
print("第二次输入有误")
continue
print('第一次输入有误')
if input('"1"键退出,否则继续') == '1':
return None
# 方法二
list = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'saturday', 'Sunday']
list_head1 = ['m', 'tu', 'w', 'th', 'f', 'sa', 'su']
def func2():
while True:
first = input('请输入第一个字母:').strip()
for i in list_head1:
if first.lower() in i:
if first.lower() == i:
print(list[list_head1.index(i)])
return None
second = input('请输入第二个字母:').strip()
if second.lower() in 'uhau':
print(list[list_head1.index(first.lower() + second.lower())])
return None
else:
print('输入有误!')
break
if input('输入有误!\n"1"键退出,否则继续\n--->').strip() == '1':
break
# 48-57 65-90 97-122
if __name__ == '__main__':
func1()
func2()
案例5: 电子钱包
# 电子钱包功能
def login():
print('执行登录功能')
def scan():
print('执行扫描功能')
def transfer():
print('执行转账功能')
def query():
print('执行余额查询功能')
func_dic = \
{
'0': (None, '退出'),
'po': (login, '登录'),
'2': (scan, '扫描'),
'3': (transfer, '转账'),
'4': (query, '余额查询')
}
while True:
# 显示功能界面
for line in func_dic:
print(line, func_dic[line][1])
# 获取功能号
num = input('请输入功能号>>>')
# 判断并执行功能
if num == '0':
break
if num not in func_dic:
print('此功能不存在,小傻瓜!')
continue
func_dic[num][0]()
案例6: 随机分配办公室
import random
name = 'ABCDEF'
elist = [[], [], []]
for i in name:
elist[random.randint(0, 2)].append(i)
for i in elist:
print(f"第{elist.index(i) + 1}组:{i}")
案例7: 递归之二分法寻找目标
def find(the_list):
if len(the_list) == 1:
if the_list[0] == num:
print('恭喜,找到了!')
else:
print('很遗憾,找不到!')
return
else:
the_num = int(len(the_list) / 2)
if the_list[the_num] > num:
ll = the_list[:the_num:]
find(ll)
elif the_list[the_num] < num:
ll = the_list[the_num::]
find(ll)
else:
print('恭喜,找到了!')
return
lt = [1, 8, 9, 5, 6, 5, 9, 8, 1, 55, 0, -1, 95, 20, -9]
lt.sort()
while True:
num = int(input('请输入您想要从列表里找的数:').strip())
find(lt)