python菜单栏_python作业1 登入程序和菜单栏

1输入用户名密码

认证成功后显示欢迎信息

输错三次后锁定

2多级菜单

三级菜单

可依次选择进入各子菜单

所需新知识:列表,字典

要求:readme文件,告诉别人如何使用你的程序

代码加注释,让别人读懂

目录结构符合规范

第一题:

#_*_ coding:utf-8 _*_

import sys,os,getpass

os.system('clear')

retry_limit = 3

retry_count = 0

account_file = 'account.txt'

lock_file = 'account_lock.txt'

while retry_count < retry_limit:

#只要重试不超过3次就不断循环

username

= raw_input('\033[31;43mUsername:\033[0m')

username

= username.strip()

lock_check = open(lock_file) #当用户输入用户名后,打开LOCK 文件 以检查是否此用户已经LOCK了

for line

in lock_check.readlines(): #循环LOCK文件

if username ==

line.strip('\n'): #去掉换行符

sys.exit('\033[35mUser %s is locked!!!\033[0m' %

username) #如果LOCK了就直接退出

password

= raw_input('\033[32;41mPassword:\033[0m') #输入密码

f =

open(account_file,'r') #打开帐号文件

match_flag = False # 默认为Flase,如果用户match 上了,就设置为

True

for line

in f.readlines():

user,passwd =

line.strip('\n').split() #去掉每行多余的\n并把这一行按空格分成两列,分别赋值为user,passwd两个变量

if username == user and

password == passwd: #判断用户名和密码是否都相等

print('hello, %s !!' % username)

match_flag = True #相等就把循环外的match_flag变量改为了True

break #然后就不用继续循环了,直接

跳出,因为已经match上了

f.close()

if

match_flag == False: #如果match_flag还为False,代表上面的循环中跟本就没有match上用户名和密码,所以需要继续循环

print('sorry,%s is unmatched'

% username)

retry_count += 1

#计数器加1

else:

