diff --git "a/01_base/347円273円203円344円271円240円/344円271円235円344円271円235円344円271円230円346円263円225円350円241円250円.py" "b/01_base/347円273円203円344円271円240円/344円271円235円344円271円235円344円271円230円346円263円225円350円241円250円.py" new file mode 100644 index 0000000..5cfc364 --- /dev/null +++ "b/01_base/347円273円203円344円271円240円/344円271円235円344円271円235円344円271円230円346円263円225円350円241円250円.py" @@ -0,0 +1,40 @@ +'''要求使用循环代码打印一个九九乘法表出来.如下 +1*1=1 + +1*2=2 2*2=4 + +1*3=3 2*3=6 3*3=9 + +1*4=4 2*4=8 3*4=12 4*4=16 + +1*5=5 2*5=10 3*5=15 4*5=20 5*5=25 + +1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36 + +1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49 + +1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64 + +1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81 + +''' + + + + + + +#方法二 +i=1 +while i<10: #控制行,1到9 + j=1 + while j <= i: #控制每行显示的数量,1到9 + print("%d*%d=%d"%(j,i,i*j),end=' ') #输出 + j+=1 #每行显示的数量加1 + print("\n") #每一行结束换行 + i+=1 #行数加1 + +for i in range(1,10): + print() + for j in range(1,i+1): + print('%d*%d=%d' % (j,i,i*j),end=' ') \ No newline at end of file diff --git "a/01_base/347円273円203円344円271円240円/345円206円222円346円263円241円346円216円222円345円272円217円.py" "b/01_base/347円273円203円344円271円240円/345円206円222円346円263円241円346円216円222円345円272円217円.py" new file mode 100644 index 0000000..c7c47d3 --- /dev/null +++ "b/01_base/347円273円203円344円271円240円/345円206円222円346円263円241円346円216円222円345円272円217円.py" @@ -0,0 +1,12 @@ +''' +给定一个列表,请你对列表的元素进行 从大到小排序 与从小到大排序 +''' + + +list1 = [13, 22, 6, 99, 11, 0] + +for a in range(len(list1)): + for b in range(a,len(list1)): + if list1[a] < list1[b]: #如果m大于了n + list1[a] ,list1[b] = list1[b],list1[a]#交换位置 +print(list1) \ No newline at end of file diff --git "a/01_base/347円273円203円344円271円240円/345円225円206円344円275円231円351円227円256円351円242円230円.py" "b/01_base/347円273円203円344円271円240円/345円225円206円344円275円231円351円227円256円351円242円230円.py" new file mode 100644 index 0000000..bf96036 --- /dev/null +++ "b/01_base/347円273円203円344円271円240円/345円225円206円344円275円231円351円227円256円351円242円230円.py" @@ -0,0 +1,21 @@ +''' +学校有440人参加考试,1号考场有80个座位,要求座位号为0101--0180 +后面每个考场40个座位: +2号考场考试号要求为0201--0240 +3号考场考试号要求为0301--0440 +后续考场以此类推,请你打印出来这些考场号吧 + +起始代码: +for i in range(1,440): + +''' + + +for i in range(1,440): + if i <= 80 : + print('01{:0>2d}'.format(i)) + elif i <= 440: + if i%40 == 0: + print('{:0>2d}{:0>2d}'.format(i//40-1,40)) + else: + print('{:0>2d}{:0>2d}'.format(i//40,i%40)) \ No newline at end of file diff --git "a/01_base/347円273円203円344円271円240円/345円244円247円346円225円260円345円210円206円350円247円243円.py" "b/01_base/347円273円203円344円271円240円/345円244円247円346円225円260円345円210円206円350円247円243円.py" new file mode 100644 index 0000000..f9310b4 --- /dev/null +++ "b/01_base/347円273円203円344円271円240円/345円244円247円346円225円260円345円210円206円350円247円243円.py" @@ -0,0 +1,14 @@ +'''每个数字可以写成多个质数的乘积,给定一个数字,请你分解为多个质数''' + +def fun(num, list=None): + if list is None: + list = [] + for i in range(2, num): + while num % i == 0: + list.append(i) + num = int(num / i) + if num> 1: + fun(num) + return list +x = 9*5 +print(fun(x)) \ No newline at end of file diff --git "a/01_base/347円273円203円344円271円240円/345円271円263円346円226円271円345円222円214円351円227円256円351円242円230円.py" "b/01_base/347円273円203円344円271円240円/345円271円263円346円226円271円345円222円214円351円227円256円351円242円230円.py" new file mode 100644 index 0000000..903b12a --- /dev/null +++ "b/01_base/347円273円203円344円271円240円/345円271円263円346円226円271円345円222円214円351円227円256円351円242円230円.py" @@ -0,0 +1,5 @@ +'''两个数字的平方和是2022,请问这2个数分别是多少''' + +for a in range(1,2022): + if (2022 - a*a)**0.5 in range(1,2022): + print(a) \ No newline at end of file diff --git "a/01_base/347円273円203円344円271円240円/346円212円275円345円245円226円.py" "b/01_base/347円273円203円344円271円240円/346円212円275円345円245円226円.py" new file mode 100644 index 0000000..01b3da3 --- /dev/null +++ "b/01_base/347円273円203円344円271円240円/346円212円275円345円245円226円.py" @@ -0,0 +1,35 @@ +"""名单 = ['叶子','月娜','娜月','月叶','叶月','叶娜','月子','娜叶','娜子'] +mychoice(名单) +打卡要求:风变科技计划抽一次年终奖 +特等奖:1个组合课学习资格 +一等奖:2个电饭煲 +二等奖:4本python书 +请你根据提示写出具有对应功能的代码""" + + +def mychoice(名单): + import random + 中奖人员 = random.choice(名单) # 随机抽取一个元素 + print(中奖人员) # 打印出结果 + 名单.remove(中奖人员) # 从名单中移除中奖人员【这样一个人就只能抽到一次】 + + +名单 = ['叶子', '月娜', '月娜2', '月娜3', '月娜4', '月娜5', '月娜6', '月娜7', '月娜8'] + +# for i in range(4): #奖品的等级 +# if i == 0: # 一等奖 +# print('恭喜以下同学获得:图书') +# for i in range(2): #抽几个 +# mychoice(名单) +# elif i == 1: # 二等奖 +# print('恭喜以下同学获得:xxxx') +# for i in range(5): #抽几个 +# mychoice(名单) +# elif i == 2:# 三等奖 +# print('恭喜以下同学获得:XXX') +# for i in range(3):#抽几个 +# mychoice(名单) +# else: +# print('恭喜以下同学获得:XXX') +# for i in range(3):#抽几个 +# mychoice(名单) \ No newline at end of file diff --git "a/01_base/347円273円203円344円271円240円/346円225円260円347円276円212円351円227円256円351円242円230円.py" "b/01_base/347円273円203円344円271円240円/346円225円260円347円276円212円351円227円256円351円242円230円.py" new file mode 100644 index 0000000..9ef606f --- /dev/null +++ "b/01_base/347円273円203円344円271円240円/346円225円260円347円276円212円351円227円256円351円242円230円.py" @@ -0,0 +1,31 @@ +''' +编写一段代码,模拟我们数羊到入睡的过程: + + +每数五只羊,就提问一次:睡着了吗? +如果没有睡着,继续循环,并打印"继续数羊"。 +如果睡着了,则停止循环,并打印"终于睡着了"。 +''' + + +i = 0 +while True: + i += 1 + left_endpoint = 1 + 5 * ( i - 1 ) + right_endpoint = 1 + 5 * i + for i in range(left_endpoint, right_endpoint): + print(str(i)+'只羊') + answer = input('睡着了吗?回答是或否:') + if answer == '是': + break + print('继续数羊') +print('终于睡着了') + +#方法二 +睡觉的状态 = '还没睡' +a = 0 +while 睡觉的状态 != '睡着': # 只要不是睡着,就继续数 + a +=1 + print(str(a)+'只羊') + if a%9 == 0 : # %是取余数 每次数5只羊 + 睡觉的状态 = input('睡着了嘛?') \ No newline at end of file diff --git "a/01_base/347円273円203円344円271円240円/346円227円266円351円222円237円351円227円256円351円242円230円.py" "b/01_base/347円273円203円344円271円240円/346円227円266円351円222円237円351円227円256円351円242円230円.py" new file mode 100644 index 0000000..73d4d51 --- /dev/null +++ "b/01_base/347円273円203円344円271円240円/346円227円266円351円222円237円351円227円256円351円242円230円.py" @@ -0,0 +1,17 @@ +''' +请从00:00依次打印出一天的时间 +示例: +23 : 52 +23 : 53 +23 : 54 +23 : 55 +23 : 56 +23 : 57 +23 : 58 +23 : 59 +''' + + +for 时钟 in range(24): + for 分钟 in range(60): + print(时钟, ':', 分钟) diff --git "a/01_base/347円273円203円344円271円240円/346円237円245円346円227円240円346円255円244円344円272円272円-345円210円227円350円241円250円347円211円210円.py" "b/01_base/347円273円203円344円271円240円/346円237円245円346円227円240円346円255円244円344円272円272円-345円210円227円350円241円250円347円211円210円.py" new file mode 100644 index 0000000..1fa447c --- /dev/null +++ "b/01_base/347円273円203円344円271円240円/346円237円245円346円227円240円346円255円244円344円272円272円-345円210円227円350円241円250円347円211円210円.py" @@ -0,0 +1,31 @@ +""" +小明拿到了一个电影+演员的数据名单,他想设计一个程序,要求: +1.输入演员名 +2.如果演员出演了电影,则打印他+他出演的全部电影。程序结束 +3.如果演员没有出演电影,则打印查无此人。程序继续 +电影 = [ +'妖猫传',['黄轩','染谷将太'], +'无问西东',['章子怡','王力宏','祖峰'], +'超时空同居',['雷佳音','佟丽娅','黄轩']] +""" + + + +电影 = [ +'妖猫传',['黄轩','染谷将太'], +'无问西东',['章子怡','王力宏','祖峰'], +'超时空同居',['雷佳音','佟丽娅','黄轩']] +# 如果查到了:打印出演员+【所有的】电影,循环结束 +# 如果没查到,就 循环继续,并且打印【查无此人】 +找到了吗 = 0 +while True: + name = input('你要找的演员') + for i in 电影: + if name not in i : + a = i #暂存---for 是逐一提取数据,并赋值 + else: + print(name,'出演了',a) + 找到了吗 += 1 + if 找到了吗 != 0 : # 不等于 0 就代表它找到了 + break + print('【查无此人】') # 1号位 \ No newline at end of file diff --git "a/01_base/347円273円203円344円271円240円/346円257円217円346円254円241円346円212円275円350円265円260円345円245円207円346円225円260円.py" "b/01_base/347円273円203円344円271円240円/346円257円217円346円254円241円346円212円275円350円265円260円345円245円207円346円225円260円.py" new file mode 100644 index 0000000..c68317f --- /dev/null +++ "b/01_base/347円273円203円344円271円240円/346円257円217円346円254円241円346円212円275円350円265円260円345円245円207円346円225円260円.py" @@ -0,0 +1,12 @@ +''' +要求:0-100,每次抽走奇数,打印剩余的那个数字 +''' + +aList = [] +for i in range(0,2023): + aList.append(i) + +while len(aList)>1: + aList = aList[1::2] + print(aList) +print(aList) \ No newline at end of file diff --git "a/02_advanced/347円273円203円344円271円240円/TheStrayLibrary/README.md" "b/02_advanced/347円273円203円344円271円240円/TheStrayLibrary/README.md" new file mode 100644 index 0000000..b7dfea1 --- /dev/null +++ "b/02_advanced/347円273円203円344円271円240円/TheStrayLibrary/README.md" @@ -0,0 +1,17 @@ +# StrayLibrary +``` +Use python to create StrayLibrary. +``` + +# Mybog +https://www.jiangmiemie.com + +# Usage +``` +Configure the operating environment, and the run "StrayLibrary.py". +``` + +# Game Display +![img](StrayLibrary/01.png) +![img](StrayLibrary/02.png) +![img](StrayLibrary/03.png) \ No newline at end of file diff --git "a/02_advanced/347円273円203円344円271円240円/TheStrayLibrary/StrayLibrary.py" "b/02_advanced/347円273円203円344円271円240円/TheStrayLibrary/StrayLibrary.py" new file mode 100644 index 0000000..d8281fa --- /dev/null +++ "b/02_advanced/347円273円203円344円271円240円/TheStrayLibrary/StrayLibrary.py" @@ -0,0 +1,7 @@ +if __name__ == '__main__': + from utils import * +else: + from .utils import * + +database.bulildmysql() #创建数据库 +gui_start() #启动程序 \ No newline at end of file diff --git "a/02_advanced/347円273円203円344円271円240円/TheStrayLibrary/StrayLibrary/01.png" "b/02_advanced/347円273円203円344円271円240円/TheStrayLibrary/StrayLibrary/01.png" new file mode 100644 index 0000000..5b379d1 Binary files /dev/null and "b/02_advanced/347円273円203円344円271円240円/TheStrayLibrary/StrayLibrary/01.png" differ diff --git "a/02_advanced/347円273円203円344円271円240円/TheStrayLibrary/StrayLibrary/02.png" "b/02_advanced/347円273円203円344円271円240円/TheStrayLibrary/StrayLibrary/02.png" new file mode 100644 index 0000000..33dab0d Binary files /dev/null and "b/02_advanced/347円273円203円344円271円240円/TheStrayLibrary/StrayLibrary/02.png" differ diff --git "a/02_advanced/347円273円203円344円271円240円/TheStrayLibrary/StrayLibrary/03.png" "b/02_advanced/347円273円203円344円271円240円/TheStrayLibrary/StrayLibrary/03.png" new file mode 100644 index 0000000..d9cf7be Binary files /dev/null and "b/02_advanced/347円273円203円344円271円240円/TheStrayLibrary/StrayLibrary/03.png" differ diff --git "a/02_advanced/347円273円203円344円271円240円/TheStrayLibrary/StrayLibrary/book.db" "b/02_advanced/347円273円203円344円271円240円/TheStrayLibrary/StrayLibrary/book.db" new file mode 100644 index 0000000..33b47c8 Binary files /dev/null and "b/02_advanced/347円273円203円344円271円240円/TheStrayLibrary/StrayLibrary/book.db" differ diff --git "a/02_advanced/347円273円203円344円271円240円/TheStrayLibrary/utils/__init__.py" "b/02_advanced/347円273円203円344円271円240円/TheStrayLibrary/utils/__init__.py" new file mode 100644 index 0000000..165e0b3 --- /dev/null +++ "b/02_advanced/347円273円203円344円271円240円/TheStrayLibrary/utils/__init__.py" @@ -0,0 +1,2 @@ +from .database import database +from .userthinker import gui_start \ No newline at end of file diff --git "a/02_advanced/347円273円203円344円271円240円/TheStrayLibrary/utils/database.py" "b/02_advanced/347円273円203円344円271円240円/TheStrayLibrary/utils/database.py" new file mode 100644 index 0000000..7ac3245 --- /dev/null +++ "b/02_advanced/347円273円203円344円271円240円/TheStrayLibrary/utils/database.py" @@ -0,0 +1,60 @@ +from tkinter import * +import sqlite3 +import os + +class database(): + def addmysql(name, author, comment, state):#添加数据 + Desktoppath = './StrayLibrary/book.db' + db = sqlite3.connect(Desktoppath)# 使用cursor()方法获取操作游标 + cursor = db.cursor()# SQL 插入语句 + sql = "INSERT INTO EMPLOYEE(name,author,comment,state)VALUES ('{}','{}','{}','{}')".format(name, author, comment, state) + try:# 执行sql语句 + cursor.execute(sql)# 提交到数据库执行 + db.commit() + except:# Rollback in case there is any error + db.rollback() + db.close()# 关闭数据库连接 + + def changemysql(state,name):#更改数据状态 + Desktoppath = './StrayLibrary/book.db' + db = sqlite3.connect(Desktoppath) + cursor = db.cursor()# 使用cursor()方法获取操作游标 + sql = "UPDATE EMPLOYEE SET state = '%s' where name = '%s' "%(state,name) + try: + cursor.execute(sql) + db.commit() + except: + pass + db.close() + + def checkmysql():#检索数据库 + Desktoppath = './StrayLibrary/book.db' + db = sqlite3.connect(Desktoppath) + cursor = db.cursor()# 使用cursor()方法获取操作游标 + sql = "SELECT * FROM EMPLOYEE" # SQL 查询语句 + try: + cursor.execute(sql)# 获取所有记录列表 + results = cursor.fetchall() + return results + except: + pass + db.close() + + def bulildmysql(): + try: + os.makedirs("./StrayLibrary") #创建一个文件夹 + Desktoppath = './StrayLibrary/book.db'#文件夹下创建一个数据库 + file=open(Desktoppath,'w') + file.close() + + db = sqlite3.connect(Desktoppath) + cursor = db.cursor()# 使用cursor()方法获取操作游标 + cursor.execute("DROP TABLE IF EXISTS EMPLOYEE")# 如果数据表已经存在使用 execute() 方法删除表。 + sql = """CREATE TABLE EMPLOYEE (name TEXT(255),author TEXT(255),comment TEXT(255),state TEXT(255))""" + cursor.execute(sql)# 创建数据表SQL语句 + db.close() + database.addmysql('惶然录','费尔南多·佩索阿','一个迷失方向且濒于崩溃的灵魂的自我启示、一首对默默无闻、失败、智慧、困难和沉默的赞美诗。','未借出') + database.addmysql('以箭为翅','简媜','调和空灵文风与禅宗境界,刻画人间之缘起缘灭。像一条柔韧的绳子,情这个字,不知勒痛多少人的心肉。','未借出') + database.addmysql('心是孤独的猎手','卡森·麦卡勒斯','我们渴望倾诉,却从未倾听。女孩、黑人、哑巴、醉鬼、鳏夫的孤独形态各异,却从未退场。','已借出') + except: + pass \ No newline at end of file diff --git "a/02_advanced/347円273円203円344円271円240円/TheStrayLibrary/utils/userthinker.py" "b/02_advanced/347円273円203円344円271円240円/TheStrayLibrary/utils/userthinker.py" new file mode 100644 index 0000000..ae92f34 --- /dev/null +++ "b/02_advanced/347円273円203円344円271円240円/TheStrayLibrary/utils/userthinker.py" @@ -0,0 +1,134 @@ +from tkinter import * +from .database import database as db +''' +提前安装好模块:pip install tkinter-page +需要掌握的知识:Python基础、Mysql命令、os模块、tkinter模块 +''' +class Book(): + def __init__(self, name, author, comment, state): + self.name = name + self.author = author + self.comment = comment + self.state = state + def __str__(self): + return '\n名称:《%s》 \n作者:%s \n推荐语:%s\n状态:%s \n---------' % (self.name, self.author, self.comment,self.state) + +class StrayLibrary(): + books = [] + def __init__(self,init_window_name): + self.init_window_name = init_window_name + results = db.checkmysql() + for row in results: + name = row[0] + author = row[1] + comment = row[2] + state = row[3] + book1 = Book(name, author, comment, state) + self.books.append(book1) + + def set_init_window(self):#设置窗口 + self.init_window_name.title("流浪图书馆(StrayLibrary)") #窗口名 + self.init_window_name.geometry('450x260+10+10') + self.result_data_Text = Text(self.init_window_name, width=35, height=15) #处理结果展示 + self.result_data_Text.grid(row=1, column=12, rowspan=7, columnspan=7) + + self.mianbutton1 = Button(self.init_window_name, text="查询(check)", bg="DodgerBlue", width=20,command=self.show_all_book) # 调用内部方法 加()为直接调用 + self.mianbutton2 = Button(self.init_window_name, text="添加(add)", bg="DodgerBlue",width=20,command=self.add_book) # 调用内部方法 加()为直接调用 + self.mianbutton3 = Button(self.init_window_name, text="借阅(lend)", bg="DodgerBlue", width=20,command=self.lend_book) # 调用内部方法 加()为直接调用 + self.mianbutton4 = Button(self.init_window_name, text="归还(return)", bg="DodgerBlue",width=20,command=self.return_book) # 调用内部方法 加()为直接调用 + self.mianbutton1.grid(row=1, column=11) + self.mianbutton2.grid(row=3, column=11) + self.mianbutton3.grid(row=5, column=11) + self.mianbutton4.grid(row=7, column=11) + + #功能函数 + def show_all_book(self): + self.result_data_Text.delete(0.0,END) + for book in self.books: + self.result_data_Text.insert(1.0,book) + def add_book(self): + top = Tk() + top.title("添加(add)") + top.geometry('300x120+450+10') + self.L1 = Label(top, text="请输入书籍名称:") + self.E1 = Entry(top, bd =5) + self.L2 = Label(top, text="请输入作者名称:") + self.E2 = Entry(top, bd =5) + self.L3 = Label(top, text="请输入书籍推荐语:") + self.E3 = Entry(top, bd =5) + self.L1.place(x=0,y=0) + self.L2.place(x=0,y=30) + self.L3.place(x=0,y=60) + self.E1.place(x=120,y=0) + self.E2.place(x=120,y=30) + self.E3.place(x=120,y=60) + self.B = Button(top, text ="输入完毕请点击确认,无需继续输入请关闭窗口", command = self.add_booking) + self.B.pack(side = BOTTOM) + def add_booking(self): + new_name = self.E1.get() + new_author = self.E2.get() + new_comment = self.E3.get() + self.result_data_Text.delete(0.0,END) + new_book = Book(new_name, new_author, new_comment,'未借出') + self.books.append(new_book) + db.addmysql(new_name, new_author, new_comment,'未借出')#写入数据库 + self.result_data_Text.insert(1.0,new_name+'录入成功!\n') + + def check_book(self,name): + for book in self.books: + if book.name == name: + return book + else: + return None + + def lend_book(self): + toplend = Tk() + toplend.title("借阅(lend)") + toplend.geometry('330x50+450+30') + self.lendE1 = Entry(toplend, bd =5) + self.lendE1 .pack(side = RIGHT) + self.lendB1 = Button(toplend, text ="输入书名,输入完毕请点击", command = self.lend_booking) + self.lendB1.pack(side = LEFT) + + def lend_booking(self): + name = self.lendE1.get() + res = self.check_book(name) + self.result_data_Text.delete(0.0,END) + if res != None: + if res.state == '已借出': + self.result_data_Text.insert(1.0,'你来晚了一步,这本书已经被借走了噢') + else: + res.state = '已借出' + db.changemysql('已借出',res.name) + self.result_data_Text.insert(1.0,'借阅成功,借了不看会变胖噢〜') + else: + self.result_data_Text.insert(1.0,'这本书暂时没有收录在系统里呢') + + def return_book(self): + topreturn = Tk() + topreturn.title("归还(return)") + topreturn.geometry('330x50+450+30') + self.returnE1 = Entry(topreturn, bd =5) + self.returnE1 .pack(side = RIGHT) + self.returnB1 = Button(topreturn, text ="输入书名,完毕请点击", command = self.return_booking) + self.returnB1.pack(side = LEFT) + + def return_booking(self): + name = self.returnE1.get() + res = self.check_book(name)# 调用check_book方法,将返回值赋值给变量res + self.result_data_Text.delete(0.0,END) + if res == None:# 如果返回的是空值,即这本书的书名不在系统里 + self.result_data_Text.insert(1.0,'没有这本书噢,你恐怕输错了书名〜') + else:# 如果返回的是实例对象 + if res.state =='未借出':# 如果实例属性state等于0,即这本书的借阅状态为'未借出' + self.result_data_Text.insert(1.0,'这本书没有被借走,在等待有缘人的垂青呢!') + else: # 如果实例属性state等于1,即状态为'已借出' + self.result_data_Text.insert(1.0,'归还成功!') + res.state ='未借出'# 归还后书籍借阅状态为0,重置为'未借出' + db.changemysql('未借出',res.name) + +def gui_start(): + init_window = Tk() #实例化出一个父窗口 + ZMJ_PORTAL = StrayLibrary(init_window) # 设置根窗口默认属性 + ZMJ_PORTAL.set_init_window() + init_window.mainloop() #父窗口进入事件循环,可以理解为保持窗口运行,否则界面不展示 \ No newline at end of file diff --git "a/02_advanced/347円273円203円344円271円240円/347円261円273円-345円233円276円344円271円246円351円246円206円347円263円273円347円273円237円.py" "b/02_advanced/347円273円203円344円271円240円/347円261円273円-345円233円276円344円271円246円351円246円206円347円263円273円347円273円237円.py" new file mode 100644 index 0000000..943c8a0 --- /dev/null +++ "b/02_advanced/347円273円203円344円271円240円/347円261円273円-345円233円276円344円271円246円351円246円206円347円263円273円347円273円237円.py" @@ -0,0 +1,132 @@ +from tkinter import * +import MySQLdb +'''pip install tkinter-page''' +'''pip install MySQLdb''' +class Book: + def __init__(self, name, author, comment, state = 0): + self.name = name + self.author = author + self.comment = comment + self.state = state + + def __str__(self): + status = '未借出' + if self.state == 1: + status = '已借出' + return '\n名称:《%s》 \n作者:%s \n推荐语:%s\n状态:%s \n---------' % (self.name, self.author, self.comment, status) +class BookManager(): + books = [] + def __init__(self,init_window_name): + self.init_window_name = init_window_name#窗口 + book1 = Book('惶然录','费尔南多·佩索阿','一个迷失方向且濒于崩溃的灵魂的自我启示,一首对默默无闻、失败、智慧、困难和沉默的赞美诗。') + book2 = Book('以箭为翅','简媜','调和空灵文风与禅宗境界,刻画人间之缘起缘灭。像一条柔韧的绳子,情这个字,不知勒痛多少人的心肉。') + book3 = Book('心是孤独的猎手','卡森·麦卡勒斯','我们渴望倾诉,却从未倾听。女孩、黑人、哑巴、醉鬼、鳏夫的孤独形态各异,却从未退场。',1) + self.books.append(book1) + self.books.append(book2) + self.books.append(book3) + #设置窗口 + def set_init_window(self): + self.init_window_name.title("流浪图书馆_可视化+数据库1.0") #窗口名 + self.init_window_name.geometry('450x300+10+10') + + self.result_data_Text = Text(self.init_window_name, width=35, height=15) #处理结果展示 + self.result_data_Text.grid(row=1, column=12, rowspan=15, columnspan=10) + + self.mianbutton1 = Button(self.init_window_name, text="查询所有书籍", bg="lightblue", width=20,command=self.show_all_book) # 调用内部方法 加()为直接调用 + self.mianbutton2 = Button(self.init_window_name, text="添加书籍", bg="lightblue", width=20,command=self.add_book) # 调用内部方法 加()为直接调用 + self.mianbutton3 = Button(self.init_window_name, text="借阅书籍", bg="lightblue", width=20,command=self.lend_book) # 调用内部方法 加()为直接调用 + self.mianbutton4 = Button(self.init_window_name, text="归还书籍", bg="lightblue", width=20,command=self.return_book) # 调用内部方法 加()为直接调用 + self.mianbutton1.grid(row=1, column=11) + self.mianbutton2.grid(row=3, column=11) + self.mianbutton3.grid(row=5, column=11) + self.mianbutton4.grid(row=7, column=11) + + #功能函数 + def show_all_book(self): + self.result_data_Text.delete(0.0,END) + for book in self.books: + self.result_data_Text.insert(1.0,book) + def add_book(self): + top = Tk() + top.title("添加") + top.geometry('300x120+450+10') + self.L1 = Label(top, text="请输入书籍名称:") + self.E1 = Entry(top, bd =5) + self.L2 = Label(top, text="请输入作者名称:") + self.E2 = Entry(top, bd =5) + self.L3 = Label(top, text="请输入书籍推荐语:") + self.E3 = Entry(top, bd =5) + self.L1.place(x=0,y=0) + self.L2.place(x=0,y=30) + self.L3.place(x=0,y=60) + self.E1.place(x=120,y=0) + self.E2.place(x=120,y=30) + self.E3.place(x=120,y=60) + self.B = Button(top, text ="输入完毕请点击确认,无需继续输入请关闭窗口", command = self.add_booking) + self.B.pack(side = BOTTOM) + def add_booking(self): + new_name = self.E1.get() + new_author = self.E2.get() + new_comment = self.E3.get() + self.result_data_Text.delete(0.0,END) + new_book = Book(new_name, new_author, new_comment) + self.books.append(new_book) + self.result_data_Text.insert(1.0,new_name+'录入成功!\n') + + def check_book(self,name): + for book in self.books: + if book.name == name: + return book + else: + return None + + def lend_book(self): + toplend = Tk() + toplend.title("借阅") + toplend.geometry('330x50+450+30') + self.lendE1 = Entry(toplend, bd =5) + self.lendE1 .pack(side = RIGHT) + self.lendB1 = Button(toplend, text ="输入书名,输入完毕请点击", command = self.lend_booking) + self.lendB1.pack(side = LEFT) + + def lend_booking(self): + name = self.lendE1.get() + res = self.check_book(name) + self.result_data_Text.delete(0.0,END) + if res != None: + if res.state == 1: + self.result_data_Text.insert(1.0,'你来晚了一步,这本书已经被借走了噢') + else: + self.result_data_Text.insert(1.0,'借阅成功,借了不看会变胖噢〜') + res.state = 1 + else: + self.result_data_Text.insert(1.0,'这本书暂时没有收录在系统里呢') + + def return_book(self): + topreturn = Tk() + topreturn.title("归还") + topreturn.geometry('330x50+450+30') + self.returnE1 = Entry(topreturn, bd =5) + self.returnE1 .pack(side = RIGHT) + self.returnB1 = Button(topreturn, text ="输入书名,完毕请点击", command = self.return_booking) + self.returnB1.pack(side = LEFT) + + def return_booking(self): + name = self.returnE1.get() + res = self.check_book(name)# 调用check_book方法,将返回值赋值给变量res + self.result_data_Text.delete(0.0,END) + if res == None:# 如果返回的是空值,即这本书的书名不在系统里 + self.result_data_Text.insert(1.0,'没有这本书噢,你恐怕输错了书名〜') + else:# 如果返回的是实例对象 + if res.state == 0:# 如果实例属性state等于0,即这本书的借阅状态为'未借出' + self.result_data_Text.insert(1.0,'这本书没有被借走,在等待有缘人的垂青呢!') + else: # 如果实例属性state等于1,即状态为'已借出' + self.result_data_Text.insert(1.0,'归还成功!') + res.state = 0# 归还后书籍借阅状态为0,重置为'未借出' +def gui_start(): + init_window = Tk() #实例化出一个父窗口 + ZMJ_PORTAL = BookManager(init_window) # 设置根窗口默认属性 + ZMJ_PORTAL.set_init_window() + init_window.mainloop() #父窗口进入事件循环,可以理解为保持窗口运行,否则界面不展示 + +gui_start() \ No newline at end of file diff --git a/04_flask/requirements.txt b/04_flask/requirements.txt index 7dbe409..8c7b2d8 100644 --- a/04_flask/requirements.txt +++ b/04_flask/requirements.txt @@ -1,5 +1,5 @@ Flask==1.1.2 -Werkzeug==1.0.1 +Werkzeug==2.2.3 Flask_Login==0.5.0 click==7.1.2 Flask_SQLAlchemy==2.4.0 diff --git a/06_tool/ConvertedToPDF.py b/06_tool/ConvertedToPDF.py new file mode 100644 index 0000000..ab3001e --- /dev/null +++ b/06_tool/ConvertedToPDF.py @@ -0,0 +1,115 @@ +''' +@jiangmiemie(jiangyangcreate@gmail) +自动分辨输入文件路径或文件夹路径,转换指定后缀文件为PDF('doc', 'docx', 'ppt', 'pptx', 'xls', 'xlsx') +''' + +import os +from pathlib import Path +from win32com.client import Dispatch, gencache, DispatchEx +import win32com.client + +class PDFConverter: + def __init__(self, pathname): + self._handle_postfix = ['doc', 'docx', 'ppt', 'pptx', 'xls', 'xlsx'] + self._filename_list = list() + self._export_folder = os.path.join(os.path.abspath('.'), outpath) + if not os.path.exists(self._export_folder): + os.mkdir(self._export_folder) + self._enumerate_filename(pathname) + + def _enumerate_filename(self, pathname): + full_pathname = os.path.abspath(pathname) + if os.path.isfile(full_pathname): + if self._is_legal_postfix(full_pathname): + self._filename_list.append(full_pathname) + else: + raise TypeError('文件 {} 后缀名不合法!仅支持如下文件类型:{}。'.format( + pathname, '、'.join(self._handle_postfix))) + elif os.path.isdir(full_pathname): + for relpath, _, files in os.walk(full_pathname): + for name in files: + filename = os.path.join(full_pathname, relpath, name) + if self._is_legal_postfix(filename): + self._filename_list.append(os.path.join(filename)) + else: + raise TypeError('文件/文件夹 {} 不存在或不合法!'.format(pathname)) + + def _is_legal_postfix(self, filename): + return filename.split('.')[-1].lower() in self._handle_postfix and not os.path.basename(filename).startswith('~') + + def run_conver(self): + ''' + 进行批量处理,根据后缀名调用函数执行转换 + ''' + print('需要转换的文件数:', len(self._filename_list)) + for filename in self._filename_list: + postfix = filename.split('.')[-1].lower() + funcCall = getattr(self, postfix) + print('原文件:', filename) + funcCall(filename) + print('转换完成!') + + def doc(self, filename): + ''' + doc 和 docx 文件转换 + ''' + name = os.path.basename(filename).split('.')[0] + '.pdf' + word = Dispatch('Word.Application') + doc = word.Documents.Open(filename) + pdf_file = os.path.join(self._export_folder, name) + doc.SaveAs(pdf_file, FileFormat=17) + doc.Close() + word.Quit() + + def docx(self, filename): + self.doc(filename) + + def xls(self, filename): + ''' + xls 和 xlsx 文件转换 + ''' + name = os.path.basename(filename).split('.')[0] + '.pdf' + exportfile = os.path.join(self._export_folder, name) + xlApp = DispatchEx("Excel.Application") + xlApp.Visible = False + xlApp.DisplayAlerts = 0 + books = xlApp.Workbooks.Open(filename, False) + books.ExportAsFixedFormat(0, exportfile) + books.Close(False) + print('保存 PDF 文件:', exportfile) + xlApp.Quit() + + def xlsx(self, filename): + self.xls(filename) + + def ppt(self,filename): + """ + PPT文件导出为pdf格式 + :param filename: PPT文件的名称 + :param output_filename: 导出的pdf文件的名称 + :return: + """ + name = os.path.basename(filename).split('.')[0] + '.pdf' + exportfile = os.path.join(self._export_folder, name) + ppt_app = win32com.client.Dispatch('PowerPoint.Application') + ppt = ppt_app.Presentations.Open(filename) + ppt.SaveAs(exportfile, 32) + print('保存 PDF 文件:', exportfile) + ppt_app.Quit() + + def pptx(self, filename): + self.ppt(filename) + + +def main(In_Path): + my_file = Path(In_Path) + if my_file.is_dir(): # 判断是否为文件夹 + pathname = os.path.join(os.path.abspath('.'), In_Path) + else: + pathname = In_Path # 单个文件的转换 + pdfConverter = PDFConverter(pathname) + pdfConverter.run_conver() + +if __name__ == "__main__": + outpath = 'SavePath' + main(input('输入你要转化的文件或文件夹路径')) \ No newline at end of file diff --git a/06_tool/Qr_Code.py b/06_tool/Qr_Code.py new file mode 100644 index 0000000..17ef527 --- /dev/null +++ b/06_tool/Qr_Code.py @@ -0,0 +1,27 @@ +''' +@jiangmiemie(jiangyangcreate@gmail) +生成二维码/解析二维码、生成动态二维码的模块 +''' + +from easyqr import easyqr as qr# 解析模块 +#上传图片 +path = r'code\ME.png'#使用你自己的微信二维码截图即可 +url = qr.upload(path) +#获得解析的地址 +url =qr.online(url) + +from MyQR import myqr #动态二维码模块,结果不支持中文 +myqr.run( + words= str(url) , # 扫描二维码后,显示的内容,或是跳转的链接 + version=9 , # 设置容错率 + level='L' , # 控制纠错水平,范围是L、M、Q、H,从左到右依次升高 + picture='gif.gif' , # 图片所在目录,可以是动图 + colorized=True , # 黑白(False)还是彩色(True) + contrast=1.0 , # 用以调节图片的对比度,1.0 表示原始图片。默认为1.0。 + brightness=1.0 , # 用来调节图片的亮度,用法同上。 + save_name='xxxxx.gif' , # 控制输出文件名,格式可以是 .jpg, .png ,.bmp ,.gif + ) + +import qrcode #静态二维码模块,支持中文 +img = qrcode.make('DESKTOP')# 填写你想要扫码出现的内容(文字/链接) +img.save('DESKTOP.png') # 填写文件保存路径 \ No newline at end of file diff --git a/06_tool/send_email.py b/06_tool/send_email.py index a52f3f3..72f5635 100644 --- a/06_tool/send_email.py +++ b/06_tool/send_email.py @@ -4,13 +4,17 @@ @description: 需要先开启两个服务: IMAP/SMTP服务已开启 POP3/SMTP服务已开启 -""" +schedule模块是定时任务,需要程序一直运行。 +增加附件与附图 +""" +import time,schedule from smtplib import SMTP_SSL, SMTP from email.mime.text import MIMEText +from email.mime.multipart import MIMEMultipart +from email.mime.image import MIMEImage - -def send_mail(message, Subject, sender_show, recipient_show, to_addrs, cc_show=''): +def send_mail(message, Subject, sender_show, recipient_show, to_addrs,filelanguage = 'cn',filepath=None,imagepath=None, cc_show=''): """ :param message: str 邮件内容 :param Subject: str 邮件主题描述 @@ -22,8 +26,38 @@ def send_mail(message, Subject, sender_show, recipient_show, to_addrs, cc_show=' # 填写真实的发邮件服务器用户名、密码 user = 'xxx@126.com' password = 'xxx' + #发送附件的方法定义为一个变量 + msg=MIMEMultipart() # 邮件内容 - msg = MIMEText(message, 'plain', _charset="utf-8") + content='邮件正文' + #发送正文 + msg.attach(MIMEText(content,'html', 'utf-8')) + #调用传送附件模块,传送附件 + if filepath != None: + att=MIMEText(open(filepath,'rb').read(),'base64','utf-8') + #修改下方filename为文件名(文本型,不支持中文) + att["Content-Type"]='application/octet-stream' + if filelanguage == 'cn': + show_file_name = '中文附件.xlsx' # 填写你希望展示出来的附件名称 + att.add_header("Content-Disposition", "attachment", filename=("gbk", "", show_file_name)) + else: + show_file_name = 'English.XLSX' # 填写你希望展示出来的附件名称 + att["Content-Disposition"]=f'attachment;filename="{show_file_name}"' + + msg.attach(att)#发送附件 + + if imagepath != None: + #批量添加图片时需要修改值 + mime_images = '

