diff --git a/apidemo.py b/apidemo.py new file mode 100644 index 0000000..e69de29 diff --git a/cloud.py b/cloud.py index 86a534b..69c829f 100644 --- a/cloud.py +++ b/cloud.py @@ -4,6 +4,7 @@ import oss2 import os import json +from oss2.credentials import EnvironmentVariableCredentialsProvider # 云端存储的文件名称都是shixun_id.json,并且要保证都是有答案的. # 阿里云 OSS 配置 access_key_id = 'LTAI5t927vdUFZa9NRnWfrL3' @@ -29,9 +30,21 @@ def upload(name): if 'answer' not in j.keys() or j['answer'] == '': # 断言查询结果并抛出异常 assert False,'答案为空,不予上传' - bucket.put_object_from_file(name, name) + # 再检查文件是否存在,如果不存在,则上传 + if not is_exist(name): + bucket.put_object_from_file(name, name) def delete(name): - bucket.delete_object(name) + # 先检查文件是否存在,如果存在,则删除 + if is_exist(name): + bucket.delete_object(name) + +if __name__ == '__main__': + # 测试用 + # print(is_exist('18503.json')) + # download('18503.json') + # delete('18503.json') + for obj in oss2.ObjectIterator(bucket): + print(obj.key) + -delete('18503.json') \ No newline at end of file diff --git a/demo.py b/demo.py index 41b05df..f1a6e7c 100644 --- a/demo.py +++ b/demo.py @@ -1,5 +1,7 @@ import json -with open('demo.json','r',encoding='utf-8') as f: +with open('18503.json','r',encoding='utf-8') as f: data = json.load(f) -for i,j in enumerate(data.items()): - print(i,j[-1]) \ No newline at end of file + +for i,j in data.items(): + print(j['answer']) + print('-'*50) \ No newline at end of file diff --git a/demo.txt b/demo.txt new file mode 100644 index 0000000..6ab02de --- /dev/null +++ b/demo.txt @@ -0,0 +1,48 @@ +import sys +from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QTextEdit +from PyQt5.QtCore import QTimer + +class TypewriterEffectApp(QWidget): + def __init__(self, filepath): + super().__init__() + self.filepath = filepath + self.initUI() + self.startTyping() + + def initUI(self): + # 设置窗口布局和控件 + layout = QVBoxLayout(self) + self.textEdit = QTextEdit(self) + self.textEdit.setReadOnly(True) + layout.addWidget(self.textEdit) + + # 设置窗口 + self.setWindowTitle("Typewriter Effect") + self.setGeometry(300, 300, 600, 400) + + def startTyping(self): + # 读取文件内容 + with open(self.filepath, 'r') as file: + self.content = file.read() + + # 设置定时器逐字显示文本 + self.index = 0 + self.timer = QTimer(self) + self.timer.timeout.connect(self.displayNextCharacter) + self.timer.start(100) # 设置间隔(毫秒) + + def displayNextCharacter(self): + if self.index < len(self.content): + self.textEdit.insertPlainText(self.content[self.index]) + self.index += 1 + else: + self.timer.stop() + +def main(): + app = QApplication(sys.argv) + ex = TypewriterEffectApp('path_to_text_file.txt') # 替换为您的文件路径 + ex.show() + sys.exit(app.exec_()) + +if __name__ == '__main__': + main() diff --git a/demo2.txt b/demo2.txt new file mode 100644 index 0000000..400ddca --- /dev/null +++ b/demo2.txt @@ -0,0 +1,5 @@ +为了在您的代码中加入光标闪烁效果,我们可以使用一个额外的定时器来控制一个虚拟光标(例如一个竖线符号 '|')的显示和隐藏。这样,您的应用程序在显示文本的同时,也会模拟一个正在输入的效果。 + +以下是修改后的代码: + +修改后的代码 \ No newline at end of file diff --git a/get_answer.py b/get_answer.py index 78a7ce3..0e181ec 100644 --- a/get_answer.py +++ b/get_answer.py @@ -31,8 +31,6 @@ with open(json_name,'r',encoding='utf-8') as f: 用于构造请求的参数:describe,require,code 向GPT提问的格式:promot + 参数模板化的问题 ''' -os.environ['http_proxy'] = 'http://127.0.0.1:10809' -os.environ['https_proxy'] = 'http://127.0.0.1:10809' promot = '现在,我想让你扮演一个Python程序员来解一个问题,我的问题将由三个部分组成,第一部分是问题的描述,第二部分是问题的需求,第三部分是问题的代码,我需要你按照我的模板编写代码。并且你返回的代码应当是带有注释的' #构造问题模板 @@ -45,7 +43,8 @@ promot = '现在,我想让你扮演一个Python程序员来解一个问题, # 初始化异步客户端 client = AsyncOpenAI( - api_key='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' + api_key='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', + base_url='https://api.op-enai.com/v1' ) def get_answer_from_api(jsonfile:dict,client:AsyncOpenAI,promot:str) -> dict: data = jsonfile @@ -74,10 +73,10 @@ def get_answer_from_api(jsonfile:dict,client:AsyncOpenAI,promot:str) -> dict: tasks = [get_answer(cid,value) for cid,value in data.items()] answers = await asyncio.gather(*tasks) # 返回一个列表,列表中的每个元素为每个异步任务的返回值 #由于异步获得的答案顺序不确定,需要处理,先把答案按照关卡id排序 - answers.sort(key=lambda x:int(x.split('/')[0])) + answers = sorted(answers,key=lambda x:int(x.split('/')[0])) # 在data的每个value中新增一个键值对,键为answer,值为答案,并作为返回值返回 for i in range(len(answers)): - ansewer_data[list(ansewer_data.keys())[i]]['answer'] = answers[i] + ansewer_data[list(ansewer_data.keys())[i]]['answer'].split('/')[-1] = answers[i] return ansewer_data diff --git a/get_params.py b/get_params.py index e2f1528..fe1fc54 100644 --- a/get_params.py +++ b/get_params.py @@ -190,3 +190,5 @@ def get_parameters(url:str,user_name:str,password:str): else: print('这不是一个实训作业') exit() + +get_parameters(url,user_name,password) \ No newline at end of file diff --git a/login_ui.py b/login_ui.py index fa07d82..07c186a 100644 --- a/login_ui.py +++ b/login_ui.py @@ -16,7 +16,7 @@ class MyApp(QWidget): def initUI(self): # 加载背景图片 - self.background = QPixmap('picture\\b2.png') + self.background = QPixmap('/Users/xuxiaolan/PycharmProjects/GPTPowered_EducoderHelper/picture/b2.png') # 创建一个垂直布局 mainLayout = QVBoxLayout() diff --git a/printtxt.py b/printtxt.py new file mode 100644 index 0000000..7f9e2b6 --- /dev/null +++ b/printtxt.py @@ -0,0 +1,84 @@ +import sys +from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QTextEdit, QDesktopWidget, QScrollBar +from PyQt5.QtCore import QTimer +from PyQt5.QtGui import QFont + +class TypewriterEffectApp(QWidget): + def __init__(self, filepaths): + super().__init__() + self.filepaths = filepaths + self.userIsScrolling = False + self.initUI() + self.startTyping() + + def initUI(self): + layout = QVBoxLayout(self) + self.textEdit = QTextEdit(self) + self.textEdit.setReadOnly(True) + self.textEdit.setFont(QFont('Microsoft YaHei', 16)) + layout.addWidget(self.textEdit) + + self.setWindowSizeAndCenter() + + # 连接滚动条的valueChanged信号 + self.textEdit.verticalScrollBar().valueChanged.connect(self.onScrollBarValueChanged) + + def setWindowSizeAndCenter(self): + screen = QDesktopWidget().availableGeometry() + self.resize(int(screen.width() * 0.75), int(screen.height() * 0.75)) + self.centerWindow() + + def centerWindow(self): + qr = self.frameGeometry() + cp = QDesktopWidget().availableGeometry().center() + qr.moveCenter(cp) + self.move(qr.topLeft()) + + def startTyping(self): + self.content = "" + for filepath in self.filepaths: + with open(filepath, 'r') as file: + self.content += file.read() + "\n" + "-"*50 + "\n" + + self.index = 0 + self.timer = QTimer(self) + self.timer.timeout.connect(self.displayNextCharacter) + self.timer.start(5) + + def displayNextCharacter(self): + if self.index < len(self.content): + char = self.content[self.index] + #如果char和下一个字符是\n,那么就要执行换行 + if char == '\n' and self.content[self.index+1] == '\n': + text_to_display = self.textEdit.toPlainText() + '\n\n' + self.index += 1 + elif char == '\\t': + # 对制表符进行处理 + text_to_display = self.textEdit.toPlainText() + '\t' + else: + # 普通字符 + text_to_display = self.textEdit.toPlainText() + char + + # 添加光标(移除啦,加了总是有神奇bug) + #text_to_display += '|' if self.cursorVisible else '' + self.textEdit.setPlainText(text_to_display) + self.index += 1 + self.textEdit.ensureCursorVisible() # 始终滚动到底部 + else: + self.timer.stop() + #self.cursorTimer.stop() # 停止光标闪烁 + + + def onScrollBarValueChanged(self, value): + scroll_bar = self.textEdit.verticalScrollBar() + self.userIsScrolling = value < scroll_bar.maximum() + +def main(): + app = QApplication(sys.argv) + filepaths = ['18503 copy.json'] # 替换为您的文件路径 + ex = TypewriterEffectApp(filepaths) + ex.show() + sys.exit(app.exec_()) + +if __name__ == '__main__': + main() diff --git a/show_welcome.py b/show_welcome.py index 0466650..2aac2f0 100644 --- a/show_welcome.py +++ b/show_welcome.py @@ -38,7 +38,7 @@ class ImageWindow(QWidget): def show_image(): app = QApplication(sys.argv) - ex = ImageWindow('picture\\b2txt.png') # 图片路径 + ex = ImageWindow('/Users/xuxiaolan/PycharmProjects/GPTPowered_EducoderHelper/picture/b2txt.png') # 图片路径 ex.show() sys.exit(app.exec_())