print('wlecome login my

learning system!')

break #用户成功登录,退出脚本

else:

print("you account %s is locked!!!" % username)

g =

open(lock_file,'a')

g.write(username) #被锁用户追加到用户锁文件

g.write('\n')

g.close()

第二题:

#!/usr/bin/python27

#_*_ coding:utf-8 _*_

import sys,os,re,yaml,time

reload(sys)

sys.setdefaultencoding('utf-8')

######################对raw_input输入字符类型判断并转化#####################

def input_handle(s):

if str.isdigit(s): ###对输入是否是数字进行判断

s = int(s) ###如果输出的是个数字,则转化为整数类型

else:

s = s.decode('utf-8') ###如果是字符串或汉字,则转化为unicode类型(主要是针对汉字转化,汉字默认是str)

return s

# try:

# eval_r(s) ###eval将字符串str当成有效的表达式来求值并返回计算结果

# except NameError: ###名称错误

# return s

# except SyntaxError: ###语法错误

# return s

# else:

# return eval_r(s)

####################框架函数######################

def framework(province='',city='',county=''):

os.system('clear') ###清屏###

print('''

******************************************************************

* *

* 欢迎访问全国省市查询系统 *

* *

******************************************************************

+-----------------------------------------------------------------

| 省份: %s

|

| 市(区): %s

|

| 县(区): %s

+-----------------------------------------------------------------

''' % (province,city,county))

######################输出展示函数#################

def show(province_name='',city_name='',county_name=''):

output= '''

******************************************************************

* *

美丽的%s %s %s

* 欢迎您 *

这里的山美,水美,妹子更美

* *

******************************************************************

'''

print output % (province_name,city_name,county_name)

sys.exit('欢迎下次使用,再见')

###################菜单第一层省份或直辖市输出函数#################

def province_show(province_list):

############申明全局变量####################

global P_NAME

global C_NAME

global X_NAME

global FLAG_M

province_dict = {}

############对省份或直辖市列表参数进行遍历并加上数字编号###############

for k,v in enumerate(province_list,1):

province_dict[k] = v

print '%d . %s' % (k,v) + '\t', ###末尾加',',取消默认换行###

if k % 4 == 0: ###按4列换行###

print

print('\n================================================================')

print('q : Exit')

###############键盘读入编号或省份,可以输入汉字#################

province_index = raw_input('请输入编号或省份 : ')

###############如果输入非空,对输入进行判断并转化类型###########

if len(province_index) != 0:

province_index = input_handle(province_index)

if province_index == 'q': ###如果输入为q,则退出程序###

sys.exit(0)

elif province_index in province_dict.keys(): ###如果输入为数字编号,则从字典中获取具体省份或直辖市名称###

P_NAME = province_dict[province_index] ###对全局变量赋值省份名称###

elif province_index in province_dict.values(): ###如果输入为具体省份,则从字典中获取具体省份或直辖市名称###

P_NAME = province_index ###对全局变量赋值省份名称###

else:

P_NAME = '' ###输入其他字符,赋值全局变量为空###

while P_NAME: ###全局变量不为空进行循环###

framework(P_NAME,C_NAME,X_NAME) ###调用框架###

if type(yaml_dict[P_NAME]) is list:

city_show(P_NAME) ###调用城市函数,并传入省份值###

if FLAG_M == 'b': ###城市函数输入b,返回上一层,重新选择省份###

break

else:

show(P_NAME) ###调用输出展示函数###

time.sleep(5)

P_NAME = ''

break

else:

print('输入错误,请重新输入!') ###P_NAME为空,即输入错误,重新输入###

time.sleep(2)

##############菜单第二层城市输出函数#######################

def city_show(province_name):

############申明全局变量###############

global P_NAME

global C_NAME

global X_NAME

global FLAG_M

city_name = '' ###定义城市变量默认为空###

city_list = yaml_dict[province_name] ###定义赋值城市列表###

city_dict = {} ###定义城市编号和名称字典###

city_county_dict = {} ###定义地级市和下属区县字典###

############对城市列表参数进行遍历并加上数字编号###############

for k,v in enumerate(city_list,1):

if type(v) is unicode: ###直辖市只有二层菜单,第二层为直接的各区或县,值类型为具体字符unicode###

city_dict[k] = v ###对直辖市下的区或县进行新字典赋值,方便查询和展示###

print '%d . %s' % (k,v) + '\t', ###末尾加',',取消默认换行###

elif type(v) is dict: ###其他省份有三层菜单,第二层为各地级市,值类型字典###

for kk,vv in v.items(): ###对地级市的字典进行遍历###

city_dict[k] = kk ###对其他省份下的地级市进行新字典赋值,方便查询和展示###

city_county_dict[kk] = vv ###对二层地级市和三层县市重新赋值新字典###

print '%d . %s' % (k,kk) + '\t', ###末尾加',',取消默认换行###

else:

pass

if k % 4 == 0: ###按4列换行###

print

print('\n================================================================')

print('q : Exit b : Back')

###############键盘读入编号或区市,可以输入汉字#################

city_index = raw_input('请输入编号或区市 : ')

###############如果输入非空,对输入进行判断并转化类型###########

if len(city_index) != 0:

city_index = input_handle(city_index)

if city_index == 'q': ###如果输入为q,则退出程序###

sys.exit(0)

elif city_index == 'b': ###如果输入为b,则返回上一层,重新选择省份或直辖市###

(P_NAME,C_NAME,FLAG_M) = ('','','b') ###全局变量P_NAME,C_NAME设置为空,FLAG_M设置为b,则返回上一层###

return ###直接返回,不进行函数以下的操作###

elif city_index in city_dict.keys(): ###如果输入为数字编号,则从字典中获取具体城市名称###

city_name = city_dict[city_index] ###赋值地级市的名称,并对全局变量进行赋值###

(P_NAME,C_NAME,FLAG_M) = (province_name,city_name,'')

elif city_index in city_dict.values(): ###如果输入为城市名称,则从字典中获取具体省份名称###

city_name = city_index ###赋值地级市的名称,并对全局变量进行赋值###

(P_NAME,C_NAME,FLAG_M) = (province_name,city_name,'')

else:

pass ###如果输入其他字符,则不做任何操作###

if city_name: ###如果地级市名字不为空,即键盘输入为要求字符###

if city_name in city_county_dict.keys(): ###判断是省份的地级市名字###

while C_NAME: ###环境变量C_NAME不为空###

framework(P_NAME,C_NAME,X_NAME) ###调用框架函数,并将省份名字和地级市名字传入###

###调用三层区县显示函数,并传入具体变量###

county_show(P_NAME,C_NAME,city_county_dict[city_name])

if FLAG_N == 'b': ###三层区县函数输入b,返回上一层,重新选择地级市###

break

else:

print('输入错误,请重新输入!') ###C_NAME为空,即输入错误,重新输入###

time.sleep(2)

else: ###判断是直辖市的区或县名字###

show(P_NAME,C_NAME) ###调用输出展示函数###

time.sleep(5)

else: ###输入非要求字符,提示重新输入###

print('输入错误,请重新输入!')

time.sleep(2)

##############菜单第三层区县输出函数#######################

def county_show(province_name,city_name,county_list):

############申明全局变量####################

global P_NAME

global C_NAME

global X_NAME

global FLAG_N

county_name = '' ###定义三级区县变量默认为空###

county_dict = {} ##定义赋值区县字典###

############对区县列表参数进行遍历并加上数字编号###############

for k,v in enumerate(county_list,1):

if type(v) is unicode: ###第三层为直接的各区或县,值类型为具体字符unicode###

county_dict[k] = v ###对区或县进行新字典赋值,方便查询和展示###

print '%d . %s' % (k,v) + '\t', ###末尾加',',取消默认换行###

if k % 4 == 0: ###按4列换行###

print

print('\n================================================================')

print('q : Exit b : Back')

###############键盘读入编号或区县,可以输入汉字#################

county_index = raw_input('请输入编号或区县 : ')

###############如果输入非空,对输入进行判断并转化类型###########

if len(county_index) != 0:

county_index = input_handle(county_index)

if county_index == 'q': ###如果输入为q,则退出程序###

sys.exit(0)

elif county_index == 'b': ###如果输入为b,则返回上一层,重新选择第二层地级市###

(P_NAME,C_NAME,X_NAME,FLAG_N) = (province_name,'','','b') ###全局变量C_NAME设置为空,FLAG_M设置为b,则返回上一层###

return ###直接返回,不进行函数以下的操作###

elif county_index in county_dict.keys(): ###如果输入为数字编号,则从字典中获取具体区县名称###

county_name = county_dict[county_index] ###赋值区县的名称,并对全局变量进行赋值###

(P_NAME,C_NAME,X_NAME,FLAG_N) = (province_name,city_name,county_name,'')

elif county_index in county_dict.values(): ###如果输入为区县名称,则从字典中获取具体区县名称###

county_name = county_index ###赋值区县的名称,并对全局变量进行赋值###

(P_NAME,C_NAME,X_NAME,FLAG_N) = (province_name,city_name,county_name,'')

else: ###如果输入其他字符,则不做任何操作###

(P_NAME,C_NAME,X_NAME,FLAG_N) = (province_name,city_name,'','')

if county_name: ###如果区县名字不为空,即键盘输入为要求字符###

show(P_NAME,C_NAME,X_NAME) ###调用输出展示函数###

time.sleep(5)

else:

print('输入错误,请重新输入!') ###输入非要求字符,提示重新输入###

time.sleep(2)

##########################################主程序###############################

###############读取yaml格式文件#######################

fd = open(sys.argv[1],'rb')

yaml_dict = yaml.load(fd)

###############定义全局变量###########################

P_NAME = '' ###省份或直辖市全局变量###

C_NAME = '' ###各省地级市或直辖市区县的全局变量###

X_NAME = '' ###各省地级市下的区或县 全局变量###

FLAG_M = '' ###退出菜单第二层,返回上一层循环的变量###

FLAG_N = '' ###退出菜单第三层,返回上一层循环的变量###

###############获取省份或直辖市的列表#################

prov_list = yaml_dict.keys()

###############主循环开始#############################

while True:

framework(P_NAME,C_NAME,X_NAME) ###调用框架函数,显示初始状态###

province_show(prov_list) ###调用第一层省份或直辖市输出函数###

三层菜单python2.7

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值