Add files via upload

master
JesterHey 2 years ago committed by GitHub
parent d357047662
commit 29dc7b5562
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -0,0 +1,45 @@
from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes
from Crypto.Util.Padding import pad, unpad
def encrypt_message(message, key):
"""
加密函数
:param message: 要加密的明文消息
:param key: 加密密钥
:return: 密文
"""
# 创建 AES 对象
cipher = AES.new(key, AES.MODE_CBC)
# 对明文进行填充,然后加密
ct_bytes = cipher.encrypt(pad(message.encode(), AES.block_size))
# 将 IV 和密文返回
return cipher.iv, ct_bytes
def decrypt_message(iv, ct, key):
"""
解密函数
:param iv: 初始化向量
:param ct: 密文
:param key: 加密密钥
:return: 解密后的明文
"""
# 创建一个新的 AES 对象
cipher = AES.new(key, AES.MODE_CBC, iv)
# 解密并去除填充
pt = unpad(cipher.decrypt(ct), AES.block_size).decode()
return pt
# 测试
key = get_random_bytes(16) # 生成随机密钥
message = "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"
iv, ct = encrypt_message(message, key)
print("Encrypted:", ct)
pt = decrypt_message(iv, ct, key)
print("Decrypted:", pt)

@ -33,3 +33,5 @@ def upload(name):
def delete(name): def delete(name):
bucket.delete_object(name) bucket.delete_object(name)
delete('18503.json')

@ -1,19 +1,5 @@
from openai import OpenAI import json
import openai with open('demo.json','r',encoding='utf-8') as f:
import os data = json.load(f)
openai.api_base = "https://api.openai-proxy.com" for i,j in enumerate(data.items()):
openai.api_key = "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" print(i,j[-1])
# os.environ['http_proxy'] = 'http://127.0.0.1:10809'
# os.environ['https_proxy'] = 'http://127.0.0.1:10809'
client = OpenAI(
api_key='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',
base_url='https://api.openai-proxy.com'
)
resp = client.chat.completions.create(
model='gpt-3.5-turbo',
messages=[
{'role': 'user', 'content': '你好!'}
]
)
print(resp.choices[0].message.content)

