Minecraft程序猿 发表于 2020-12-30 21:39:59

给同学做的阶段考核(自我出题)程序案例

本帖最后由 Minecraft程序猿 于 2020-12-31 21:17 编辑

最近教同学Python,前几天给他做了一套阶段考核(p.s.只有一道综合题,命令行界面的(但有tkinter文件对话框)),今天自己做了一下,PyInstaller打包有9.3M,传不上来,源代码贴在下面,只有只读,只写,颜色切换,退出4个选项,有图标拖动阅读功能
代码量206行(包含注释和空行)
开发周期2小时
欢迎改进和提出建议
from os import system
from os import _exit as exitx
from time import sleep
from tkinter.filedialog import askopenfilename
from tkinter.filedialog import asksaveasfilename
from tkinter import Tk
from sys import argv
import datetime

root = Tk()
root.withdraw() #GUI窗口隐藏

#初始化环境
system("title 记事本案例")
system("color a")

#预打开文件(图标拖动)
def preopen(name):
    system("cls")
    print("当前文件:"+name+"\t打开模式MODE:0\n")
    curr_time = datetime.datetime.now()
    time_str = datetime.datetime.strftime(curr_time,'%Y年%m月%d日 %H:%M:%S')
    print(time_str,"\t[只读]")
    print('----------------------------------------\n')
    try:
      with open(name,'r') as f:
            i = 1
            for each_line in f:
                if i < 10:
                  print('0'+str(i)+'| ',end='')
                else:
                  print(str(i)+'| ',end='')
                print(each_line,end='')
                i += 1
    except:
      print("\n出现错误,请检查该文件编码格式和程序运行权限然后重试\n")
    print("\n----------------------------------------\n")
    key = input("程序重获焦点后\n输入任意字符以返回> ")
    system("cls")

#主函数(配合循环错误处理)
def main():

    #嵌套"打开","写入","颜色修改"等功能函数
    def opens():
      system("cls")
      name = askopenfilename()
      print("当前文件:"+name+"\t打开模式MODE:0\n")
      curr_time = datetime.datetime.now()
      time_str = datetime.datetime.strftime(curr_time,'%Y年%m月%d日 %H:%M:%S')
      print(time_str,"\t[只读]")
      print('----------------------------------------\n')
      try:
            with open(name,'r') as f:
                i = 1
                for each_line in f:
                  if i < 10:
                        print('0'+str(i)+'| ',end='')
                  else:
                        print(str(i)+'| ',end='')
                  print(each_line,end='')
                  i += 1
      except:
            print("\n出现错误,请检查该文件编码格式和程序运行权限然后重试\n")
      print("\n----------------------------------------\n")
      key = input("程序重获焦点后\n输入任意字符以返回> ")
      system("cls")

    def writes():
      system("cls")
      print("写入模式MODE:1\n\n输入\":q! \"\t退出\n输入\":wq!\"\t保存并退出\n")
      curr_time = datetime.datetime.now()
      time_str = datetime.datetime.strftime(curr_time,'%Y年%m月%d日 %H:%M:%S')
      print(time_str,'\t[只写]')
      print('----------------------------------------\n')
      listx = []
      i = 1
      while True:
            if i < 10:
                print('0'+str(i)+'| ',end='')
            else:
                print(str(i)+'| ',end='')
            lines = input('')
            if lines == ":q!":
                break
            elif lines == ":wq!":
                allx = ""
                for each in listx:
                  allx += (each+'\n')
                while True:
                  name = asksaveasfilename(initialfile= '新建文本文档', \
                                          defaultextension = '.txt',\
                                          filetypes = [(r'文本文档(*.txt)','.txt'),(r'Microsoft Word文档(*.doc)','.doc'), (r'所有文件(*.*)', '.*')])
                  if name == '':
                        continue
                  else:
                        with open(name,'w') as f:
                            try:
                              f.write(allx)
                            except PermissionError:
                              print("\n\n当前无法保存文件到该位置,请重新选择位置或以管理员身份运行此程序!")
                              sleep(2)
                              continue
                        break
                curr_time = datetime.datetime.now()
                time_str = datetime.datetime.strftime(curr_time,'%Y年%m月%d日 %H:%M:%S')
                print("已写入到"+name+'\n')
                print(time_str)
                sleep(2)
                system("cls")
                break
            else:
                listx.append(lines)
                i += 1

    def colors():
      system("cls")
      print("""颜色属性由两个十六进制数字指定 -- 第一个
对应于背景,第二个对应于前景。每个数字
可以为以下任何值:

    0 = 黑色       8 = 灰色
    1 = 蓝色       9 = 淡蓝色
    2 = 绿色       A = 淡绿色
    3 = 浅绿色   B = 淡浅绿色
    4 = 红色       C = 淡红色
    5 = 紫色       D = 淡紫色
    6 = 黄色       E = 淡黄色
    7 = 白色       F = 亮白色

如果尝试使用相同的
前景和背景颜色来执行
程序会将 ERRORLEVEL 设置为 1

示例: "fc" 在亮白色上产生淡红色
""")
      while True:
            c = input(r"输入对应颜色代码(不区分大小写)> ")
            if (c == '') or (c == ' ') or (c == '\t'):
                print("输入有误,不得使用空字符,请重新输入")
            else:
                system("color " + c)
                print("\n设置成功!")
                break
      key = input("输入任意字符以返回> ")
      system("cls")

    system("cls")
    print("""


         ##############################
         #                            #
         #    记事本--阶段考核案例    #
         #                            #
         # -------------------------- #
         #       打开模式         #
         #       写入模式         #
         # -------------------------- #
         #       退出程序         #
         ##############################

在初运行程序和关闭选择文件窗口后且程序运行窗口失去焦点时请使程序重新获得焦点(鼠标选择或键盘切换)

""")
    #循环模式接收判断
    while True:
      mode = input("请选择模式(0~3)> ")
      if mode == '0':
            opens()
            break
      elif mode == '1':
            writes()
            break
      elif mode == '2':
            colors()
            break
      elif mode == '3':
            exitx(0)
      else:
            continue

#预打开文件参数判断
try:
    if argv == '':
      pass
    else:
      preopen(argv)
except:
    pass

#循环报错处理
while True:
    try:
      main()
    except:
      system("cls")
      print("\n\n\n         程序出错了哦\n         即将重启程序! 5",end='')
      times = 4
      while times != -1:
            sleep(1)
            print('\r         即将重启程序! '+str(times),end='')
            times -= 1
      main()

root.mainloop()

#2020.12.30 (Wed) 21:15
#Logic
页: [1]
查看完整版本: 给同学做的阶段考核(自我出题)程序案例