-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathebhs.py
599 lines (552 loc) · 23.5 KB
/
ebhs.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
#!/usr/bin/env python3
import pymysql
import time
from openpyxl import Workbook
table_alpha = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U',
'V', 'W', 'X', 'Y', 'Z']
# 连接上数据库并且,设置光标
# ebhs_table_point是一个全局变量,指向table数据的表
def connect_database():
global ebhs_database
ebhs_database = pymysql.connect(host="127.0.0.1", user="root", password="asdfghjkl;'", database="Ebbinghaus",
charset="utf8")
global ebhs_table_point
ebhs_table_point = ebhs_database.cursor(cursor=pymysql.cursors.DictCursor)
pass
# 关闭数据库
def close_database():
ebhs_table_point.close()
ebhs_database.close()
# 在每次复习的时候都需要增加一列
def add_column():
connect_database() # 连接数据库,获得光标
width = 0 # 定义宽度
row_affetch = ebhs_table_point.execute('select * from Ebbinghaus') # 获取行数
all = ebhs_table_point.fetchone() # 获取第一行的内容
print("获取" + str(row_affetch) + "条内容")
# 得到列数,也就是宽度
for i in all:
len(i)
width += 1
# 由宽度得到要添加的行的名称
log = "log" + str(int(width) - 2)
# 设计SQL语言,添加一行
sql = "alter table Ebbinghaus add column {} varchar(45)".format(log)
# 执行SQL语句
ebhs_table_point.execute(sql)
# 提交数据库
ebhs_database.commit()
# 十进制转26进制
def convert(num):
s = ""
while num > 0:
m = num % 26
s = s+table_alpha[int(m-1)]
num = (num - m) / 26
l = list(s) # 模拟全部入栈
s = ""
while len(l) > 0:
s += l.pop() # 模拟出栈,pop() 函数用于移除列表中的一个元素(默认最后一个元素),并且返回该元素的值。
return s
# 将数据库里面的内容转化成xls
# ebhs_database
# ebhs_table_point
def mysql_xls():
# 新建的工作簿 Ebbinghaus_workbook
Ebbinghaus_workbook = Workbook()
# 第一个sheet是sheet_1
sheet_1 = Ebbinghaus_workbook.worksheets[0]
# 设置标题
sheet_1.title = 'Ebbinghaus'
sheet_1.cell(row=1, column=1).value = "id"
sheet_1.cell(row=1, column=2).value = "content"
sheet_1.cell(row=1, column=3).value = "stage"
for i in range(1, 101):
sheet_1.cell(row=1, column=i + 2).value = ("log{}".format(i))
# 连接数据库R
connect_database()
# 获取列数,也就是宽度
row_affetch = ebhs_table_point.execute('select * from Ebbinghaus')
print("获取" + str(row_affetch) + "条记录")
# 获取整个数据库里面的内容
all = ebhs_table_point.fetchall()
# 循环,分别写入Excel文件中
# 记录坐标的编号r,d
d = 2
for element in all:
r = 1
for key in element:
R = convert(r)
sheet_1.column_dimensions[R].width = 35
if r == 1 or r == 3:
R = convert(r)
sheet_1.column_dimensions[R].width = 5
sheet_1.row_dimensions[d].height = 20
sheet_1.cell(row=d, column=r).value = "{}".format(element[key])
r += 1
d += 1
Ebbinghaus_workbook.save("/Users/stevenjobs/Downloads/ebhs.xlsx")
# 第一次学习的内容,进行插入
# ebhs_database
# ebhs_table_point
def new_content():
# 获取整个要记录的信息
connect_database()
##
print("#########################################################################")
print("#\t\t\t\t\t\t\t\t\t#")
content = input(
"#\t新学习的内容是什么 \tor \t\t退出?\t\t\t#\t\t\t\t\n#\t\t\t\t\t\t\t\t\t#\n#########################################################################\n:")
if content.find("退出") == 0:
return
elif content.find("退出") == -1:
print("收录新记录:\t" + content)
else:
print("请检查代码")
ebhs_table_point.execute('select * from Ebbinghaus')
all = ebhs_table_point.fetchall()
length = len(all)
for i in range(length):
if all[i]["content"] == content:
##
print(
"#################################\n#\t\t\t\t#\n#\t信息重复_请重新输入\t#\n#\t\t\t\t#\n#################################")
close_database()
return
ebhs_table_point.close()
connect_database()
first_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
log = first_time
stage = 0
rows = ebhs_table_point.execute('select * from Ebbinghaus')
id = str(rows + 1)
# SQL语言,进行插入
# 先进行判断这个表格有多少列
# 如果新的内容不够行数,就补上空
one = ebhs_table_point.fetchone()
width = len(one)
if width > 4:
sql_1 = '''("{}", "{}", "{}", "{}"'''.format(id, content, stage, log)
for i in range(2, width - 2):
sql_1 = sql_1 + ''',"NULL"'''
sql = '''insert into Ebbinghaus values ''' + sql_1 + ")"
ebhs_table_point.execute(sql)
elif width == 4:
sql_1 = '''("{}", "{}", "{}", "{}")'''.format(id, content, stage, log)
sql = '''insert into Ebbinghaus values ''' + sql_1 + ")"
ebhs_table_point.execute(sql)
else:
##
print("#########################\n#\t\t\t#\n#\t请检查MySQL\t#\n#\t\t\t#\n#########################")
ebhs_database.commit()
# 返回一个整型的数字
def calculation(record_time_str):
now_time_list = []
record_time_list = []
now_time_str = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
now_time_list.append(int(now_time_str[0:4])) # year list[0]
now_time_list.append(int(now_time_str[5:7])) # month list[1]
now_time_list.append(int(now_time_str[8:10])) # day list[2]
now_time_list.append(int(now_time_str[11:13])) # hour list[3]
now_time_list.append(int(now_time_str[14:16])) # Minute list[4]
now_time = now_time_list[0] * 365 * 24 * 60 + now_time_list[1] * 30 * 24 * 60 + now_time_list[2] * 24 * 60 + \
now_time_list[3] * 60 + now_time_list[4]
record_time_list.append(int(record_time_str[0:4]))
record_time_list.append(int(record_time_str[5:7]))
record_time_list.append(int(record_time_str[8:10]))
record_time_list.append(int(record_time_str[11:13]))
record_time_list.append(int(record_time_str[14:16]))
record_time = record_time_list[0] * 365 * 24 * 60 + record_time_list[1] * 30 * 24 * 60 + record_time_list[
2] * 24 * 60 + record_time_list[3] * 60 + record_time_list[4]
ans = now_time - record_time
return ans
# 把需要复习的内容显示在屏幕上
# ebhs_database
# ebhs_table_point
def display():
print("#########################")
print("\n")
connect_database()
ebhs_table_point.execute('select * from Ebbinghaus')
all = ebhs_table_point.fetchall()
# 遍历列表中所有的字典,每一个字典里面就是一条记录
for element in all:
# 遍历字典里面所有的键,键就是行向的项目
record_time_str = ""
for key in element:
# 找到项目是“stage”的项目
if key == "stage":
# 判断键“stage”值里面的值是不是1
# 找到阶段一
if int(element[key]) == 0:
# 如果是stage = 1 就遍历最后一个log
# element就是一个字典
list_str = []
for key_time in element:
# 找到log* 不停的刷新record_time_str
if key_time.find("log") + 1:
list_str.append(element[key_time])
if element[key_time] is None:
break
elif element[key_time] == "NULL":
break
record_time_str = list_str[-2]
####
if calculation(record_time_str) >= 0:
for c in element:
if c == "content":
print(element[c])
print("#########################")
print("\n")
# 找到阶段一
elif int(element[key]) == 1:
# 如果是stage = 1 就遍历最后一个log
# element就是一个字典
list_str = []
for key_time in element:
# 找到log* 不停的刷新record_time_str
if key_time.find("log") + 1:
list_str.append(element[key_time])
if element[key_time] is None:
break
elif element[key_time] == "NULL":
break
record_time_str = list_str[-2]
####
if calculation(record_time_str) >= 5:
for c in element:
if c == "content":
print(element[c])
print("#########################")
print("\n")
# 找到阶段二
elif int(element[key]) == 2:
list_str = []
# 如果是stage = 2 就遍历最后一个log
for key_time in element:
# 找到log* 不停的刷新record_time_str
if key_time.find("log") + 1:
list_str.append(element[key_time])
if element[key_time] is None:
break
elif element[key_time] == "NULL":
break
record_time_str = list_str[-2]
####
if calculation(record_time_str) >= 30:
for c in element:
if c == "content":
print(element[c])
print("#########################")
print("\n")
# 找到阶段三
elif int(element[key]) == 3:
list_str = []
# 如果是stage = 3 就遍历最后一个log
for key_time in element:
# 找到log* 不停的刷新record_time_str
if key_time.find("log") + 1:
list_str.append(element[key_time])
if element[key_time] is None:
break
elif element[key_time] == "NULL":
break
record_time_str = list_str[-2]
####
if calculation(record_time_str) >= 12 * 60:
for c in element:
if c == "content":
print(element[c])
print("#########################")
print("\n")
# 找到阶段四
elif int(element[key]) == 4:
list_str = []
# 如果是stage = 4 就遍历最后一个log
for key_time in element:
# 找到log* 不停的刷新record_time_str
if key_time.find("log") + 1:
list_str.append(element[key_time])
if element[key_time] is None:
break
elif element[key_time] == "NULL":
break
record_time_str = list_str[-2]
####
if calculation(record_time_str) >= 24 * 60:
for c in element:
if c == "content":
print(element[c])
print("#########################")
print("\n")
# 找到阶段5
elif int(element[key]) == 5:
list_str = []
# 如果是stage = 2 就遍历最后一个log
for key_time in element:
# 找到log* 不停的刷新record_time_str
if key_time.find("log") + 1:
list_str.append(element[key_time])
if element[key_time] is None:
break
elif element[key_time] == "NULL":
break
record_time_str = list_str[-2]
####
if calculation(record_time_str) >= 2 * 24 * 60:
for c in element:
if c == "content":
print(element[c])
print("#########################")
print("\n")
# 找到阶段6
elif int(element[key]) == 6:
list_str = []
# 如果是stage = 2 就遍历最后一个log
for key_time in element:
# 找到log* 不停的刷新record_time_str
if key_time.find("log") + 1:
list_str.append(element[key_time])
if element[key_time] is None:
break
elif element[key_time] == "NULL":
break
record_time_str = list_str[-2]
####
if calculation(record_time_str) >= 4 * 24 * 60:
for c in element:
if c == "content":
print(element[c])
print("#########################")
print("\n")
# 找到阶段7
elif int(element[key]) == 7:
list_str = []
# 如果是stage = 2 就遍历最后一个log
for key_time in element:
# 找到log* 不停的刷新record_time_str
if key_time.find("log") + 1:
list_str.append(element[key_time])
if element[key_time] is None:
break
elif element[key_time] == "NULL":
break
record_time_str = list_str[-2]
####
if calculation(record_time_str) >= 7 * 24 * 60:
for c in element:
if c == "content":
print(element[c])
print("#########################")
print("\n")
# 找到阶段8
elif int(element[key]) >= 8:
list_str = []
# 如果是stage = 2 就遍历最后一个log
for key_time in element:
# 找到log* 不停的刷新record_time_str
if (key_time.find("log") + 1):
list_str.append(element[key_time])
if element[key_time] is None:
break
elif element[key_time] == "NULL":
break
record_time_str = list_str[-2]
####
if calculation(record_time_str) >= 15 * 24 * 60:
for c in element:
if c == "content":
print(element[c])
print("#########################")
print("\n")
else:
##
print("#########################\n#\t\t\t#\n#\tlevel Error\t#\n#\t\t\t#\n#########################")
# 复习
# 增加一条学习记录,增加在内容的最后面
# ebhs_database
# ebhs_table_point
def review():
# 获取复习的内容
display()
##
print("#################################################")
print("#\t\t\t\t\t\t#")
content_input = input(
"#\t复习的内容 \tor\t 退出?\t\t#\n#\t\t\t\t\t\t#\n#################################################\n:")
connect_database()
ebhs_table_point.execute('select * from Ebbinghaus')
# 获得一个列表,里面装字典,每一条字典都是一个行记录
all = ebhs_table_point.fetchall()
# 得到记录的数目
length = len(all)
# 循环所有的记录,一次一次的开始
for i in range(length):
# 如果第找到的这一纪录的content是输入的内容
if all[i]["content"] == content_input:
# 得到这条记录的stage->compare
compare = int(all[i]["stage"])
# 得到整个记录的长度
width = len(all[i])
# 补上差的列数
while (compare + 4) > width:
add_column()
width += 1
new_stage = str(all[i]["stage"])
SQL = '''update Ebbinghaus set stage = "{}" where content = "{}"'''.format(str(int(new_stage) + 1),
content_input)
ebhs_table_point.execute(SQL)
log_puls = 0
# 循环的所有的行数
for n in range(length):
# 如果找到了这一行
if all[n]["content"] == content_input:
list_log = []
for m in all[n]:
list_log.append(m)
log_puls = len(list_log) - 3
if all[n][m] is None:
break
elif all[n][m] == "NULL":
break
time_p = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
SQL_1 = '''update Ebbinghaus set log{} = "{}" where content = "{}"'''.format(log_puls, time_p,
content_input)
ebhs_table_point.execute(SQL_1)
ebhs_database.commit()
print("复习记录完成")
print("复习的内容是" + content_input)
##
# 更改其中可能错误的部分
# ebhs_database
# ebhs_table_point
def renew():
##
print("\n")
print("#################################")
print("#\t\t\t\t#")
print("#\tid或内容任意一个\t#")
print("#\t\t\t\t#")
key = input("#\t请输入你想修改内容\t#\n#\t\t\t\t#\n#################################\n:")
connect_database()
ebhs_table_point.execute("select * from Ebbinghaus")
all = ebhs_table_point.fetchall()
# 遍历所有的列表内容,i为字典
g = 0
# 找到所有的
for i in all:
# 找到我们要的这一行字典内容
# 若果在内容中找到了匹配项,那么就是输入的内容
if str(i["content"]) == key:
# 获得我们修改后的结果
new = input("\n更改之后的内容\n")
# 若果输入的能够整形化,那么就是输入的数字
# 如果输入的不能够整形化,那么就是输入的内容
try:
# 整形表示x=1
int(new)
x = 1
except:
# 字符串x=2
x = 2
# 判断如果是输入的id码
if x == 1:
# 获取原来值,保留项
con = all[g]["content"]
# 执行
SQL = '''update Ebbinghaus set stage = "{}" where content = "{}"'''.format(str(new), con)
ebhs_table_point.execute(SQL)
ebhs_database.commit()
print("#########################\n#\t\t\t#\n#\t更改成功\t#\n#\t\t\t#\n#########################")
return
# 判断如果是输入的字符串那么就是修改的内容
elif x == 2:
# 保留项是id码
idd = all[g]["id"]
SQL = '''update Ebbinghaus set content = "{}" where id = "{}"'''.format(str(new), idd)
ebhs_table_point.execute(SQL)
ebhs_database.commit()
print("#########################\n#\t\t\t#\n#\t更改成功\t#\n#\t\t\t#\n#########################")
return
# 如果在id中找到了,那么就是输入的id码
elif str(i["id"]) == key:
# 获得我们最后的结果
new = input("\n更改之后的内容\n")
try:
int(new)
x = 1
except:
x = 2
if x == 1:
# 获取原来值,修改后的内容是id,那么保留项就是内容
con = all[g]["content"]
# 执行
SQL = '''update Ebbinghaus set stage = "{}" where content = "{}"'''.format(str(new), con)
ebhs_table_point.execute(SQL)
ebhs_database.commit()
print("#########################\n#\t\t\t#\n#\t更改成功\t#\n#\t\t\t#\n#########################")
return
elif x == 2:
# 获取原来值,修改后的内容是内容,那么保留项就是id
idd = all[g]["id"]
SQL = '''update Ebbinghaus set content = "{}" where id = "{}"'''.format(str(new), idd)
ebhs_table_point.execute(SQL)
ebhs_database.commit()
print("#########################\n#\t\t\t#\n#\t更改成功\t#\n#\t\t\t#\n#########################")
return
g += 1
print("#########################\n#\t\t\t#\n#\t更改失败\t#\n#\t\t\t#\n#########################")
def main():
while True:
##
print("#########################")
print("#\t\t\t#")
print("#\t 1.新章节\t#")
print("#\t 2.查看\t\t#")
print("#\t 3.复习完成\t#")
print("#\t 4.更改\t\t#")
print("#\t\t\t#")
print("#\t 5.退出\t\t#")
print("#\t\t\t#")
print("#########################")
key = input("\n你想做点什么\n:")
if key == "新章节":
new_content()
mysql_xls()
close_database()
elif key == "1":
new_content()
mysql_xls()
close_database()
elif key == "查看":
display()
mysql_xls()
close_database()
elif key == "2":
display()
mysql_xls()
close_database()
elif key == "复习完成":
review()
mysql_xls()
close_database()
elif key == "3":
review()
mysql_xls()
close_database()
elif key == "更改":
renew()
mysql_xls()
close_database()
elif key == "4":
renew()
mysql_xls()
close_database()
elif key == "退出":
exit()
elif key == "5":
exit()
else:
##
print("#########################\n#\t\t\t#\n#\t输入错误\t#\n#\t\t\t#\n#########################")
main()