@ -1,7 +1,13 @@
'''
本模块用于创建登录界面并保存用户信息
'''
import sys import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLineEdit, QPushButton, QVBoxLayout, QHBoxLayout, QLabel from PyQt5.QtWidgets import QApplication, QWidget, QLineEdit, QPushButton, QVBoxLayout, QHBoxLayout, QLabel
from PyQt5.QtCore import Qt from PyQt5.QtCore import Qt,QTimer
from PyQt5.QtGui import QPixmap, QPainter from PyQt5.QtGui import QPixmap, QPainter
import os
import platform
import json
class MyApp(QWidget): class MyApp(QWidget):
def __init__(self): def __init__(self):
@ -10,8 +16,7 @@ class MyApp(QWidget):
def initUI(self): def initUI(self):
# 加载背景图片 # 加载背景图片
self.background = QPixmap('hnu.jpg') self.background = QPixmap()
# 创建一个垂直布局 # 创建一个垂直布局
mainLayout = QVBoxLayout() mainLayout = QVBoxLayout()
@ -19,14 +24,17 @@ class MyApp(QWidget):
self.nameEdit = QLineEdit() self.nameEdit = QLineEdit()
self.pwdEdit = QLineEdit() self.pwdEdit = QLineEdit()
self.urlEdit = QLineEdit() self.urlEdit = QLineEdit()
self.nameEdit.setPlaceholderText('Name')
self.pwdEdit.setPlaceholderText('Password')
self.urlEdit.setPlaceholderText('URL')
# 创建一个按钮并连接信号 # 创建一个按钮并连接信号
btn = QPushButton('提交') btn = QPushButton('提交')
btn.clicked.connect(self.onSubmit) btn.clicked.connect(self.onSubmit)
# 创建一个用于显示错误信息的标签
self.errorLabel = QLabel('', self)
self.errorLabel.hide() # 初始时隐藏该标签
self.setWindowTitle('头歌助手登录')
# 对于每个输入框,创建一个水平布局以保持居中 # 对于每个输入框,创建一个水平布局以保持居中
for label_text, edit_widget in [("用户名", self.nameEdit), for label_text, edit_widget in [("用户名", self.nameEdit),
("密 码", self.pwdEdit), ("密 码", self.pwdEdit),
@ -40,13 +48,13 @@ class MyApp(QWidget):
hbox.addStretch() hbox.addStretch()
mainLayout.addLayout(hbox) mainLayout.addLayout(hbox)
# 添加按钮到布局 # 添加按钮和错误信息标签到布局
mainLayout.addWidget(btn, 0, Qt.AlignCenter) mainLayout.addWidget(btn, 0, Qt.AlignCenter)
mainLayout.addWidget(self.errorLabel, 0, Qt.AlignCenter)
# 设置窗口的布局 # 设置窗口的布局
self.setLayout(mainLayout) self.setLayout(mainLayout)
self.setWindowTitle('') self.setGeometry(300, 300, 650, 550)
self.setGeometry(300, 300, 400, 300)
self.centerWindow() self.centerWindow()
# 应用样式 # 应用样式
@ -54,14 +62,7 @@ class MyApp(QWidget):
def paintEvent(self, event): def paintEvent(self, event):
painter = QPainter(self) painter = QPainter(self)
painter.drawPixmap(self.rect(), self.background)
# 计算背景图片绘制的起始坐标,使其位于窗口中心
bgWidth = self.background.width()
bgHeight = self.background.height()
startX = (self.width() - bgWidth) // 2
startY = (self.height() - bgHeight) // 2
painter.drawPixmap(startX, startY, self.background)
def centerWindow(self): def centerWindow(self):
qr = self.frameGeometry() qr = self.frameGeometry()
@ -75,10 +76,31 @@ class MyApp(QWidget):
border: 1px solid gray; border: 1px solid gray;
border-radius: 10px; border-radius: 10px;
padding: 5px; padding: 5px;
background: transparent; background: rgba(255, 255, 255, 100);
color: black;
width: 300px;
height: 30px;
} }
QLineEdit:focus { QLineEdit:focus {
border: 1px solid LightSeaGreen; border: 3px solid black;
}
QLabel {
color: black;
font-size: 20pt;
font-family: "Microsoft YaHei";
}
QPushButton {
border: 1px solid gray;
border-radius: 10px;
background: rgba(255, 255, 255, 100);
color: black;
width: 100px;
height: 27px;
}
/* 样式用于错误信息标签 */
QLabel#errorLabel {
color: red;
font-size: 16pt;
} }
""") """)
@ -86,13 +108,27 @@ class MyApp(QWidget):
name = self.nameEdit.text() name = self.nameEdit.text()
pwd = self.pwdEdit.text() pwd = self.pwdEdit.text()
url = self.urlEdit.text() url = self.urlEdit.text()
print(f"Name: {name}, Password: {pwd}, URL: {url}")
# 关闭窗口 if name == '' or pwd == '' or url == '':
self.showError("非法输入!")
else:
with open('userinfo.json', 'w') as f:
json.dump({'name': name, 'pwd': pwd, 'url': url}, f)
self.close() self.close()
if __name__ == '__main__': def showError(self, message):
self.errorLabel.setText(message)
self.errorLabel.show()
QTimer.singleShot(2000, self.hideError)
def hideError(self):
self.errorLabel.hide()
def main():
app = QApplication(sys.argv) app = QApplication(sys.argv)
ex = MyApp() ex = MyApp()
ex.show() ex.show()
sys.exit(app.exec_()) sys.exit(app.exec_())
if __name__ == '__main__':
main()

