class PlateInputTools: def __init__(self): super(PlateInputTools, self).__init__() self.sql_name = 'plateinfo' self.tools = SqlTools.Tools() self.tools.create_sql(self.sql_name, 'plateinfo') self.ui = QUiLoader().load('../Gui/PlateInput.ui') self.ui.pushButton.clicked.connect(self.input) self.ui.pushButton_2.clicked.connect(self.cancel) def input(self): plate = self.ui.lineEdit.text() check_plate = self.tools.check_plate(plate) if check_plate[0]: QMessageBox.information(self.ui, '提示!', '车牌已存在,请勿重复录入!') return else: res = self.tools.input_plate(plate) if res[0]: QMessageBox.information(self.ui, '提示!', res[1]) else: QMessageBox.information(self.ui, '提示!', res[1]) return def cancel(self): self.ui.close()
class MainWindow: def __init__(self): self.ui = QUiLoader().load('mainwindow.ui') self.ui.LoginButton.clicked.connect(self.Login) def Login(self): global is_t, is_s, username self.sql_s = "select stu_id,password from student" self.sql_t = "select t_id,password from teacher" cursor.execute(self.sql_s) self.result_s = cursor.fetchall() cursor.execute(self.sql_t) self.result_t = cursor.fetchall() self.result = self.result_s + self.result_t if (int(self.ui.Login_username.text()), self.ui.Login_password.text()) in self.result: username = self.ui.Login_username.text() if (int(self.ui.Login_username.text()), self.ui.Login_password.text()) in self.result_t: is_t = 1 else: is_s = 1 self.ui.close() else: QMessageBox.warning(self.ui, '登录失败', '账号或密码输入错误,请重新输入')
class LoadModelWin(): # 加载模型的窗口 def __init__(self): super().__init__() self.ui = QUiLoader().load('ui/load_model_win.ui') self.ui.browse_btn.clicked.connect(self.get_model_path) self.ui.ok_btn.clicked.connect(self.ok) self.ui.cancel_btn.clicked.connect(self.cancel) def get_model_path(self): FileDialog = QFileDialog(self.ui.browse_btn) # 实例化 FileDialog.setFileMode(QFileDialog.AnyFile) # 可以打开任何文件 model_file, _ = FileDialog.getOpenFileName(self.ui.browse_btn, 'open file', 'model/', 'model files (*.pth *.pt)') # 改变Text里面的文字 self.ui.model_path_text.setPlainText(model_file) def ok(self): self.ui.close() model_path = self.ui.model_path_text.toPlainText() model_path_ms.ms.emit(model_path) def cancel(self): self.ui.close() QMessageBox.warning(self.ui.cancel_btn, "警告", "加载模型失败!", QMessageBox.Yes)
class Student_Choose(): def __init__(self): self.ui = QUiLoader().load('student_choose_class.ui') self.ui.exit.clicked.connect(self.close_window) self.ui.add.clicked.connect(self.add) def close_window(self): self.ui.close() def add(self): self.courseID = self.ui.courseID.text() print("adding "+self.courseID)
class NewUser(object): """ 新建受试者信息并存入数据库 """ def __init__(self): # 链接数据库 self.conn = connect(host='localhost', port=3306, user='******', password='******', database='motor_ability_analysis', charset='utf8') # 获得cursor对象 self.cursor = self.conn.cursor() print("database motor_ability_analysis connected") # 调用ui文件 self.ui = QUiLoader().load( 'ui_design/new_user.ui') # 路径用/,以免被认成转义,与系统用法不冲突 # 槽函数,点击按钮调用对应函数 self.ui.save_btn.clicked.connect(self.save) self.ui.cancel_btn.clicked.connect(self.cancel) # def __del__(self): # self.cursor.close() # self.conn.close() # print("database motor_ability_analysis disconnected") def cancel(self): self.ui.close() def save(self): # 获取QLineEDit文本框内容 info = (self.ui.le_name.text(), self.ui.cb_gender.currentText(), self.ui.le_year_of_birth.text(), self.ui.cb_handedness.currentText(), self.ui.le_height.text(), self.ui.le_weight.text(), self.ui.le_waistline.text(), self.ui.le_upperarm.text(), self.ui.le_forearm.text(), self.ui.le_thigh.text(), self.ui.le_shank.text()) print(info) if len(info[2]) != 4: print(QMessageBox.about(self.ui, 'Warning', '生日仅能为4位年份')) else: for item in info: if not item: print(QMessageBox.about(self.ui, 'Warning', '必要信息缺失')) break # 保存至数据库 sql = """INSERT INTO t_user (name, gender, year_of_birth, handedness, height, weight, waistline, upperarm, forearm, thigh, shank) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)""" self.cursor.execute(sql, info) self.conn.commit() self.ui.close()
class Teacher_Login(): def __init__(self): self.ui = QUiLoader().load('teacher.ui') self.ui.exit.clicked.connect(self.close_window) self.ui.modify.clicked.connect(self.modify_score) def close_window(self): self.ui.close() def modify_score(self): self.modify_window = teacher_modify.Teacher_Modify() self.modify_window.ui.show()
class Student_Login(): def __init__(self): self.ui = QUiLoader().load('student.ui') self.ui.exit.clicked.connect(self.close_window) self.ui.choose.clicked.connect(self.choose_class) def close_window(self): self.ui.close() def choose_class(self): self.choose_window = student_choose_class.Student_Choose() self.choose_window.ui.show()
class Teacher_Modify(): def __init__(self): self.ui = QUiLoader().load('teacher_modify_score.ui') self.ui.ok.clicked.connect(self.close_window) def close_window(self): self.studentID = self.ui.studentID_line.text() self.courseID = self.ui.courseID_line.text() self.score = self.ui.score_line.text() print(self.studentID) print(self.courseID) print(self.score) self.ui.close()
class DividedWin(): # def __init__(self): super().__init__() self.ui = QUiLoader().load('ui/divided_win.ui') self.ui.ok_btn.clicked.connect(self.ok) self.ui.cancel_btn.clicked.connect(self.cancel) def ok(self): self.ui.close() def cancel(self): self.ui.close() QMessageBox.warning(self.ui.cancel_btn, "警告", "分割结果地址未得到!", QMessageBox.Yes)
class Signin: def __init__(self): self.__serial_number = wmi.WMI().Win32_Processor( )[0].ProcessorId.strip() self.ascii() self.vertify() def ascii(self): self.ascii_serial_number = [str(ord(i)) for i in self.__serial_number] for i in range(5, len(self.ascii_serial_number), 5): self.ascii_serial_number.insert(i, '-') self.ascii_serial_number = ''.join(self.ascii_serial_number) def vertify(self): with open('reg.dll', 'r') as f: self.str = f.read() if self.__serial_number == base64.b64decode(self.str).decode(): self.login = Login() else: self.signin_ui() def signin_ui(self): self.ui = QUiLoader().load('UIs/Signin.ui') self.ui.label_2.setText(self.ascii_serial_number) self.ui.label_2.setTextInteractionFlags(self.ui.label_2.textInteractionFlags() \ | Qt.TextSelectableByMouse) self.ui.button_1.clicked.connect(self.savecode) self.ui.button_2.clicked.connect(app.quit) self.ui.show() def savecode(self): self.code = self.ui.lineEdit.text() try: self.decode = base64.b64decode(self.code).decode() except Exception: self.decode = '' if self.__serial_number == self.decode: with open('reg.dll', 'w') as f: f.write(self.code) QMessageBox.about(self.ui, 'Message', '\nSIGN UP SUCCEEDED, WELLCOME!') self.ui.close() self.login = Login() else: QMessageBox.about(self.ui, 'Message', '\nInvalid Code!')
class MessageBox: def __init__(self, message, title): self.ui = QUiLoader().load('src/client_ui/messageBox.ui') self.ui.message.setText(message) self.ui.setWindowTitle(title) self.ui.setWindowModality(Qt.ApplicationModal) self.ui.confirm.clicked.connect(self.handleConfirm) def handleConfirm(self): self.ui.close() pass def launch(self): self.ui.show() self.ui.exec_()
class StartDivideWin(): # 开始分割的窗口 def __init__(self, path): super().__init__() self.model_path = path self.ui = QUiLoader().load('ui/start_divide_win.ui') self.ui.browse_btn_1.clicked.connect(self.get_data_path) self.ui.browse_btn_2.clicked.connect(self.get_result_path) self.ui.ok_btn.clicked.connect(self.ok) self.ui.cancel_btn.clicked.connect(self.cancel) def get_data_path(self): FileDialog = QFileDialog(self.ui.browse_btn_1) FileDialog.setFileMode(QFileDialog.AnyFile) type = self.ui.type_combo.currentText() data_file = '' if type=='image': data_file = QFileDialog.getExistingDirectory(self.ui.browse_btn_1, "选择图片文件夹", "./") elif type=='video': data_file = FileDialog.getOpenFileName(self.ui.browse_btn_1, '打开视频文件', './','video files (*.avi *.mp4)') elif type=='nii': data_file = FileDialog.getOpenFileName(self.ui.browse_btn_1, 'nii文件', './', 'video files (*.avi *.mp4)') self.ui.data_path_text.setPlainText(data_file) def get_result_path(self): FileDialog = QFileDialog(self.ui.browse_btn_2) FileDialog.setFileMode(QFileDialog.AnyFile) result_file = QFileDialog.getExistingDirectory(self.ui.browse_btn_2, "选择保存结果文件夹", "./") self.ui.result_path_text.setPlainText(result_file) def ok(self): seg = "binary" type = self.ui.type_combo.currentText() self.ui.close() data_path = self.ui.data_path_text.toPlainText() data_path_ms.ms.emit(data_path) result_path = self.ui.result_path_text.toPlainText()##保存的路径 不包含文件名 aviname= time.strftime('%Y%m%d%H%M%S',time.localtime(time.time())) result_path_ms.ms.emit(result_path+'/'+aviname+'.avi')##传送给主窗口展示的是包含文件名的 self.ok_win = DividedWin() self.ok_win.ui.show() seg_image.main("binary", type, data_path, result_path, aviname) def cancel(self): self.ui.close() QMessageBox.warning(self.ui.cancel_btn, "警告", "未能成功开始分割!", QMessageBox.Yes)
class Admin_Login(): def __init__(self): self.ui = QUiLoader().load('admin.ui') self.ui.modify.clicked.connect(self.modify) self.ui.add.clicked.connect(self.add) self.ui.remove.clicked.connect(self.remove) self.ui.exit.clicked.connect(self.close_window) self.ui.query_choose_score.clicked.connect(self.query_choose_score) self.ui.avg_score.clicked.connect(self.avg_score) self.ui.query_student.clicked.connect(self.query_student) self.ui.query_teacher.clicked.connect(self.query_teacher) self.ui.query_course.clicked.connect(self.query_course) def modify(self): self.modify_window = admin_modify.Admin_Modify() self.modify_window.ui.show() def add(self): self.add_window = admin_add.Admin_Add() self.add_window.ui.show() def remove(self): self.delete_window = admin_delete.Admin_Delete() self.delete_window.ui.show() def close_window(self): self.ui.close() def query_choose_score(self): self.query_choose_score_window = admin_query_choose_score.Admin_Choose_Score( ) self.query_choose_score_window.ui.show() def avg_score(self): self.score_data_window = admin_score_data.Admin_Score_Data() self.score_data_window.ui.show() def query_student(self): pass def query_teacher(self): pass def query_course(self): pass
class MainWindow(QMainWindow): def __init__(self): super(MainWindow, self).__init__() # Caminho até o arquivo de interface. # path = QDir(__file__).currentPath() # ui_file = QDir(path).filePath('MainWindow.ui') ui_file = QDir(QDir(__file__).currentPath()).filePath('MainWindow.ui') self.ui = QUiLoader().load(ui_file, None) # Acessando o menu e conectando os métodos. action_sair_1 = self.ui.findChild(QObject, 'action_sair_1') action_sair_1.triggered.connect(self.close_app) action_sair_2 = self.ui.findChild(QObject, 'action_sair_2') action_sair_2.triggered.connect(self.close_app) action_sobre = self.ui.findChild(QObject, 'action_sobre') action_sobre.triggered.connect(self.about) self.ui.show() def close_app(self): self.ui.close() def about(self): icon = QIcon() icon.addPixmap(QPixmap('../../../images/icons/icon.png')) message_box = QMessageBox(parent=self) message_box.setWindowTitle('Título da caixa de texto') message_box.setWindowIcon(icon) message_box.setText( 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do ' 'eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ' 'ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut ' 'aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit ' 'in voluptate velit esse cillum dolore eu fugiat nulla pariatur. ' 'Excepteur sint occaecat cupidatat non proident, sunt in culpa ' 'qui officia deserunt mollit anim id est laborum.') response = message_box.exec() message_box.close()
class DividingWin(): def __init__(self): super().__init__() self.ui = QUiLoader().load('ui/dividing_win.ui') # self.print_run_log # 不太清楚这么写对不对 self.ui.mute_run_btn.clicked.connect(self.mute_run) self.ui.interrupt_btn.clicked.connect(self.interrupt) # def print_run_log(self): # 在ui的run_log中打印分割模型运行时候的时间输出或者别的运行输出 def mute_run(self): # 后台运行函数 self.ui.close() # 这里需要一段代码,通过判断分割模型运行结束,才打开分割完成的提示窗口 self.divided_win = DividedWin() self.divided_win.ui.show() def interrupt(self): self.ui.close() # 这里需要一段代码来中断分割模型 QMessageBox.warning(self.ui.interrupt_btn, "警告", "分割被中断!", QMessageBox.Yes)
class Login(): with open('pds.pkl', 'rb') as f: __data = pickle.load(f) try: __username, __password = __data['PDS Manager'][0], __data[ 'PDS Manager'][1] except Exception: __username, __password = '', '' def __init__(self): self.ui = QUiLoader().load('UIs/login.ui') self.ui.button_1.clicked.connect(self.call_interface) self.ui.button_2.clicked.connect(app.quit) self.ui.show() def call_interface(self): username = self.ui.lineEdit_1.text() password = self.ui.lineEdit_2.text() if username == Login.__username and password == Login.__password: self.ui.close() self.interface = Interface()
class Admin_Modify(): def __init__(self): self.ui = QUiLoader().load('admin_modify.ui') self.ui.exit.clicked.connect(self.close_window) self.ui.ok.clicked.connect(self.make_change) def close_window(self): self.ui.close() def make_change(self): self.column = self.ui.column_input.text() self.ID = self.ui.id_input.text() self.value = self.ui.value_input.text() if self.ui.radio_student.isChecked(): self.modify_student(self.column, self.ID, self.value) elif self.ui.radio_teacher.isChecked(): self.modify_teacher(self.column, self.ID, self.value) elif self.ui.radio_course.isChecked(): self.modify_course(self.column, self.ID, self.value) elif self.ui.radio_choose.isChecked(): self.modify_choose(self.column, self.ID, self.value) def modify_teacher(self, column, ID, value): pass def modify_student(self, column, ID, value): pass def modify_course(self, column, ID, value): pass def modify_choose(self, column, ID, value): pass
class Login_group: #登录界面 def __init__(self): self.ui = QUiLoader().load('ui/login.ui') #设置密码隐藏 self.ui.lineEdit.setEchoMode(QLineEdit.Password) ''' 信号槽 ''' # 确认按键 self.ui.pushButton_4.clicked.connect(self.check_user) # 取消按键 self.ui.pushButton_3.clicked.connect(self.ui.close) def check_user(self): #检查密码是否正确 #获取用户名 name = self.ui.comboBox_6.currentText() #获取密码 password = int(self.ui.lineEdit.text()) #获取真实密码 real_password = Class_info.get_data("select `password` " "from `user` " "where `name`='%s'" % name)[0][0] #比较密码正确与否 if password == real_password: #如果密码正确的话 #关闭当前窗口 self.ui.close() #打开管理员窗口 self.show_admin_ui() else: #如果密码错误 self.ui.label.setText('提示:密码错误') def show_admin_ui(self): #显示登录界面 self.group_window = Group_window() self.group_window.ui.exec_() pass
class Password: def __init__(self): self.ui = QUiLoader().load('recover_password.ui') self.ui.confirmButton.clicked.connect(self.Confirm) def Confirm(self): self.sql_s = "select stu_id,stu_tel from student" self.sql_t = "select t_id,t_tel from teacher" cursor.execute(self.sql_s) self.result_s = cursor.fetchall() cursor.execute(self.sql_t) self.result_t = cursor.fetchall() self.result = self.result_s + self.result_t self.is_t = 0 self.is_s = 0 if (int(self.ui.username.text()), int(self.ui.tel_number.text())) in self.result: if (int(self.ui.username.text()), int(self.ui.tel_number.text())) in self.result_s: self.is_s = 1 else: self.is_t = 1 if self.ui.new_password.text() == self.ui.confirm_password.text(): if self.is_s: self.sql = "update student set password = '******' where stu_id = " + self.ui.username.text() if self.is_t: self.sql = "update teacher set password = '******' where t_id = " + self.ui.username.text() cursor.execute(self.sql) self.ui.close() else: QMessageBox.warning(self.ui, '输入错误', '两次密码输入不一致') else: QMessageBox.warning(self.ui, '查无用户', '请检查您输入的账号和手机号是否正确')
class Login(): def __init__(self): self.log = QUiLoader().load('Login1.ui') self.log.pushButton.clicked.connect(self.open_Main) self.log.pushButton_2.clicked.connect(self.closeW) def open_Main(self): user = self.log.lineEdit.text() passw = self.log.lineEdit_2.text() if user == 'user' and passw == '123': self.mw = News_Analysis() #self.mw.ui.setWindowOpacity(0.9) self.mw.ui.resize(1500, 900) self.mw.ui.setStyleSheet("#Form{border-image:url(2.png)}") self.mw.ui.show() self.closeW() else: Box = QMessageBox() Box.setWindowTitle('提示') Box.setText('请输入正确账号密码') Box.exec_() def closeW(self): self.log.close()
class SNR: def __init__(self): # 从文件中加载UI定义 qfile1 = QFile("ui/cmos_snr.ui") qfile1.open(QFile.ReadOnly) qfile1.close() print("test snr") # 从 UI 定义中动态 创建一个相应的窗口对象 # 注意:里面的控件对象也成为窗口对象的属性了 # 比如 self.ui.button , self.ui.textEdit self.ui = QUiLoader().load(qfile1) # cmos_snr button self.ui.pushButton_cmos_snr_snr.clicked.connect(self.handle_pushButton_cmos_snr_snr_clicked) self.ui.pushButton_cmos_snr_linearity.clicked.connect(self.handle_pushButton_cmos_snr_linearity_clicked) # cmos_snr lineEdit self.ui.lineEdit_cmos_snr_width.setText('1280') self.ui.lineEdit_cmos_snr_width.textChanged.connect(self.handle_lineEdit_cmos_snr_width_change) self.ui.lineEdit_cmos_snr_height.setText('1080') self.ui.lineEdit_cmos_snr_height.textChanged.connect(self.handle_lineEdit_cmos_snr_height_change) self.ui.lineEdit_cmos_snr_w_percent.setText('10') self.ui.lineEdit_cmos_snr_w_percent.textChanged.connect(self.handle_lineEdit_cmos_snr_w_percent_change) self.ui.lineEdit_cmos_snr_h_percent.setText('10') self.ui.lineEdit_cmos_snr_h_percent.textChanged.connect(self.handle_lineEdit_cmos_snr_h_percent_change) # cmos_snr comboBox self.ui.comboBox_cmos_snr_bitshift.currentIndexChanged.connect(self.handle_comboBox_cmos_snr_bitshift_change) self.ui.comboBox_cmos_snr_bitshift.addItems(['-4', '-8', '-2', '0', '2', '4', '8']) self.ui.comboBox_cmos_snr_dataformat.currentIndexChanged.connect(self.handle_comboBox_cmos_snr_dataformat_change) self.ui.comboBox_cmos_snr_dataformat.addItems(['ieee-le', 'ieee-be']) self.ui.comboBox_cmos_snr_cfa.currentIndexChanged.connect(self.handle_comboBox_cmos_snr_cfa_change) self.ui.comboBox_cmos_snr_cfa.addItems(['rggb', 'bggr', 'gbrg', 'grbg', 'gray', 'color']) # cmos_snr button def handle_pushButton_cmos_snr_snr_clicked(self, checked): print("cmos_snr_snr pushButton clicked", self) i = 0 filePath = QFileDialog.getExistingDirectory(self.ui, "选择存储路径") for root, dirs, files in os.walk(filePath): for f in files: i = i + 1 # 统计文件夹内总共有几个文件 print("i=", i) if i == 0: # 没有加载文件夹 return filename = [0] * i # 初始化成员为i个的一个列表 Rvalue = [0] * i RNoise = [0] * i R_SNR = [0] * i GRvalue = [0] * i GRNoise = [0] * i GR_SNR = [0] * i GBvalue = [0] * i GBNoise = [0] * i GB_SNR = [0] * i Bvalue = [0] * i BNoise = [0] * i B_SNR = [0] * i width = int(self.ui.lineEdit_cmos_snr_width.text()) height = int(self.ui.lineEdit_cmos_snr_height.text()) w_percent = int(self.ui.lineEdit_cmos_snr_w_percent.text()) / 100 h_percent = int(self.ui.lineEdit_cmos_snr_h_percent.text()) / 100 pattern = self.ui.comboBox_cmos_snr_cfa.currentText() dataformat = self.ui.comboBox_cmos_snr_dataformat.currentText() shift_bits = int(self.ui.comboBox_cmos_snr_bitshift.currentText()) WidthBorder = round((1 - w_percent) * width / 4) HeightBorder = round((1 - h_percent) * height / 4) # print("WidthBorder:", WidthBorder, HeightBorder, (width / 2 - WidthBorder), (height / 2 - HeightBorder)) i = 0 for root, dirs, files in os.walk(filePath): for f in files: filename[i] = os.path.join(root, f) # 将文件名填写到列表中 iamge = rawimage.read_plained_file(filename[i], "uint16", width, height, dataformat) R, GR, GB, B, G = rawimage.bayer_channel_separation(iamge, pattern) R = R[HeightBorder:int(height / 2 - HeightBorder), WidthBorder:int(width / 2 - WidthBorder)] GR = GR[HeightBorder:int(height / 2 - HeightBorder), WidthBorder:int(width / 2 - WidthBorder)] GB = GB[HeightBorder:int(height / 2 - HeightBorder), WidthBorder:int(width / 2 - WidthBorder)] B = B[HeightBorder:int(height / 2 - HeightBorder), WidthBorder:int(width / 2 - WidthBorder)] # print("shape:", np.shape(R)) Rvalue[i] = np.mean(R) RNoise[i] = np.std(R) R_SNR[i] = Rvalue[i] / RNoise[i] GRvalue[i] = np.mean(GR) GRNoise[i] = np.std(GR) GR_SNR[i] = GRvalue[i] / GRNoise[i] GBvalue[i] = np.mean(GB) GBNoise[i] = np.std(GB) GB_SNR[i] = GBvalue[i] / GBNoise[i] Bvalue[i] = np.mean(B) BNoise[i] = np.std(B) B_SNR[i] = Bvalue[i] / BNoise[i] print(filename[i]) i = i + 1 print("len = ", len(filename)) if i > 1: x = np.arange(0, i) plt.plot(x, R_SNR, "r", label="R") plt.plot(x, GR_SNR, "g", label="GR") plt.plot(x, GB_SNR, "c", label="GB") plt.plot(x, B_SNR, "b", label="B") else: plt.scatter(1, R_SNR[0], color="r", label="R", linewidth=3) plt.scatter(2, GR_SNR[0], color="g", label="GR", linewidth=3) plt.scatter(3, GB_SNR[0], color="c", label="GB", linewidth=3) plt.scatter(4, B_SNR[0], color="b", label="B", linewidth=3) plt.title("SNR") plt.legend(loc="lower right") plt.show() self.ui.close() def handle_pushButton_cmos_snr_linearity_clicked(self, checked): print("cmos_snr_linearity pushButton clicked", self) i = 0 filePath = QFileDialog.getExistingDirectory(self.ui, "选择存储路径") for root, dirs, files in os.walk(filePath): for f in files: i = i + 1 # 统计文件夹内总共有几个文件 print("i=", i) if i < 2: # 少于2个文件,无法测试线性化程度 QMessageBox.warning( self.ui, '文件太少', '文件夹内文件数目必须大于1个') return filename = [0] * i # 初始化成员为i个的一个列表 Rvalue = [0] * i GRvalue = [0] * i GBvalue = [0] * i Bvalue = [0] * i width = int(self.ui.lineEdit_cmos_snr_width.text()) height = int(self.ui.lineEdit_cmos_snr_height.text()) w_percent = int(self.ui.lineEdit_cmos_snr_w_percent.text()) / 100 h_percent = int(self.ui.lineEdit_cmos_snr_h_percent.text()) / 100 pattern = self.ui.comboBox_cmos_snr_cfa.currentText() dataformat = self.ui.comboBox_cmos_snr_dataformat.currentText() shift_bits = int(self.ui.comboBox_cmos_snr_bitshift.currentText()) WidthBorder = round((1 - w_percent) * width / 4) HeightBorder = round((1 - h_percent) * height / 4) # print("WidthBorder:", WidthBorder, HeightBorder, (width / 2 - WidthBorder), (height / 2 - HeightBorder)) i = 0 for root, dirs, files in os.walk(filePath): for f in files: filename[i] = os.path.join(root, f) # 将文件名填写到列表中 iamge = rawimage.read_plained_file(filename[i], "uint16", width, height, dataformat) R, GR, GB, B, G = rawimage.bayer_channel_separation(iamge, pattern) R = R[HeightBorder:int(height / 2 - HeightBorder), WidthBorder:int(width / 2 - WidthBorder)] GR = GR[HeightBorder:int(height / 2 - HeightBorder), WidthBorder:int(width / 2 - WidthBorder)] GB = GB[HeightBorder:int(height / 2 - HeightBorder), WidthBorder:int(width / 2 - WidthBorder)] B = B[HeightBorder:int(height / 2 - HeightBorder), WidthBorder:int(width / 2 - WidthBorder)] # print("shape:", np.shape(R)) Rvalue[i] = np.mean(R) GRvalue[i] = np.mean(GR) GBvalue[i] = np.mean(GB) Bvalue[i] = np.mean(B) print(filename[i]) i = i + 1 print("len = ", len(filename)) x = np.arange(0, i) plt.plot(x, Rvalue, "r", label="R") plt.plot(x, GRvalue, "g", label="GR") plt.plot(x, GBvalue, "c", label="GB") plt.plot(x, Bvalue, "b", label="B") plt.title("Linearity") plt.legend(loc="lower right") plt.show() self.ui.close() # cmos_snr lineEdit def handle_lineEdit_cmos_snr_width_change(self): print("currentText is ", self.ui.lineEdit_cmos_snr_width.text()) def handle_lineEdit_cmos_snr_height_change(self): print("currentText is ", self.ui.lineEdit_cmos_snr_height.text()) def handle_lineEdit_cmos_snr_w_percent_change(self): print("currentText is ", self.ui.lineEdit_cmos_snr_w_percent.text()) def handle_lineEdit_cmos_snr_h_percent_change(self): print("currentText is ", self.ui.lineEdit_cmos_snr_h_percent.text()) # cmos_snr comboBox def handle_comboBox_cmos_snr_bitshift_change(self): print("currentText is ", self.ui.comboBox_cmos_snr_bitshift.currentText()) def handle_comboBox_cmos_snr_dataformat_change(self): print("currentText is ", self.ui.comboBox_cmos_snr_dataformat.currentText()) def handle_comboBox_cmos_snr_cfa_change(self): print("currentText is ", self.ui.comboBox_cmos_snr_cfa.currentText())
class StartUp(QtCore.QObject): friendList = [] chat_ = {} def __init__(self): super().__init__() self.username = '' qfile_ui = QFile("E:\\Py workshop\\grdKeShe\\UI\\login.ui") qfile_ui.open(QFile.ReadOnly) qfile_ui.close() self.ui = QUiLoader().load(qfile_ui) self.ui.setWindowFlags(QtCore.Qt.FramelessWindowHint) self.ui.user.setScaledContents(True) self.ui.pass_pic.setScaledContents(True) self.ui.user.setPixmap(QPixmap('.\\static\\user.png')) self.ui.pass_pic.setPixmap(QPixmap('.\\static\\password.png')) self.ui.login.setStyleSheet('QPushButton {background-color: #1296DB; border: none; color: #FFFFFF}') self.ui.regist.setStyleSheet('QPushButton {color: #8A8A8A}') self.ui.useraccount.setStyleSheet('QLineEdit {background-color: #1296DB; border-width: 1 }') self.ui.show() self.ui.login.clicked.connect(self.userLogin) self.ui.regist.clicked.connect(self.showReg) self.ui.closebu.clicked.connect(self.stop) qfile_main = QFile("E:\\Py workshop\\grdKeShe\\UI\\mainwindow.ui") qfile_main.open(QFile.ReadOnly) qfile_main.close() self.ui_main = QUiLoader().load(qfile_main) self.ui_main.addFriend.clicked.connect(self.addFriend) self.ui_main.profile_photo.setPixmap(QPixmap('.\\static\\default.png')) self.ui_main.profile_photo.setScaledContents(True) self.ui_main.listWidget.itemClicked.connect(self.chat) self.ui_main.send.clicked.connect(self.sendmessage) self.ui_main.setWindowFlags(QtCore.Qt.FramelessWindowHint) self.ui_main.closeB.clicked.connect(self.logout) ui_file = QFile("E:\\Py workshop\\grdKeShe\\UI\\searchNot.ui") ui_file.open(QFile.ReadOnly) ui_file.close() self.ui_notice = QUiLoader().load(ui_file) self.ui_notice.search.clicked.connect(self.search) reg_file = QFile("E:\\Py workshop\\grdKeShe\\UI\\Register.ui") reg_file.open(QFile.ReadOnly) reg_file.close() self.ui_reg = QUiLoader().load(reg_file) self.ui_reg.submit.clicked.connect(self.userReg) self.ui_reg.passconf.editingFinished.connect(self.checkPass) self.ui_reg.passconf_tip.setScaledContents(True) def userLogin(self): username = self.ui.useraccount.text() self.username = username password = self.ui.password.text() msg = slots.UserLogin(username, password) self.ui.notice.setText(msg) sleep(2) self.ui.notice.setText("") if msg == 'ok': ifexist = os.path.exists(str(username)) if not ifexist: os.mkdir(str(username)) msg = slots.ReceiveMessage(self.username) for i in msg: mea = json.loads(i) print(mea) slots.StoreChat(username, mea['sender'], i) self.friendList = slots.GetStatus(self.username) print(self.friendList) for user in self.friendList: self.ui_main.listWidget.addItem(user[0]) self.ui_main.show() self.ui.close() def addFriend(self): self.ui_notice.show() self.ui_notice.exec_() def search(self): target = self.ui_notice.searchBox.text() msg = slots.AddFriend(self.username, target) self.ui_notice.resultNot.setText(msg) sleep(2) self.ui_notice.resultNot.setText("") def showReg(self): self.ui_reg.show() def userReg(self): msg = slots.UserReg(self.ui_reg.username.text(), self.ui_reg.password.text(), self.ui_reg.phone.text()) if msg['code'] == 0: self.ui_reg.notice.setText(msg['msg'] + ',your id is:' + str(msg['id'])) def checkPass(self): if self.ui_reg.password.text() != self.ui_reg.passconf.text(): self.ui_reg.submit.setEnabled(False) self.ui_reg.passconf_tip.setPixmap(QPixmap('E:\\Py workshop\\grdKeShe\\static\\warning.png')) else: self.ui_reg.submit.setEnabled(True) self.ui_reg.passconf_tip.setPixmap(QPixmap('E:\\Py workshop\\grdKeShe\\static\\ok.png')) def chat(self): item = self.ui_main.listWidget.currentItem() self.ui_main.othername.setText(item.text()) self.ui_main.chatview.clear() for i in self.friendList: if self.ui_main.othername.text() == i[0]: receive = i[1] msg = slots.loadChat(self.username, receive) for i in msg: j = json.loads(i) self.ui_main.chatview.addItem(item.text()+":"+j['message']+'['+j['time']+']') def sendmessage(self): receive = '' addr = '' message = self.ui_main.sendbox.toPlainText() for i in self.friendList: if self.ui_main.othername.text() == i[0]: receive = i[1] addr = i[2] code, me = slots.SendMessage(self.username, receive, addr, message) if code == 0: self.ui_main.chatview.addItem( '我:' + message + '[' + time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) + ']') slots.StoreChat(self.username, receive, me) self.ui_main.sendbox.clear() else: self.ui_main.chatview.addItem('发送失败' + me) def logout(self): slots.Logout(self.username) exit() def stop(self): exit()
class dengluUI(QWidget): def __init__(self, parent=None): #加载方法一 # # 从文件中加载UI定义 # # 从 UI 定义中动态 创建一个相应的窗口对象 # # 注意:里面的控件对象也成为窗口对象的属性了 # # 比如 self.ui.button , self.ui.textEdit #self.ui = QUiLoader().load("登陆.ui") # 加载方法二 ui_denglu.open(QFile.ReadOnly) self.ui = QUiLoader().load(ui_denglu) # 加载方法三 # super().__init__(parent) # 调用父类构造函数,创建窗体 # self.ui = Ui_Form() # 创建UI对象 # self.ui.setupUi(self) # 构造UI界面 # 美化界面,删除原生边框,设置窗口透明度 # self.ui.setFixedSize(self.ui.width(), self.ui.height()) # 禁止拉伸窗口大小 # self.ui.setWindowFlags(Qt.WindowMinimizeButtonHint) # 禁止最大化按钮 # self.ui.setWindowOpacity(0.95) # 设置窗口透明度 # self.ui.setAttribute(Qt.WA_TranslucentBackground) # 设置窗口背景透明 # self.ui.setWindowFlag(Qt.FramelessWindowHint) # 隐藏边框 # # self.setStyleSheet("background-image: url(media/background.png)") # 设置窗口背景图片 # self.ui.tabWidget.setEnabled(QLineEdit.Password) #移动窗口 #提取数据库连接 try: file = open('my.ini', 'r') L = [] while True: d = file.readline() if not d: file.close() # 关闭文件 break cc = d.split('=')[1].strip() L.append(cc) except IOError: QMessageBox.about(self.ui, '提示信息', '打开文件失败') self.ui.fuwuqiID.setText(L[0]) self.ui.fuwuduankou.setText(L[1]) self.ui.fuwuqizhanghao.setText(L[2]) self.ui.fuwuqimima.setText(L[3]) self.ui.shujukuming.setText(L[4]) #功能键 self.ui.denglu_2.clicked.connect(self.denglu_clicked) self.ui.shezhi_2.clicked.connect(self.shezhi_clicked) self.ui.queren.clicked.connect(self.queren_clicked) def connect_db(self): try: # 建立数据库连接 # db = pymysql.connect("localhost","root","080420","mysql",charset="utf8") db = pymysql.connect( host=self.ui.fuwuqiID.text(), # 'localhost', # "192.168.202.1""127.0.0.1" port=int(self.ui.fuwuduankou.text()), # 3306 user=self.ui.fuwuqizhanghao.text(), # 'root' password=self.ui.fuwuqimima.text(), # '080420' db=self.ui.shujukuming.text(), # 'mysql' charset='utf8') # 字体设置 return db except pymysql.err.OperationalError: QMessageBox.about(self.ui, '提示信息', '连接数据库失败') exit() def denglu_clicked(self): zhanghao = self.ui.zhanghao.text() mima = self.ui.mima.text() db = self.connect_db() # 获取游标 cur = db.cursor(pymysql.cursors.DictCursor) # 使用字典类型输出 sql_renyuan = "select * FROM 人员信息 WHERE 工号 = %s" rows = cur.execute(sql_renyuan, zhanghao) # 条数 results = cur.fetchall() # 查询到的字典组数 jieguo = results[rows - 1] # 提取最后一个字典 mm = jieguo['密码'] # 获取字典里的‘密码’对应值 if mm == mima: QMessageBox.about(self.ui,'提示信息','登录成功') cur.close() # 关闭游标 db.close() # 关闭连接 self.main_window = zhujiemianUI() self.ui.close() self.main_window.ui.show() login_succeed = True else: QMessageBox.about(self.ui,'提示信息','用户名或密码错误') return # for (name, address) in results: # print("%s家的地址是%s" % (name, address)) def shezhi_clicked(self): self.ui.tabWidget.setCurrentIndex(1) def queren_clicked(self): self.connect_db() try: file = open('my.ini', 'w') file.write('host = '+self.ui.fuwuqiID.text()) file.write('\n') file.write('port = '+ self.ui.fuwuduankou.text()) file.write('\n') file.write('user = '******'\n') file.write('password = '******'\n') file.write('db = '+self.ui.shujukuming.text()) file.write('\n') file.write('charset = utf8') file.write('\n') file.close() except IOError: print("保存失败") self.ui.tabWidget.setCurrentIndex(0)
class Stats: def __init__(self): # 从文件中加载UI定义 # 从 UI 定义中动态 创建一个相应的窗口对象 # 注意:里面的控件对象也成为窗口对象的属性了 # 比如 self.window.button , self.window.textEdit self.window = QUiLoader().load('httptest.ui') # 设定第1列的宽度为 110像素 self.window.tableWidget.setColumnWidth(0, 110) # 设定第2列的宽度为 170像素 self.window.tableWidget.setColumnWidth(1, 170) # 让 表格控件宽度随着父窗口的缩放自动缩放 self.window.tableWidget.horizontalHeader().setStretchLastSection(True) # 将发送按钮点击事件绑定到函数handsendrequest之上 self.window.requestbutton.clicked.connect(self.handsendrequest) # 将清除按钮点击事件绑定到函数textBrowser之上 self.window.clearbutton.clicked.connect(self.textbrowser) # 将添加消息头按钮点击事件绑定到函数showdialog之上 self.window.addbutton.clicked.connect(self.showdialog) self.window.tableWidget.setSelectionBehavior(QAbstractItemView.SelectRows) # 调用自定义函数一定要加上lambda!是个坑 self.window.delete_2.clicked.connect(lambda: self.deleteheader()) # 创建一个dialog对象,用于添加消息头使用,暂时不需要显示 self.dialog = QUiLoader().load('dialog.ui') self.dialog.addheaderbutton.clicked.connect(lambda: self.addheader()) # 点击按钮之后发送httprequest请求 def handsendrequest(self): headers = {} # 获取消息头所有的数据,拼接成dict类型 for temp_count in range(self.window.tableWidget.rowCount()): headers[self.window.tableWidget.item(temp_count, 0).text()] = self.window.tableWidget.item(temp_count, 1).text() if self.window.comboBox.currentText() == 'GET': data = json.loads(self.window.requestbody.toPlainText()) # 使用多线程,防止主线程卡死的情况出现 thread = Thread(target=self.threadgetsend, args=(self.window.urledit.text(), data, headers)) thread.start() else: data = self.window.requestbody.toPlainText() thread = Thread(target=self.threadpostsend, args=(self.window.urledit.text(), data, headers)) thread.start() # get方式参数名是params def threadgetsend(self, url, data, headers): res = requests.get(url, params=data, headers=headers) # 输出相关打印 self.window.textBrowser.append('-----------------------发送GET请求----------------------') self.window.textBrowser.append('HTTP请求的返回状态:' + str(res.status_code)) self.window.textBrowser.append('HTTP响应内容的Headers:' + str(res.headers)) self.window.textBrowser.append('HTTP响应内容的字符串形式:' + str(res.text)) self.window.textBrowser.append('HTTP响应正文的编码:' + str(res.encoding)) # Post方式参数名为data def threadpostsend(self, url, data, headers): res = requests.post(url, data=data, headers=headers) self.window.textBrowser.append('-----------------------发送POST请求----------------------') self.window.textBrowser.append('HTTP请求的返回状态:' + str(res.status_code)) self.window.textBrowser.append('HTTP响应内容的Headers:' + str(res.headers)) self.window.textBrowser.append('HTTP响应内容的字符串形式:' + str(res.text)) self.window.textBrowser.append('HTTP响应正文的编码:' + str(res.encoding)) def textbrowser(self): # 清除textBrowser内的所有内容 self.window.textBrowser.clear() def showdialog(self): # 显示dialog,并初始化两个输入框 self.dialog.show() self.dialog.lineEdit.clear() self.dialog.lineEdit_2.clear() def addheader(self): # 创建新的一行之后 将之前dialog界面输入的两个值插入其中 self.window.tableWidget.insertRow(0) self.window.tableWidget.setItem(0, 0, QTableWidgetItem(self.dialog.lineEdit.text())) self.window.tableWidget.setItem(0, 1, QTableWidgetItem(self.dialog.lineEdit_2.text())) self.dialog.close() def deleteheader(self): # 选中之后,执行删除对应行的操作 if self.window.tableWidget.currentRow() != -1: self.window.tableWidget.removeRow(self.window.tableWidget.currentRow())
class ADBHelper(object): # 构造函数 def __init__(self): # 加载UI文件 self.ui = QUiLoader().load('adbwindow.ui') # 设置窗口背景 palette = QPalette() pix = QPixmap('bg.jpg') #pix = pix.scaled(self.ui.width(), self.ui.height()) palette.setBrush(self.ui.backgroundRole(), QBrush(pix)) self.ui.setAutoFillBackground(True) self.ui.setPalette(palette) self.ui.setWindowIcon(QIcon('adb.png')) # self.ui.setWindowFlags(qcore.Qt.WindowStaysOnTopHint) # 绑定保存参数菜单项点击事件 self.ui.save_action.triggered.connect(self.save_params) # 绑定加载参数菜单项点击事件 self.ui.load_action.triggered.connect(self.load_params) # 绑定退出菜单项点击事件 self.ui.exit_action.triggered.connect(self.exit) # 绑定断开连接菜单项点击事件 self.ui.disconnect_action.triggered.connect(self.disconnect) # 绑定清空输出信息菜单项点击事件 self.ui.clear_action.triggered.connect(self.clear) # 绑定坐标工具菜单项点击事件 self.ui.tool_action.triggered.connect(self.tool) # 绑定关于菜单项点击事件 self.ui.about_action.triggered.connect(self.about) # 绑定启动ADB按钮点击事件 self.ui.openadb_pushButton.clicked.connect(self.open_adb) # 绑定连接按钮点击事件 self.ui.connect_pushButton.clicked.connect(self.connect) # 绑定显示设备列表按钮点击事件 self.ui.show_devices_pushButton.clicked.connect(self.show_devices) # 绑定开始点击按钮点击事件 self.ui.tap_pushButton.clicked.connect(self.tap) # 绑定开始滑屏按钮点击事件 self.ui.swipe_pushButton.clicked.connect(self.swipe) # 绑定停止按钮点击事件 self.ui.stop_pushButton.clicked.connect(self.stop) # 绑定坐标工具按钮点击事件 self.ui.tool_pushButton.clicked.connect(self.tool) # 限制数值范围 self.ui.swipe_x1_min_spinBox.valueChanged.connect(self.x1_min) self.ui.swipe_x1_max_spinBox.valueChanged.connect(self.x1_max) self.ui.swipe_y1_min_spinBox.valueChanged.connect(self.y1_min) self.ui.swipe_y1_max_spinBox.valueChanged.connect(self.y1_max) self.ui.swipe_x2_min_spinBox.valueChanged.connect(self.x2_min) self.ui.swipe_x2_max_spinBox.valueChanged.connect(self.x2_max) self.ui.swipe_y2_min_spinBox.valueChanged.connect(self.y2_min) self.ui.swipe_y2_max_spinBox.valueChanged.connect(self.y2_max) # ADB工具 self.adbtool = None # 连接标志 self.connected = False # 坐标工具窗口 self.tool_dialog = None # 截图文件 self.screen_cap_file = None # 当前时间 def nowtime(self): return str( _time.strftime('%Y-%m-%d %H:%M:%S', _time.localtime(_time.time()))) # 输出信息 def output_message(self, message): mess = "<font color='orange'>[</font><font color='blue'>"+self.nowtime() + \ "</font><font color='orange'>]</font><font color='green'>"+message+"</font>" self.ui.output_textEdit.append(mess) # 移动光标到最底 self.ui.output_textEdit.moveCursor(QTextCursor.End) # 输出结果和错误信息 def output_result_error(self, result, error): # 输出信息 self.output_message(result) # 判断错误信息是否为空 if len(error.strip()) != 0: self.output_message(error) # 保存参数 def save_params(self): # 弹出文件选择器 filepath, filetype = QFileDialog.getSaveFileName( self.ui, "保存参数", os.getcwd(), "Json File (*.json)") # 判断 if filepath != "": # IP地址 ip = self.ui.ip_lineEdit.text() # 端口号 port = self.ui.port_spinBox.value() # 模拟点击 tap_x = self.ui.tap_x_spinBox.value() tap_y = self.ui.tap_y_spinBox.value() tap_times = self.ui.tap_times_spinBox.value() tap_interval = round(self.ui.tap_interval_doubleSpinBox.value(), 1) tap_random_interval = self.ui.tap_random_interval_checkBox.isChecked( ) # 模拟滑屏 swipe_x1_min = self.ui.swipe_x1_min_spinBox.value() swipe_x1_max = self.ui.swipe_x1_max_spinBox.value() swipe_y1_min = self.ui.swipe_y1_min_spinBox.value() swipe_y1_max = self.ui.swipe_y1_max_spinBox.value() swipe_x2_min = self.ui.swipe_x2_min_spinBox.value() swipe_x2_max = self.ui.swipe_x2_max_spinBox.value() swipe_y2_min = self.ui.swipe_y2_min_spinBox.value() swipe_y2_max = self.ui.swipe_y2_max_spinBox.value() swipe_times = self.ui.swipe_times_spinBox.value() # 浮点数取整 swipe_interval = round( self.ui.swipe_interval_doubleSpinBox.value(), 1) swipe_random_interval = self.ui.swipe_random_interval_checkBox.isChecked( ) swipe_60 = self.ui.swipe_60_checkBox.isChecked() # 组成字典 params = { 'ip': ip, 'port': port, 'tap_x': tap_x, 'tap_y': tap_y, 'tap_times': tap_times, 'tap_interval': tap_interval, 'tap_random_interval': tap_random_interval, 'swipe_x1_min': swipe_x1_min, 'swipe_x1_max': swipe_x1_max, 'swipe_y1_min': swipe_y1_min, 'swipe_y1_max': swipe_y1_max, 'swipe_x2_min': swipe_x2_min, 'swipe_x2_max': swipe_x2_max, 'swipe_y2_min': swipe_y2_min, 'swipe_y2_max': swipe_y2_max, 'swipe_times': swipe_times, 'swipe_interval': swipe_interval, 'swipe_random_interval': swipe_random_interval, 'swipe_60': swipe_60 } # 写入文件 if not filepath.endswith('.json'): filepath = filepath + '.json' with open(filepath, 'w', encoding='utf-8') as f: json.dump(params, f) # 输出信息 self.output_message('保存参数完成!文件路径:' + os.path.abspath(filepath)) # 加载参数 def load_params(self): # 弹出文件选择器 filepath, filetype = QFileDialog.getOpenFileName( self.ui, "请选择文件", os.getcwd(), "Json File (*.json)") # 判断 if filepath != "": # 读取文件 with open(filepath, 'r', encoding='utf-8') as f: params = json.load(f) # IP和端口 self.ui.ip_lineEdit.setText(params['ip']) self.ui.port_spinBox.setValue(params['port']) # 模拟点击 self.ui.tap_x_spinBox.setValue(params['tap_x']) self.ui.tap_y_spinBox.setValue(params['tap_y']) self.ui.tap_times_spinBox.setValue(params['tap_times']) self.ui.tap_interval_doubleSpinBox.setValue( params['tap_interval']) self.ui.tap_random_interval_checkBox.setChecked( params['tap_random_interval']) # 模拟滑屏 self.ui.swipe_x1_max_spinBox.setValue(params['swipe_x1_max']) self.ui.swipe_x1_min_spinBox.setValue(params['swipe_x1_min']) self.ui.swipe_y1_max_spinBox.setValue(params['swipe_y1_max']) self.ui.swipe_y1_min_spinBox.setValue(params['swipe_y1_min']) self.ui.swipe_x2_max_spinBox.setValue(params['swipe_x2_max']) self.ui.swipe_x2_min_spinBox.setValue(params['swipe_x2_min']) self.ui.swipe_y2_max_spinBox.setValue(params['swipe_y2_max']) self.ui.swipe_y2_min_spinBox.setValue(params['swipe_y2_min']) self.ui.swipe_times_spinBox.setValue(params['swipe_times']) self.ui.swipe_interval_doubleSpinBox.setValue( params['swipe_interval']) self.ui.swipe_random_interval_checkBox.setChecked( params['swipe_random_interval']) self.ui.swipe_60_checkBox.setChecked(params['swipe_60']) # 输出信息 self.output_message('加载参数完成!文件路径:' + os.path.abspath(filepath)) # 退出 def exit(self): # 保存日志 # 断开连接 self.disconnect() # 退出 self.ui.close() # 断开连接 def disconnect(self): # 停止 self.stop() # 断开连接 result, error = ADBTool().disconnect() # 输出信息 self.output_result_error(result, error) self.connected = False self.output_message('已经断开连接') # 按钮可点 self.ui.tap_pushButton.setEnabled(True) self.ui.swipe_pushButton.setEnabled(True) # 清空输出信息 def clear(self): self.ui.output_textEdit.setText('') # 关于 def about(self): # 显示弹窗 QMessageBox.about( self.ui, '关于', 'ADB助手\n© Copyright 2020\n作者:ordinary-student\n版本:v1.0.0') # 打开ADB def open_adb(self): # 获取IP地址 ip = self.ui.ip_lineEdit.text() # IP校验 if len(ip.strip()) == 0: self.ui.ip_lineEdit.setText('') # 显示弹窗 QMessageBox.information(self.ui, '提示', '请填写IP地址!') return # 获取端口号 port = self.ui.port_spinBox.value() # 创建ADB工具 adbtool = ADBTool(ip, port) # 启动ADB result, error = adbtool.open() # 输出信息 self.output_result_error(result, error) # 判断是否已经启动 if ('restarting' in result) and ('error' not in error): self.adbtool = adbtool self.output_message('ADB已经启动') # 连接设备 def connect(self): # 判断 if self.adbtool == None: # 显示弹窗 QMessageBox.information(self.ui, '提示', 'ADB尚未启动!') return # 连接 try: result, error = self.adbtool.connect() # 输出信息 self.output_result_error(result, error) # 判断是否已经启动 if ('connected' in result) and ('error' not in error): self.connected = True self.output_message('已经连接设备') self.adbtool.tap(700, 1860) except: self.output_message('设备连接失败') # 显示弹窗 QMessageBox.information( self.ui, '提示', '设备连接失败!\n请检查设备和电脑是否处于同一局域网,\n检查设备的USB调试模式是否已经打开。\n若还是不行,请重启软件再尝试。' ) return # 显示设备列表 def show_devices(self): # 显示设备列表 result, error = ADBTool().show_devices() # 输出信息 self.output_result_error(result, error) # 开始点击 def tap(self): # 判断ADB是否启动 if self.adbtool == None: # 显示弹窗 QMessageBox.information(self.ui, '提示', 'ADB尚未启动!') return # 判断是否连接 if self.connected: tap_thread = Thread(target=self.tap2) tap_thread.start() else: # 显示弹窗 QMessageBox.information(self.ui, '提示', '尚未连接设备!') return # 开始点击 def tap2(self): # 按钮不可点 self.ui.tap_pushButton.setEnabled(False) # 获取参数 tap_x = self.ui.tap_x_spinBox.value() tap_y = self.ui.tap_y_spinBox.value() tap_times = self.ui.tap_times_spinBox.value() tap_interval = round(self.ui.tap_interval_doubleSpinBox.value(), 1) tap_random_interval = self.ui.tap_random_interval_checkBox.isChecked() if tap_random_interval: message = '点击坐标({},{})处,{}次,时间间隔随机'.format(tap_x, tap_y, tap_times) else: message = '点击坐标({},{})处,{}次,时间间隔{}秒'.format( tap_x, tap_y, tap_times, tap_interval) self.output_message(message) # 模拟点击 if self.adbtool.continuous_tap(tap_x, tap_y, tap_times, tap_interval, tap_random_interval): self.output_message('模拟点击已完成') else: self.output_message('模拟点击已停止') # 按钮可点 self.ui.tap_pushButton.setEnabled(True) # 开始滑屏 def swipe(self): # 判断ADB是否启动 if self.adbtool == None: # 显示弹窗 QMessageBox.information(self.ui, '提示', 'ADB尚未启动!') return # 判断是否连接 if self.connected: swipe_thread = Thread(target=self.swipe2) swipe_thread.start() else: # 显示弹窗 QMessageBox.information(self.ui, '提示', '尚未连接设备!') return # 开始滑屏 def swipe2(self): # 按钮不可点 self.ui.swipe_pushButton.setEnabled(False) # 获取参数 swipe_x1_min = self.ui.swipe_x1_min_spinBox.value() swipe_x1_max = self.ui.swipe_x1_max_spinBox.value() swipe_y1_min = self.ui.swipe_y1_min_spinBox.value() swipe_y1_max = self.ui.swipe_y1_max_spinBox.value() swipe_x2_min = self.ui.swipe_x2_min_spinBox.value() swipe_x2_max = self.ui.swipe_x2_max_spinBox.value() swipe_y2_min = self.ui.swipe_y2_min_spinBox.value() swipe_y2_max = self.ui.swipe_y2_max_spinBox.value() swipe_times = self.ui.swipe_times_spinBox.value() swipe_interval = round(self.ui.swipe_interval_doubleSpinBox.value(), 1) swipe_random_interval = self.ui.swipe_random_interval_checkBox.isChecked( ) swipe_60 = self.ui.swipe_60_checkBox.isChecked() # 定时60秒 if swipe_60: message = '从坐标({}~{},{}~{})滑到({}~{},{}~{})处,连续滑屏60秒,时间间隔{}秒'.format( swipe_x1_min, swipe_x1_max, swipe_y1_min, swipe_y1_max, swipe_x2_min, swipe_x2_max, swipe_y2_min, swipe_y2_max, swipe_interval) self.output_message(message) # 模拟连续滑屏60秒 if self.adbtool.timing_swipe( (swipe_x1_min, swipe_x1_max), (swipe_y1_min, swipe_y1_max), (swipe_x2_min, swipe_x2_max), (swipe_y2_min, swipe_y2_max), swipe_interval, swipe_random_interval): self.output_message('模拟滑屏已完成') else: self.output_message('模拟滑屏已停止') else: if swipe_random_interval: message = '从坐标({}~{},{}~{})滑到({}~{},{}~{})处,{}次,时间间隔随机'.format( swipe_x1_min, swipe_x1_max, swipe_y1_min, swipe_y1_max, swipe_x2_min, swipe_x2_max, swipe_y2_min, swipe_y2_max, swipe_times) else: message = '从坐标({}~{},{}~{})滑到({}~{},{}~{})处,{}次,时间间隔{}秒'.format( swipe_x1_min, swipe_x1_max, swipe_y1_min, swipe_y1_max, swipe_x2_min, swipe_x2_max, swipe_y2_min, swipe_y2_max, swipe_times, swipe_interval) self.output_message(message) # 模拟滑屏 if self.adbtool.random_swipe( (swipe_x1_min, swipe_x1_max), (swipe_y1_min, swipe_y1_max), (swipe_x2_min, swipe_x2_max), (swipe_y2_min, swipe_y2_max), swipe_times, swipe_interval, swipe_random_interval): self.output_message('模拟滑屏已完成') else: self.output_message('模拟滑屏已停止') # 按钮可点 self.ui.swipe_pushButton.setEnabled(True) # 停止 def stop(self): if self.adbtool != None: self.adbtool.stop() # 按钮可点 self.ui.tap_pushButton.setEnabled(True) self.ui.swipe_pushButton.setEnabled(True) # 截图 def screen_cap(self): if self.adbtool != None: # 截图 photo_path = self.adbtool.screen_cap() # 获取图片到本地 result, error = self.adbtool.pull_file(photo_path) self.output_result_error(result, error) # 判断 if ('png' in result) and ('error' not in error): path = photo_path[(photo_path.rindex('/') + 1):] self.output_message('截图成功!图片路径:' + os.path.abspath(path)) return os.path.abspath(path) else: self.output_message('截图失败!') return None else: return None # 坐标工具 def tool(self): # 判断ADB是否启动 if self.adbtool == None: # 显示弹窗 QMessageBox.information(self.ui, '提示', 'ADB尚未启动!') return # 判断是否连接 if self.connected: self.axis_tool() else: # 显示弹窗 QMessageBox.information(self.ui, '提示', '尚未连接设备!') return # 坐标工具 def axis_tool(self): w = 300 h = 600 # 判断 if self.tool_dialog == None: # 创建坐标工具窗 self.tool_dialog = QDialog(self.ui) self.tool_dialog.setWindowTitle('坐标工具') self.tool_dialog.resize(w, h) # 截图 photo_path = self.screen_cap() if photo_path != None: if self.screen_cap_file != None: os.remove(self.screen_cap_file) self.screen_cap_file = photo_path pix = QPixmap(photo_path) w = pix.width() h = pix.height() # 设置面板大小 self.tool_dialog.setFixedSize(w / 4, h / 4) # 调色板 palette = QPalette() # 缩小图片 pix = pix.scaled(w / 4, h / 4) palette.setBrush(self.tool_dialog.backgroundRole(), QBrush(pix)) self.tool_dialog.setAutoFillBackground(True) self.tool_dialog.setPalette(palette) self.tool_dialog.setMouseTracking(True) # 绑定鼠标移动事件 self.tool_dialog.mouseMoveEvent = self.mouse_move # 显示窗口 self.tool_dialog.show() # 十字光标 self.tool_dialog.setCursor(Qt.CrossCursor) # 鼠标移动 def mouse_move(self, event): x = event.pos().x() y = event.pos().y() #print(x, y) self.tool_dialog.setWindowTitle('X:{},Y:{}'.format(x * 4, y * 4)) # 限制数值范围 def x1_min(self): if self.ui.swipe_x1_min_spinBox.value( ) >= self.ui.swipe_x1_max_spinBox.value(): self.ui.swipe_x1_min_spinBox.setValue( self.ui.swipe_x1_max_spinBox.value()) # def x1_max(self): if self.ui.swipe_x1_max_spinBox.value( ) <= self.ui.swipe_x1_min_spinBox.value(): self.ui.swipe_x1_max_spinBox.setValue( self.ui.swipe_x1_min_spinBox.value()) # def y1_min(self): if self.ui.swipe_y1_min_spinBox.value( ) >= self.ui.swipe_y1_max_spinBox.value(): self.ui.swipe_y1_min_spinBox.setValue( self.ui.swipe_y1_max_spinBox.value()) # def y1_max(self): if self.ui.swipe_y1_max_spinBox.value( ) <= self.ui.swipe_y1_min_spinBox.value(): self.ui.swipe_y1_max_spinBox.setValue( self.ui.swipe_y1_min_spinBox.value()) # def x2_min(self): if self.ui.swipe_x2_min_spinBox.value( ) >= self.ui.swipe_x2_max_spinBox.value(): self.ui.swipe_x2_min_spinBox.setValue( self.ui.swipe_x2_max_spinBox.value()) # def x2_max(self): if self.ui.swipe_x2_max_spinBox.value( ) <= self.ui.swipe_x2_min_spinBox.value(): self.ui.swipe_x2_max_spinBox.setValue( self.ui.swipe_x2_min_spinBox.value()) # def y2_min(self): if self.ui.swipe_y2_min_spinBox.value( ) >= self.ui.swipe_y2_max_spinBox.value(): self.ui.swipe_y2_min_spinBox.setValue( self.ui.swipe_y2_max_spinBox.value()) # def y2_max(self): if self.ui.swipe_y2_max_spinBox.value( ) <= self.ui.swipe_y2_min_spinBox.value(): self.ui.swipe_y2_max_spinBox.setValue( self.ui.swipe_y2_min_spinBox.value())
class SerPortTools: def __init__(self): super(SerPortTools, self).__init__() self.is_open = False self.ser = serial.Serial() self.ui = QUiLoader().load('../Gui/SerPortSet.ui') #定义属性 self.ser_port_name = '' self.port_bps = '' # 定义选择下拉框 self.port_name_items = [] self.bps_items = [ '600', '1200', '2400', '4800', '9600', '19200', '38400' ] for i in range(1, 20): self.port_name_items.append('COM{}'.format(str(i))) self.ui.comboBox.addItems(self.port_name_items) self.ui.comboBox_2.addItems(self.bps_items) # 定义按钮 self.ui.pushButton.clicked.connect(self.open_ser) self.ui.pushButton_2.clicked.connect(self.close_windows) def __del__(self): if self.ser.is_open: self.close_port() # self.is_open = self.ser.is_open def get_port_name_and_bps(self): self.ser_port_name = self.ui.comboBox.currentText() self.port_bps = self.ui.comboBox_2.currentText() def open_ser(self): self.get_port_name_and_bps() self.ser.baudrate = int(self.port_bps) self.ser.port = self.ser_port_name try: self.ser.open() self.is_open = self.ser.is_open QMessageBox.information(self.ui, '提示', '串口打开成功!') except Exception as e: QMessageBox.information(self.ui, '提示', '串口打开失败,请检查!原因{}'.format(e)) return @staticmethod def list_ports(): plist = serial.tools.list_ports.comports() return plist def send_mess(self, info): #hex_info = binascii.b2a_hex(info) self.ser.write(info) def recieve_mess(self): res = self.ser.read() return res def close_windows(self): self.ui.close() def close_port(self): self.ser.close() self.is_open = self.ser.is_open
class StartDivideWin(): # 开始分割的窗口 def __init__(self, path): super().__init__() self.model_path = path self.ui = QUiLoader().load('ui/start_divide_win.ui') self.ui.browse_btn_1.clicked.connect(self.get_data_path) self.ui.browse_btn_2.clicked.connect(self.get_result_path) self.ui.ok_btn.clicked.connect(self.ok) self.ui.cancel_btn.clicked.connect(self.cancel) def get_data_path(self): FileDialog = QFileDialog(self.ui.browse_btn_1) FileDialog.setFileMode(QFileDialog.AnyFile) type = self.ui.type_combo.currentText() data_file = '' if type == 'image': data_file = QFileDialog.getExistingDirectory( self.ui.browse_btn_1, "选择图片文件夹", "./") elif type == 'video': data_file = FileDialog.getOpenFileName( self.ui.browse_btn_1, '打开视频文件', './', 'video files (*.avi *.mp4)') elif type == 'nii': data_file = FileDialog.getOpenFileName( self.ui.browse_btn_1, 'nii文件', './', 'video files (*.avi *.mp4)') self.ui.data_path_text.setPlainText(data_file) def get_result_path(self): FileDialog = QFileDialog(self.ui.browse_btn_2) FileDialog.setFileMode(QFileDialog.AnyFile) result_file = QFileDialog.getExistingDirectory(self.ui.browse_btn_2, "选择保存结果文件夹", "./") self.ui.result_path_text.setPlainText(result_file) def ok(self): self.ui.close() data_path = self.ui.data_path_text.toPlainText() data_path_ms.ms.emit(data_path) result_path = self.ui.result_path_text.toPlainText() ##保存的路径 不包含文件名 self.aviname = time.strftime('%Y%m%d%H%M%S', time.localtime(time.time())) result_path_ms.ms.emit(result_path + '/' + self.aviname + '.avi') ##传送给主窗口展示的是包含文件名的 print(result_path + '/' + self.aviname + '.avi') # self.ok_win = DividingWin() # self.ok_win.ui.show() self.ok_win = DividedWin() self.ok_win.ui.show() self.start_divide() def start_divide(self): class_color = [[0, 0, 0], [0, 255, 0], [0, 255, 255], [125, 255, 12]] t1 = time.time() # ******** seg = "binary" # 多类别分割,夹子为一类,铰链为一类,柄为一类 if seg == "parts": model = parts_seg(in_channels=3, out_channels=4) # model_path = r"model_2_TDSNet.pt" # 多类别分割模型地址 elif seg == "binary": # 二元分割,背景为一类手术器械为一类 model = binary_seg(in_channels=3, out_channels=2) # model_path = r"model_0_TDSNet.pt" # 二元分割模型地址 else: model = r"" model_path = r"" model_path = self.model_path state = torch.load(str(model_path), map_location='cpu') state = { key.replace('module.', ''): value for key, value in state['model'].items() } model.load_state_dict(state) model.to(device) model.eval() # ********** types = self.ui.type_combo.currentText() path = self.ui.data_path_text.toPlainText() # 要分割的图像或者视频或者nii所在的文件夹地址 path_save = self.ui.result_path_text.toPlainText() # 要保存图像的地址 names = file_name(path) # path目录下所有文件名字 factor = 2**5 # ******** if types == "image": for i, name in enumerate(names): t1 = time.time() path_single = os.path.join(path, name) image = cv2.imdecode(np.fromfile(path_single, dtype=np.uint8), -1) h, w, channel = image.shape h = math.ceil( h / factor ) * factor // 2 # 向上取整,由于模型需要下采样5次图像会变成原来的2的5次方分之一,需要输入图像是2的5次方的倍数 w = math.ceil(w / factor) * factor // 2 # print(h, w) mask = np.zeros(shape=(h, w)) image = cv2.resize(image, (w, h)) image_ori = image # image=illum(image) image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) aug = Compose([ # PadIfNeeded(min_height=h, min_width=w, border_mode=cv2.BORDER_CONSTANT, value=0, p=1.0), # padding到2的5次方的倍数 Normalize(p=1) # 归一化 ]) augmented = aug(image=image, mask=mask) image = augmented['image'] image = img_to_tensor(image).unsqueeze(0).to( device ) # torch.from_numpy(img).unsqueeze(0).unsqueeze(0).float().to(DEVICE) # 图像转为tensor格式 output = model(image) # 预测 seg_mask = (output[0].data.cpu().numpy().argmax( axis=0)).astype(np.uint8) t2 = time.time() print("time:", (t2 - t1)) full_mask = np.zeros((h, w, 3)) for mask_label, sub_color in enumerate(class_color): full_mask[seg_mask == mask_label, 0] = sub_color[2] full_mask[seg_mask == mask_label, 1] = sub_color[1] full_mask[seg_mask == mask_label, 2] = sub_color[0] # print(full_mask.max()) # import matplotlib.pyplot as plt # plt.imshow(full_mask) # plt.show() seg = mask_overlay(image_ori, (full_mask > 0)).astype(np.uint8) # seg = mask_overlay((full_mask > 0)).astype(np.uint8) # cv2.imshow("seg",seg) # cv2.waitKey(0) cv2.imwrite(path_save + "/" + str(i).zfill(4) + ".png", seg) save_video(path_save, path_save, h, w, self.aviname) # 可以播放保存的视频展示分割结果 elif types == "video": # 对视频进行分割 splitFrames(path, path_save) # 调用图像分割的方法分割从视频中保存的图像 elif types == "nii": # 对nii3维医学图像进行分割 import nibabel as nib img = np.array(nib.load(path).get_data()) pass def cancel(self): self.ui.close() QMessageBox.warning(self.ui.cancel_btn, "警告", "未能成功开始分割!", QMessageBox.Yes)