From 96f3c0520775742dc22a90f15c72c5f2c3b502d0 Mon Sep 17 00:00:00 2001 From: crupest Date: Mon, 12 Oct 2020 17:38:50 +0800 Subject: import(life): Add question-pptx. --- works/life/question-pptx/.gitignore | 1 + works/life/question-pptx/README.md | 9 ++ works/life/question-pptx/choose.txt | 188 ++++++++++++++++++++++++++++++++++++ works/life/question-pptx/judge.txt | 73 ++++++++++++++ works/life/question-pptx/main.py | 95 ++++++++++++++++++ 5 files changed, 366 insertions(+) create mode 100644 works/life/question-pptx/.gitignore create mode 100644 works/life/question-pptx/README.md create mode 100644 works/life/question-pptx/choose.txt create mode 100644 works/life/question-pptx/judge.txt create mode 100644 works/life/question-pptx/main.py diff --git a/works/life/question-pptx/.gitignore b/works/life/question-pptx/.gitignore new file mode 100644 index 0000000..365e45e --- /dev/null +++ b/works/life/question-pptx/.gitignore @@ -0,0 +1 @@ +test.pptx diff --git a/works/life/question-pptx/README.md b/works/life/question-pptx/README.md new file mode 100644 index 0000000..8dd2807 --- /dev/null +++ b/works/life/question-pptx/README.md @@ -0,0 +1,9 @@ +2020.10.12 + +这是食品学院的一个同学,让我帮忙写一个脚本用来生成一个ppt,这个ppt将用于一个类似“一站到底”的活动,但由于题库太大,所以让我写一个脚本来自动生成。 + +毫不犹豫的选择了Python,然后搜索了一下相关的库,花了两个小时左右搞定。不过这个库还不是很强大,只能写静态的东西,不能做动画。所以很多关键功能不能够实现了。不过那个同学说,能够自动把题库导进去也算是省了很大力气。 + +如果可以的话,我觉得这种复杂的交互还是使用其他的技术比较好。 + +话说上传一小部分题库,他不会怪我吧。😂 diff --git a/works/life/question-pptx/choose.txt b/works/life/question-pptx/choose.txt new file mode 100644 index 0000000..adde030 --- /dev/null +++ b/works/life/question-pptx/choose.txt @@ -0,0 +1,188 @@ +食用熟食品之前应该对食品进行(c)后才能食用。 + +  A 直接吃 B 温一下 C 彻底加热 D 冰镇 + +   +盛装生、熟食品的容器应当(a)使用。 + +  A 分开 B 混用 C 不要分开 D 擦擦再用 + +   +食品生产者发现其生产的食品出现(a)的情况,应当立即停止生产,召回已上市销售的食品,通知相关生产经营者和消费者,并记录召回和通知情况。 + +  A 不符合食品安全标准 + +  B 技术明显落后于业界水平 + +  C 食品口感受到公众质疑 + +  D 食品严重滞销 + +   +新修订的《食品安全法》的正式施行日期是(a)。 + +  A 2015年10月1日 + +  B 2015年3月15日 + +  C 2015年9月28日 + +  D 2015年6月1日 + +   +预包装食品的包装上应当有标签,标签应当标明下列事项(d)。 + +  A 名称、规格、净含量、生产日期 + +  B 成分或者配料表、保质期、产品标准代号 + +  C 生产者的名称、地址、联系方式 、贮存条件 + +  D 以上都是 + +   +违反食品安全法规定,在广告中对食品质量作虚假宣传,欺骗消费者的,依照(a)的规定给予处罚。 + +  A 中华人民共和国广告法 + +  B 反不正当竞争法 + +  C 产品质量法 + +  D 中华人民共和国食品安全法 + +   +食品经营者销售散装食品,应当在散装食品的容器、外包装上标明(d)。 + +  A 食品的名称、生产日期 + +  B 保质期 + +  C 生产经营者名称及联系方式 + +  D 以上都是 + +   +储藏食品必须做到(d)。 + +  A 防尘 B 防蝇 C 防霉 D 以上都是 + +   +最高法院出台的《关于办理危害食品安全刑事案件适用法律若干问题的解释》中规定,如果利用“地沟油”加工食品,致人死亡,最高可判(c)。 + +  A有期徒刑 B无期徒刑 C死刑 D刑拘 + +  10.食品安全标准是(b)的标准。 + +  A 自愿性 B 强制性 C 科学性 D 民主性 + +   +在中国境内市场销售的进口食品,必须使用下列哪种标识(b)。 + +  A 英文 B 中文 C 拼音标识 D 其他文字 + +   +《食品安全法》共有(c)。 + +  A 10章101条 + +  B 10章106条 + +  C 10章104条 + +  D 10章154条 + +   +违反《食品安全法》规定,构成犯罪的,依法追究(c)。 + + A 道德谴责 B 民事责任C 刑事责任D 社会责任 + +   +生产经营的食品中不得添加(a)。 + +  A 药品B 中药材 C 化合剂 D 增白剂 + +   +农民个人销售其自产的食用农产品,不需要取得(c)的许可。 + +  A 食品生产 B 食品经营 C 食品生产和流通 D 餐饮服务 + +   +出现食物中毒症状或者误食化学品时,最先采取的急救措施是(a)。 + +  A 催吐 B 吃止泻药物 C 进行人工呼吸 D 向卫生防疫部门报告 + +   +夏季家中的案板、刀具要想达到彻底消毒的目的,需要怎么处理(a)。 + +  A 用沸水浇烫 + +  B 用流动水冲洗 + +  C 用碱水刷洗 + +  D 用洗洁精刷洗 + +   +目前亚硝酸盐食物中毒最常见原因是(a)。 + +  A 餐饮业或集体食堂将亚硝酸盐当作食盐食用 + +  B 吃腐烂变质的咸菜 + +  C 吃腌不透的咸菜 + +  D 食品加工业没有按照卫生标准使用亚硝酸盐 + +   +七八分熟的涮羊肉不宜吃,因为比较容易得(a)。 + +  A 旋毛虫病 B 蛔虫病 C 绦虫病 D 肝吸虫病 + +   +细菌性食物中毒多见于夏秋季,主要是由于(d)。 + +  A 夏季食物易受污染 + +  B 进食熟肉类食品多 + +  C 人口流动性大 + +  D 气温较高,微生物易于生长繁殖 + +   +在我国占食物中毒总数第一位的是(a)。 + +  A 细菌性食物中毒 + +  B 有毒动、植物食物中毒 + +  C 化学性食物中毒 + +  D 霉变食物引起的食物中毒 + +   +食品污染的来源有生物性污染、物理性污染和(d)。 + +  A 细菌性污染 B 病毒性污染 C 病原性污染 D 化学性污染 + +   +购买食品时,应选购包装上有以下哪些内容的食品(d)。 + +  A 生产日期 B 生产厂家 C QS标志 D 以上都是 + +   +正确的餐饮具清洗消毒顺序是哪项(d)。 + +  A 刮、洗、消毒、过清、保洁 + +  B 刮、过清、洗、消毒、保洁 + +  C 过清、洗、刮、消毒、保洁 + +  D 刮、洗、过清、消毒、保洁 + +   +瘦肉精的化学名称是(b)。 + +  A 花楸酸 B 盐酸克伦特罗 C 尼泊金丁酯 D 谷维素 \ No newline at end of file diff --git a/works/life/question-pptx/judge.txt b/works/life/question-pptx/judge.txt new file mode 100644 index 0000000..d539daa --- /dev/null +++ b/works/life/question-pptx/judge.txt @@ -0,0 +1,73 @@ +稻谷加工精度越高,制成的大米的外观和口感越好,但是营养价值却会降低。(a) + +   +保质期不是判断食品是否变质的唯一标准,可能由于存放方式、环境变化等引起过早变质,所以食品应在保质期内尽早食用。(a) + +   +食用油在高温、阳光照射、与空气长期接触等条件下极易发生氧化反应,产生有害物质,因此应当尽量密封,放在干燥、避光、低温的环境保存。(a) + +   +食品安全就是指食品无毒、无害,符合应当有的营养要求,对人体健康不造成任何急性、亚急性或者慢性危害。(a) + +   +任何组织和个人有权举报食品生产经营中违反《食品安全法》的行为,对食品安全监督管理工作提出意见和建议。(a) + +   +食品和食品添加剂与其标签、说明书所载明的内容不符的,也可上市销售。(b) + +   +食品生产经营者的生产经营行为违反《食品安全法》,构成犯罪的,依法追究刑事责任。(a) + +   +预包装食品,指预先定量包装或者制作在包装材料、容器中的食品。(a) + +   +保质期,指预包装食品在标签指明的贮存条件下保持品质的期限。(a) + +   +食品广告的内容应当真实合法,不得含有虚假或者夸大的内容,不得涉及疾病预防、治疗功能。(a) + +   +任何单位或者个人不得对食品安全事故隐瞒、谎报、缓报,不得毁灭有关证据。(a) + +   +食品经营者可以销售无标签的预包装食品。(b) + +   +食品经营者销售散装食品,应当在散装食品的容器、外包装上标明食品的名称、生产日期、保质期等内容。(a) + +   +食品经营者销售生鲜食品和熟食制品,不需要符合食品安全所需要的温度、空间隔离等特殊要求。(b) + +   +食品经营者应当在经营场所显著位置悬挂或者摆放《食品经营许可证》。(a) + +   +食品,指各种供人食用或者饮用的成品和原料以及按照传统既是食品又是药品的物品。(a) + +   +食品添加剂,指为改善食品品质和色、香、味以及为防腐、保鲜和加工工艺的需要而加入食品中的人工合成或者天然物质。(a) + +   +食品放入冰箱就不会坏了。(b) + +   +对造成严重食物中毒事故,构成犯罪的,或者是犯罪嫌疑的,应当移送司法机关处理。(a) + +   +贮存食品的场所、设备应当保持清洁,不得存放有毒、有害物品,但可以存放个人生活用品。(b) + +   +食品经营者不得经营病死、毒死或者死因不明的禽、畜、兽、水产动物肉类及其制品。(a) + +   +由于亚硝酸盐与食盐外观上很接近,容易误食造成食物中毒,因此应该加强亚硝酸盐的保管。(a) + +   +回收食品只要能保证微生物合格和各项指标合格可以作为食品原料进行生产。(b) + +   +食品安全标准是强制执行的标准,除食品安全标准外,不得制定其他的食品强制性标准。(a) + +   +到野外郊游可以随手采些野菜蘑菇回家食用。(b) \ No newline at end of file diff --git a/works/life/question-pptx/main.py b/works/life/question-pptx/main.py new file mode 100644 index 0000000..618efa6 --- /dev/null +++ b/works/life/question-pptx/main.py @@ -0,0 +1,95 @@ +import random +import pptx +from pptx.util import Pt +import re +from typing import Iterable + +# Chinese colon and English colon is different but both should be supported with love! +choice_question_regex = re.compile( + r'(?P\S*?)[\((](?P[a-dA-D])[\))](?P\S*?)\s*[aA]\s+(?P\S+?)\s+[bB]\s*(?P\S+?)\s+[cC]\s*(?P\S+?)\s+[dD]\s*(?P\S+?)\s+', re.MULTILINE) + +choice_text = open('./choose.txt', 'r', encoding='utf-8').read() + +questions = [] + +for match in choice_question_regex.finditer(choice_text): + questions.append({ + 'type': 'c', + 'problem': match.group('problem_1') + "( )" + match.group('problem_2'), + 'answer': match.group('answer').lower(), + 'choices': { + 'a': match.group('choice_a'), + 'b': match.group('choice_b'), + 'c': match.group('choice_c'), + 'd': match.group('choice_d') + } + }) + +judge_question_regex = re.compile( + r'(?P\S+?)\s*[\((](?P[a-bA-B])[\))]', re.MULTILINE) + +judge_text = open('./judge.txt', 'r', encoding='utf-8').read() + + +for match in judge_question_regex.finditer(judge_text): + questions.append({ + 'type': 'j', + 'problem': match.group('problem'), + 'answer': match.group('answer').lower() + }) + + +random.shuffle(questions) + +presentation: pptx.presentation.Presentation = pptx.Presentation() + +buttons: Iterable[pptx.shapes.autoshape.Shape] = [] + +for question in questions: + slide: pptx.slide.Slide = presentation.slides.add_slide( + presentation.slide_layouts[6]) + + title = slide.shapes.add_textbox(Pt(20), Pt(25), Pt(680), Pt(50)) + problem = slide.shapes.add_textbox(Pt(20), Pt(80), Pt(680), Pt(380)) + answer = slide.shapes.add_textbox(Pt(560), Pt(450), Pt(40), Pt(40)) + + if question['type'] == 'c': + title.text = '选择题' + problem.text = question['problem'] + '\n' + '\n'.join( + [choice.upper() + '. ' + question['choices'][choice]for choice in 'abcd']) + answer.text = question['answer'].upper() + else: + title.text = '判断题' + problem.text = question['problem'] + answer.text = '√' if question['answer'] == 'a' else '×' + + title_text_frame: pptx.text.text.TextFrame = title.text_frame + para: pptx.text.text._Paragraph + for para in title_text_frame.paragraphs: + para.font.size = Pt(42) + para.font.color.theme_color = pptx.enum.dml.MSO_THEME_COLOR.TEXT_2 + + problem_text_frame: pptx.text.text.TextFrame = problem.text_frame + problem_text_frame.margin_top = Pt(10) + para: pptx.text.text._Paragraph + for para in problem_text_frame.paragraphs: + para.space_after = Pt(6) + para.font.size = Pt(30) + problem_text_frame.word_wrap = True + + answer_text_frame: pptx.text.text.TextFrame = answer.text_frame + para: pptx.text.text._Paragraph + for para in answer_text_frame.paragraphs: + para.font.size = Pt(40) + para.font.color.rgb = pptx.dml.color.RGBColor(255, 0, 0) + + buttons.append(slide.shapes.add_shape(pptx.enum.shapes.MSO_SHAPE.OVAL, Pt( + 660), Pt(460), Pt(40), Pt(40))) + +slide: pptx.slide.Slide = presentation.slides.add_slide( + presentation.slide_layouts[6]) + +for button in buttons: + button.click_action.target_slide = slide + +presentation.save('test.pptx') -- cgit v1.2.3