@ -10,6 +10,7 @@
''' '''
#导入所需模块 #导入所需模块
import platform
import os import os
import json import json
import time import time
@ -25,23 +26,26 @@ from cloud import is_exist,download
#配置参数 #配置参数
opt = Options() opt = Options()
opt.add_experimental_option('detach', True) opt.add_experimental_option('detach', True)
opt.add_argument('--headless') #opt.add_argument('--headless')
chrome_driver = 'D:\ChromeDownload\chromedriver-win64\chromedriver-win64' chrome_driver = 'D:\ChromeDownload\chromedriver-win64\chromedriver-win64'
#以下部分在发行版本需要优化UI # 发行版时改为调用userinfo.json文件中的用户名和密码
# url = input('请输入作业中任意一关的网址:')
# user_name = input('请输入用户名:')
# password = input('请输入密码:')
url = 'https://www.educoder.net/tasks/27V4D95N/1191515/vmxpzae734bj?coursesId=27V4D95N' url = 'https://www.educoder.net/tasks/27V4D95N/1191515/vmxpzae734bj?coursesId=27V4D95N'
user_name = 'hnu202311020126' user_name = 'hnu202311020126'
password = 'hzy123456' password = 'hzy123456'
# 另外目前好像只有实训作业有这些参数其他的作业例如编程作业就没有所以先判断一下是否为实训作业可以通过用户输入的url判断 platf = platform.platform()
# 主要是看educoder.net/后面是否有tasks如果有则是实训作业否则不是实训作业
def is_practice(url:str) -> bool: def is_practice(url:str) -> bool:
obj=re.compile(r'www.educoder.net/tasks') obj=re.compile(r'www.educoder.net/tasks')
if obj.search(url): if obj.search(url):
return True return True
else: else:
return False return False
# 另外目前好像只有实训作业有这些参数其他的作业例如编程作业就没有所以先判断一下是否为实训作业可以通过用户输入的url判断
# 主要是看educoder.net/后面是否有tasks如果有则是实训作业否则不是实训作业
#为方便main.py调用将判断函数写入函数中以下部分封装为函数
def get_parameters(url:str,user_name:str,password:str):
url = url
user_name = user_name
password = password
if is_practice(url): if is_practice(url):
#构造selenium对象 #构造selenium对象
safari = Chrome(options=opt) safari = Chrome(options=opt)
@ -52,6 +56,18 @@ if is_practice(url):
safari.find_element(By.ID, 'password').send_keys(password) safari.find_element(By.ID, 'password').send_keys(password)
safari.find_element(By.ID, 'password').send_keys(Keys.ENTER) safari.find_element(By.ID, 'password').send_keys(Keys.ENTER)
time.sleep(2) time.sleep(2)
#判断是否登录成功
try:
safari.find_element(By.XPATH,'//*[@id="task-left-panel"]/div[1]/a[1]')
except BaseException:
print('登录失败 请检查输入信息是否正确')
# 关闭浏览器
safari.quit()
#重新调用login_ui.py
if 'Windows' in platf:
os.system('python login_ui.py')
else:
os.system('python3 login_ui.py')
#获取cookieUser-Agent #获取cookieUser-Agent
Cookie = safari.get_cookies() Cookie = safari.get_cookies()
User_Agent = safari.execute_script('return navigator.userAgent') User_Agent = safari.execute_script('return navigator.userAgent')
@ -86,6 +102,7 @@ if is_practice(url):
except Exception as e: except Exception as e:
print(e) print(e)
finally: #不存在,则继续执行本程序 finally: #不存在,则继续执行本程序
print('云端文件不存在,正在爬取')
#获取关卡数 #获取关卡数
#点击展开关卡页面 #点击展开关卡页面
safari.find_element(By.XPATH,'//*[@id="task-left-panel"]/div[1]/a[1]').click() safari.find_element(By.XPATH,'//*[@id="task-left-panel"]/div[1]/a[1]').click()
@ -159,11 +176,15 @@ if is_practice(url):
if value['code'] == '': if value['code'] == '':
print('检测到代码参数为空值,重新爬取') print('检测到代码参数为空值,重新爬取')
safari.close() safari.close()
# 再次执行本程序
if 'Windows' in platf:
os.system('python get_params.py') os.system('python get_params.py')
exit() else:
os.system('python3 get_params.py')
#把参数写入本地json文件中文件名字与shixun_name相同键为course_id值为一个列表列表中每个元素为一个字典字典中包含每一关的参数 #把参数写入本地json文件中文件名字与shixun_name相同键为course_id值为一个列表列表中每个元素为一个字典字典中包含每一关的参数
with open(f'{shixun_id}.json','w',encoding='utf-8') as f: with open(f'{shixun_id}.json','w',encoding='utf-8') as f:
json.dump(total,f,ensure_ascii=False,indent=4) json.dump(total,f,ensure_ascii=False,indent=4)
print('参数爬取完成')
#关闭浏览器 #关闭浏览器
safari.quit() safari.quit()
else: else:

@ -1,8 +1,14 @@
'''
本模块用于创建登录界面并保存用户信息
'''
import sys import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLineEdit, QPushButton, QVBoxLayout, QHBoxLayout, QLabel from PyQt5.QtWidgets import QApplication, QWidget, QLineEdit, QPushButton, QVBoxLayout, QHBoxLayout, QLabel
from PyQt5.QtCore import Qt from PyQt5.QtCore import Qt,QTimer
from PyQt5.QtGui import QPixmap, QPainter from PyQt5.QtGui import QPixmap, QPainter
import os import os
import platform
import json
class MyApp(QWidget): class MyApp(QWidget):
def __init__(self): def __init__(self):
super().__init__() super().__init__()
@ -10,7 +16,7 @@ class MyApp(QWidget):
def initUI(self): def initUI(self):
# 加载背景图片 # 加载背景图片
self.background = QPixmap('b3o.png') self.background = QPixmap('picture\\b2.png')
# 创建一个垂直布局 # 创建一个垂直布局
mainLayout = QVBoxLayout() mainLayout = QVBoxLayout()
@ -18,40 +24,41 @@ class MyApp(QWidget):
self.nameEdit = QLineEdit() self.nameEdit = QLineEdit()
self.pwdEdit = QLineEdit() self.pwdEdit = QLineEdit()
self.urlEdit = QLineEdit() self.urlEdit = QLineEdit()
# self.nameEdit.setPlaceholderText('Name')
# self.pwdEdit.setPlaceholderText('Password')
# self.urlEdit.setPlaceholderText('URL')
# 创建一个按钮并连接信号 # 创建一个按钮并连接信号
btn = QPushButton('提交') btn = QPushButton('提交')
btn.clicked.connect(self.onSubmit) btn.clicked.connect(self.onSubmit)
# 创建一个用于显示错误信息的标签
self.errorLabel = QLabel('', self)
self.errorLabel.hide() # 初始时隐藏该标签
self.setWindowTitle('头歌助手登录') self.setWindowTitle('头歌助手登录')
# 对于每个输入框,创建一个水平布局以保持居中 # 对于每个输入框,创建一个水平布局以保持居中
for label_text, edit_widget in [("用户名", self.nameEdit), for label_text, edit_widget in [("用户名", self.nameEdit),
("密 码", self.pwdEdit), ("密 码", self.pwdEdit),
("实训网址", self.urlEdit)]: ("实训网址", self.urlEdit)]:
hbox = QHBoxLayout() #创建一个水平布局 hbox = QHBoxLayout()
hbox.addStretch() #添加一个伸缩因子,使得文本框和按钮位于窗口中心 hbox.addStretch()
vbox_inner = QVBoxLayout() #创建一个垂直布局 vbox_inner = QVBoxLayout()
vbox_inner.addWidget(QLabel(label_text)) #添加一个标签 vbox_inner.addWidget(QLabel(label_text))
vbox_inner.addWidget(edit_widget) #添加一个文本框 vbox_inner.addWidget(edit_widget)
hbox.addLayout(vbox_inner) #将垂直布局添加到水平布局中 hbox.addLayout(vbox_inner)
hbox.addStretch() #添加一个伸缩因子,使得文本框和按钮位于窗口中心 hbox.addStretch()
mainLayout.addLayout(hbox) #将水平布局添加到垂直布局中 mainLayout.addLayout(hbox)
# 添加按钮到布局 # 添加按钮和错误信息标签到布局
mainLayout.addWidget(btn, 0, Qt.AlignCenter) mainLayout.addWidget(btn, 0, Qt.AlignCenter)
mainLayout.addWidget(self.errorLabel, 0, Qt.AlignCenter)
# 设置窗口的布局 # 设置窗口的布局
self.setLayout(mainLayout) self.setLayout(mainLayout)
self.setWindowTitle('') self.setGeometry(350, 350, 1200, 700)
self.setGeometry(300, 300, 650,550) # 设置窗口大小,其中300,300为窗口左上角坐标1000,600为窗口大小
self.centerWindow() self.centerWindow()
# 应用样式 # 应用样式
self.applyStyles() self.applyStyles()
self.show()
def paintEvent(self, event): def paintEvent(self, event):
painter = QPainter(self) painter = QPainter(self)
@ -64,40 +71,40 @@ class MyApp(QWidget):
self.move(qr.topLeft()) self.move(qr.topLeft())
def applyStyles(self): def applyStyles(self):
# css 用于设置窗口样式
self.setStyleSheet(""" self.setStyleSheet("""
QLineEdit { QLineEdit {
border: 1px solid gray; border: 1px solid gray;
border-radius: 10px; border-radius: 10px;
padding: 5px; padding: 5px;
background: rgba(255, 255, 255, 100); background: rgba(255, 255, 255, 100);
color: black;
width: 300px;
height: 50px;
font-size: 14pt; /* 设置字号为14磅 */
font-family: 'Microsoft YaHei'; /* 设置字体为微软雅黑 */
} }
QLineEdit:focus { QLineEdit:focus {
border: 1px solid black; border: 3px solid black;
} }
QLabel { QLabel {
color: black; color: black;
font-size: 23pt; font-size: 20pt;
font-family: "Microsoft YaHei";
margin-top: 50px; /* 顶部外边距 */ margin-top: 50px; /* 顶部外边距 */
margin-left: 20px; /* 左侧外边距 */ margin-left: 200px; /* 左侧外边距 */
}
QLineEdit {
border: 1px solid gray;
border-radius: 10px;
padding: 5px;
background: rgba(255, 255, 255, 100);
color: black; /* 设置输入文本颜色为黑色 */
width: 300px; /* 设置输入框宽度 */
height: 30px; /* 设置输入框高度 */
} }
QPushButton { QPushButton {
border: 1px solid gray; border: 1px solid gray;
border-radius: 10px; border-radius: 10px;
padding: 5px;
background: rgba(255, 255, 255, 100); background: rgba(255, 255, 255, 100);
color: black; /* 设置按钮文本颜色为黑色 */ color: black;
width: 100px; /* 设置按钮宽度 */ width: 100px;
height: 27px; /* 设置按钮高度 */ height: 27px;
}
/* 样式用于错误信息标签 */
QLabel#errorLabel {
color: red;
font-size: 16pt;
} }
""") """)
@ -105,12 +112,32 @@ class MyApp(QWidget):
name = self.nameEdit.text() name = self.nameEdit.text()
pwd = self.pwdEdit.text() pwd = self.pwdEdit.text()
url = self.urlEdit.text() url = self.urlEdit.text()
print(f"Name: {name}, Password: {pwd}, URL: {url}")
# 关闭窗口 if name == '' or pwd == '' or url == '' or ~url.startswith('https') or ~url.startswith('www'):
self.showError("非法输入!")
else:
with open('userinfo.json', 'w') as f:
json.dump({'name': name, 'pwd': pwd, 'url': url}, f)
self.close() self.close()
def showError(self, message):
self.errorLabel.setText(message)
self.errorLabel.show()
QTimer.singleShot(1200, self.hideError)
def hideError(self):
self.errorLabel.hide()
# 关闭窗口
# 判断当前操作系统(基础太渣,只能这样判断了,哈哈)
platf = platform.platform()
if platf.startswith('Windows'):
os.system('python show_welcome.py')
else:
os.system('python3 show_welcome.py') os.system('python3 show_welcome.py')
app = QApplication(sys.argv) app = QApplication(sys.argv) # 创建应用程序对象
ex = MyApp() ex = MyApp() # 创建窗口对象
ex.show() ex.show() # 显示窗口
sys.exit(app.exec_()) sys.exit(app.exec_()) # 保证程序完整退出