imageid{0}

'.format(1) + mime_img = MIMEImage(open(imagepath, 'rb').read(), _subtype='octet-stream') + mime_img.add_header('Content-ID', 'imageid') + #上传图片至缓存空间 + msg.attach(mime_img) + # 上传正文 + mime_html = MIMEText('

{0}

{1}

AltStyle によって変換されたページ (->オリジナル) /

'.format('', mime_images), 'html', 'utf-8') + # 添加附图至正文 + msg.attach(mime_html) + # 邮件主题描述 msg["Subject"] = Subject # 发件人显示,不起实际作用 @@ -43,6 +77,8 @@ def send_mail(message, Subject, sender_show, recipient_show, to_addrs, cc_show=' print("send error.", e) + + if __name__ == '__main__': message = 'Python 测试邮件...' Subject = '主题测试' @@ -52,4 +88,21 @@ def send_mail(message, Subject, sender_show, recipient_show, to_addrs, cc_show=' recipient_show = 'xxx' # 实际发给的收件人 to_addrs = 'xxx@qq.com,' - send_mail(message, Subject, sender_show, recipient_show, to_addrs) + def job(): + send_mail(message, Subject, sender_show, recipient_show, to_addrs) + + # 每隔10分钟执行一次任务 + # schedule.every(10).minutes.do(job) + # 每隔一小时执行一次任务 + # schedule.every().hour.do(job) + # 每天10:30执行一次任务 + # schedule.every().day.at("10:30").do(job) + # 每周一的这个时候执行一次任务 + # schedule.every().monday.do(job) + # 每周三13:15执行一次任务 + # schedule.every().wednesday.at("13:15").do(job) + # 每周五18:00执行一次任务 + schedule.every().friday.at("18:00").do(job) + while True: + schedule.run_pending() + time.sleep(1) diff --git a/README.md b/README.md index 6f115b4..c8c915b 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,12 @@ -# python-tutorial - -[![Contributions welcome](https://img.shields.io/badge/contributions-welcome-brightgreen.svg)](CONTRIBUTING.md) -[![GitHub contributors](https://img.shields.io/github/contributors/shibing624/python-tutorial.svg)](https://github.com/shibing624/python-tutorial/graphs/contributors) -[![License Apache 2.0](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](LICENSE) [![python_vesion](https://img.shields.io/badge/Python-3.5%2B-green.svg)](requirements.txt) +[![License Apache 2.0](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](LICENSE) [![GitHub issues](https://img.shields.io/github/issues/shibing624/python-tutorial.svg)](https://github.com/shibing624/python-tutorial/issues) [![Wechat Group](http://vlog.sfyc.ltd/wechat_everyday/wxgroup_logo.png?imageView2/0/w/60/h/20)](#Contact) - +# python-tutorial Python实用教程,包括:Python基础,Python高级特性,面向对象编程,多线程,数据库,数据科学,Flask,爬虫开发教程。 - 在本Python教程包含了一些范例,涵盖了大多数Python日常脚本任务,是入门Python的学习资料,也可以作为工作中编写Python脚本的参考实现。 以下所有实现均在python3环境下测试。 @@ -110,16 +105,16 @@ Python实用教程,包括:Python基础,Python高级特性,面向对象 -# Cite +# Citation 如果你在研究中使用了python-tutorial,请按如下格式引用: ```latex -@software{python-tutorial, - author = {Xu Ming}, - title = {python-tutorial: Python3 Tutorial for Beginners}, - year = {2021}, - url = {https://github.com/shibing624/python-tutorial}, +@misc{python-tutorial, + title={python-tutorial: Python3 Tutorial for Beginners}, + author={Ming Xu}, + howpublished={https://github.com/shibing624/python-tutorial}, + year={2021} } ``` @@ -139,7 +134,7 @@ Python实用教程,包括:Python基础,Python高级特性,面向对象 # Reference -1. [缪雪峰Python3教程](https://www.liaoxuefeng.com/wiki/1016959663602400) +1. [廖雪峰Python3教程](https://www.liaoxuefeng.com/wiki/1016959663602400) 2. [PythonDataScienceHandbook](https://github.com/jakevdp/PythonDataScienceHandbook) 3. [Python4DataScience.CH](https://github.com/catalystfrank/Python4DataScience.CH) 4. [Python-100-Days](https://github.com/jackfrued/Python-100-Days)