@ -11,5 +11,74 @@
# 如果云端答案不存在则调用get_answer.py获取答案并展示给用户 # 如果云端答案不存在则调用get_answer.py获取答案并展示给用户
# 用户verif选项确认后调用cloud.py将json文件存入云端 # 用户verif选项确认后调用cloud.py将json文件存入云端
# 导入所需模块
import platform
from get_params import get_parameters
from get_answer import get_answer_from_api,promot,client
import json
import os
import login_ui # 判断当前操作系统
platf = platform.platform()
# 调用login_ui获得用户输入的用户名、密码和实训网址
if platf.startswith('Windows'):
os.system('python login_ui.py')
else:
os.system('python3 login_ui.py')
# 检查userinfo.json文件是否存在存在则程序继续
assert os.path.exists('userinfo.json'), 'userinfo.json文件不存在,请检查'
# 先读取userinfo.json文件获得用户名、密码和实训网址
with open('userinfo.json', 'r') as f:
userinfo = json.load(f)
user_name = userinfo['name']
password = userinfo['pwd']
url = userinfo['url']
# 调用get_params.py获得参数完成后本地应该有一个json文件里面有参数
get_parameters(url,user_name,password)
def get_json(file):
return [i for i in os.listdir(file) if i.endswith('.json')]
#将file指定为当前目录
file = os.getcwd()
json_names = get_json(file)
# 遍历查找以数字开头的json文件即为获得到的json文件可能是云端下载的也可能是爬取的
global j_name
for j in json_names:
if j[0].isdigit():
# 将该文件名赋值给json_name
j_name = j
break
# 判断json_name文件中是否有answer若有提取answer并格式化或展现
with open(j_name,'r',encoding='utf-8') as f:
json_data = json.load(f)
def is_exist_answer(data:dict) -> bool:
for i,j in data.items():
if 'answer' in j.keys():
return True
return False
if is_exist_answer(json_data):
pass
else:
# 调用API获取答案
new_data = get_answer_from_api(jsonfile=json_data,client=client,promot=promot)
# 重写本地json文件
with open(j_name,'w',encoding='utf-8') as f:
json.dump(new_data,f,ensure_ascii=False,indent=4)
# 上面的判断执行完后本地的json文件中已经有answer了下面实现信息展示
# release版本要优化UIbeta版本先用print代替
# 读取json文件获得answer
with open(j_name,'r',encoding='utf-8') as f:
data = json.load(f)
# 由于python3.6之后字典是有序的,所以可以直接遍历字典,显示关卡序号和答案
# 要将key在data中对应的索引值+1因为索引值是从0开始的
for i,j in enumerate(data.items()):
print(f'{i+1}关的答案是:{j[-1]["answer"]}')
# 询问用户是否认证答案正确(下午新开一个模块实现)

@ -1,5 +1,5 @@
import sys import sys
from PyQt5.QtWidgets import QApplication, QLabel, QWidget from PyQt5.QtWidgets import QApplication, QLabel, QWidget, QDesktopWidget
from PyQt5.QtGui import QPixmap from PyQt5.QtGui import QPixmap
from PyQt5.QtCore import QTimer, Qt from PyQt5.QtCore import QTimer, Qt
@ -15,25 +15,32 @@ class ImageWindow(QWidget):
label = QLabel(self) label = QLabel(self)
pixmap = QPixmap(image_path) pixmap = QPixmap(image_path)
# 缩放图片到期望的大小 # 获取屏幕尺寸
scaled_pixmap = pixmap.scaled(700, 400, Qt.KeepAspectRatio) # 设置图片大小为400x300并保持纵横比 screen = QDesktopWidget().screenGeometry()
# 缩放图片大小
# 过时警告 scaled_pixmap = pixmap.scaledint(screen.width() * 0.5, screen.height() * 0.5, Qt.KeepAspectRatio)
scaled_pixmap = pixmap.scaled(int(screen.width() * 0.5), int(screen.height() * 0.5), Qt.KeepAspectRatio)
label.setPixmap(scaled_pixmap) label.setPixmap(scaled_pixmap)
self.resize(scaled_pixmap.width(), scaled_pixmap.height()) self.resize(scaled_pixmap.width(), scaled_pixmap.height())
# 居中显示窗口 # 居中显示窗口
self.centerWindow()
QTimer.singleShot(4500, self.close)
def centerWindow(self):
# 居中窗口
qr = self.frameGeometry() qr = self.frameGeometry()
cp = QApplication.desktop().availableGeometry().center() cp = QDesktopWidget().availableGeometry().center() # 获取屏幕中心点
qr.moveCenter(cp) qr.moveCenter(cp)
self.move(qr.topLeft()) self.move(qr.topLeft())
QTimer.singleShot(3000, self.close) def show_image():
def show():
app = QApplication(sys.argv) app = QApplication(sys.argv)
ex = ImageWindow('b2.png') ex = ImageWindow('picture\\b2txt.png') # 图片路径
ex.show() ex.show()
sys.exit(app.exec_()) sys.exit(app.exec_())
if __name__ == '__main__':
show()
show_image()

@ -1 +1 @@
# 我真甜蜜地服了互联网上一群傻逼到处TMD跟喷史一样到处拉史一样的垃圾信息就TM配置个代理一帮牛马讲得TMD的天花乱坠什么TM云函数Cloudfare代理Njanx反向代理真NMSL的一群人。好不容易TND有几个人直接给TM代理地址又不说明要加/v1官方文档也TM是一堆若至写的吗API用法更新了就TM给几个示例代码是怕GitHub存储费用太高吗社区和和论坛也是一帮彼阳的晚意TM跟东晋士大夫一样搁哪清谈半天NM一个给代码示例的人都没有屈指可数的几个代码又是API1.2版本之前的用不了一点捏。我TM找整整2天就差冲OpenAI官网的时候无意间看到CSDN上的[这篇帖子](https://blog.csdn.net/qq_36265860/article/details/130111351)。WC什么叫清晰什么叫对比什么叫做程序员的自我修养TM我那么简单的一个问题就只有这个老哥给出解答。我NM真的当时真的想嫁给这个哥了。我宣布CSDN就是世界第一技术论坛那些说看CSDN是屎里淘食的人下赛季池史。以后多看书再上网查这种技术问题我也是SB。暂时就想到那么多哈哈。 # 我真甜蜜地服了互联网上一群傻逼到处TMD跟喷史一样到处拉史一样的垃圾信息就TM配置个代理一帮牛马讲得TMD的天花乱坠什么TM云函数Cloudfare代理Njanx反向代理真NMSL的一群人。好不容易TND有几个人直接给TM代理地址又不说明要加/v1官方文档也TM是一堆SB写的吗API用法更新了就TM给几个示例代码是怕GitHub存储费用太高吗社区和和论坛也是一帮勾石东西TM跟东晋士大夫一样搁哪清谈半天NM一个给代码示例的人都没有屈指可数的几个代码又是API1.2版本之前的用不了一点捏。我TM找整整2天就差冲OpenAI官网的时候无意间看到CSDN上的[这篇帖子](https://blog.csdn.net/qq_36265860/article/details/130111351)。WC什么叫清晰什么叫对比什么叫做程序员的自我修养TM我那么简单的一个问题就只有这个老哥给出解答。我NM真的当时真的想嫁给这个哥了。我宣布CSDN就是世界第一技术论坛那些说看CSDN是屎里淘食的人下赛季池史。以后多看书再上网查这种技术问题我也是SB。暂时就想到那么多哈哈。

Loading…
Cancel
Save