class LoginForm(QtGui.QMainWindow): def __init__(self, parent=None): QtGui.QWidget.__init__(self, parent) self.ui = Ui_Form() self.ui.setupUi(self) if os.path.exists('.fullscreen'): self.showFullScreen() QtCore.QObject.connect(self.ui.txtCode, QtCore.SIGNAL("returnPressed()"), self.check_code) def read_codes(self): try: with open('codes') as f: lines = f.read().splitlines() except: lines = ["error"] return lines def check_code(self): code = self.ui.txtCode.text() validcodes = self.read_codes() if "error" in validcodes: self.ui.lblStatus.setText("An error occured reading codes") elif code in validcodes: self.ui.lblStatus.setText("Code accepted") self.mainform = MainForm() self.mainform.show() self.hide() else: self.ui.lblStatus.setText("Code invalid") self.ui.txtCode.setText("")
class Login(QtGui.QWidget): def __init__(self): super(Login, self).__init__() self.ui = Ui_Form() self.ui.setupUi(self) self.escuchador() self.show() #respuestas al hacer click sobre los botones def escuchador(self): self.ui.user_in.clicked.connect(self.aceptado) self.ui.user_out.clicked.connect(self.cerrar) #mostrar ventana principal def ventana_principal(self): form = carga_Productos.Bd_Productos() form.exec_() #funcion para verificar identidad del usuario def aceptado(self): clave = self.ui.line_pass.text() usuario = self.ui.line_user.text() clave_bd = metodos_login.obt_clave(usuario) usuario_bd = metodos_login.obt_usuario(clave) if clave or usuario: try: for i in clave_bd: c = clave_bd["password"] except: self.error_usuario() for i in usuario_bd: u = usuario_bd["user"] else: self.error_usuario() if clave == c and usuario == u: self.cerrar() self.ventana_principal() else: self.error_usuario() def error_usuario(self): self.ui.m_error = QtGui.QMessageBox() self.ui.m_error.setWindowTitle(" Error ") self.ui.m_error.setText("Error de Usuario y/o Clave") self.ui.m_error.setDefaultButton(QtGui.QMessageBox.Ok) self.ui.m_error.exec_() def cerrar(self): self.close()
def __init__(self, parent=None): QtGui.QWidget.__init__(self, parent) self.ui = Ui_Form() self.ui.setupUi(self) if os.path.exists('.fullscreen'): self.showFullScreen() QtCore.QObject.connect(self.ui.txtCode, QtCore.SIGNAL("returnPressed()"), self.check_code)
def __init__(self): Ui_Form.__init__(self) self.qwidget = QWidget() self.setupUi(self.qwidget) self.qwidget.setWindowTitle("欢迎") self.Button_login.clicked.connect(self.login)
class MyUi(QMainWindow): def __init__(self): super(MyUi, self).__init__() self.ui = Ui_MainWindow() self.ui.setupUi(self) cwd = os.getcwd() cwd = str(cwd) if os.path.isfile(cwd + "/time"): with open("time", "r") as outfile: #reads current time history = cPickle.load(outfile) if (datetime.now() - history ).total_seconds() < 43200: #measures if time elapse>12 hours print("Less than 12 hours. Loading previously saved Pickle...") #with open("time","w") as infile: #update time #cPickle.dump(datetime.now(),infile) # else: print("More than 12 hours. Updating Pickle...") data = ts.get_industry_classified() with open("class", "w+") as outfile: cPickle.dump(data, outfile) now = datetime.now() with open("time", "w+") as outfile: #update time cPickle.dump(now, outfile) else: print("No Pickle found!" ) #If this is first time using tuchart in this directory data = df() data = ts.get_industry_classified() with open('class', 'w+') as outfile: #records pickle cPickle.dump(data, outfile) now = datetime.now() with open("time", "w+") as outfile: cPickle.dump(now, outfile) with open("class", "r") as infile: # reads current time series = cPickle.load(infile) #series = pd.read_json(cwd + "\\class.json") #series = ts.get_industry_classified() series = pd.DataFrame(series) curdate = time.strftime( "%Y/%m/%d") # gets current time to put into dateedit curdateQ = QDate.fromString(curdate, "yyyy/MM/dd") dateobj = datetime.strptime(curdate, "%Y/%m/%d") #converts to datetime object past = dateobj - timedelta(days=7) #minus a week to start date pasttime = datetime.strftime(past, "%Y/%m/%d") pastQ = QDate.fromString( pasttime, "yyyy/MM/dd") #convert to qtime so that widget accepts the values pastL = dateobj - timedelta(days=30) # minus a month to start date pasttimeL = datetime.strftime(pastL, "%Y/%m/%d") pastQL = QDate.fromString(pasttimeL, "yyyy/MM/dd") np_indexes = np.array([['sh', '上证指数', '大盘指数'], ['sz', '深证成指', '大盘指数'], ['hs300', '沪深300指数', '大盘指数'], ['sz50', '上证50', '大盘指数'], ['zxb', '中小板', '大盘指数'], ['cyb', '创业板', '大盘指数']]) indexes = df(data=np_indexes, index=range(5000, 5006), columns=["code", "name", "c_name"]) series = indexes.append(series) list1_bfr = series["c_name"].tolist( ) #Get industry categories. Filters out redundant ones list1 = list(set(list1_bfr)) list1.sort(key=list1_bfr.index) #w = database() #zsparent = QTreeWidgetItem(self.ui.treeWidget) #zsparent.setText(0,"股票指数") #zsnames =["上证指数-sh","深圳成指-sz","沪深300指数-hs300","上证50-"] self.init_treeWidget(list1, series) self.ui.treeWidget.setContextMenuPolicy(Qt.CustomContextMenu) self.ui.treeWidget.customContextMenuRequested.connect(self.openMenu) #self.ui.webView.setGeometry(QtCore.QRect(0, 30,1550, 861)) file_path = os.path.abspath( os.path.join(os.path.dirname(__file__), "render.html")) #path to read html file local_url = QUrl.fromLocalFile(file_path) self.ui.webView.load(local_url) #self.ui.commandLinkButton.setFixedSize(50, 50) self.ui.search_btn.clicked.connect(lambda: self.search_comp(series)) self.ui.log_btn.clicked.connect(lambda: self.log()) self.ui.init_code_btn.clicked.connect( lambda: self.code_sort_tree(series)) self.ui.init_category_btn.clicked.connect( lambda: self.init_treeWidget(list1, series)) self.ui.commandLinkButton.clicked.connect( self.classify) #when the arrow button is clicked, trigger events #self.ui.commandLinkButton.clicked.connect(lambda action: self.classify(action, self.ui.treewidget)) # QSizePolicy try: retain_size = self.ui.dateEdit_2.sizePolicy() retain_size.setRetainSizeWhenHidden(True) self.ui.dateEdit_2.setSizePolicy(retain_size) retain_size = self.ui.comboBox.sizePolicy() retain_size.setRetainSizeWhenHidden(True) # self.ui.comboBox.setSizePolicy(retain_size) retain_size = self.ui.label_2.sizePolicy() retain_size.setRetainSizeWhenHidden(True) self.ui.label_2.setSizePolicy(retain_size) except AttributeError: print("No PYQT5 Binding! Widgets might be deformed") self.ui.dateEdit.setDate(pastQL) self.ui.dateEdit_2.setDate(curdateQ) #populate widgets self.ui.dateEdit.setCalendarPopup(True) self.ui.dateEdit_2.setCalendarPopup(True) self.ui.comboBox.addItems(["D"]) self.ui.treeWidget_2.setDragDropMode(self.ui.treeWidget_2.InternalMove) self.ui.treeWidget_2.setContextMenuPolicy(Qt.CustomContextMenu) self.ui.treeWidget_2.customContextMenuRequested.connect( self.openWidgetMenu) #self.ui.toolbutton.clicked.connect(lambda action: self.graphmerge(action, CombineKeyword)) self.ui.combobox.currentIndexChanged.connect( lambda: self.modifycombo(pastQL, pastQ)) def log(self): widget = QWidget(None) self.w1 = Ui_Form().setupUi(widget) # self.w1.pushButton.clicked.connect(self.w1.login) # self.w1.goregister.clicked.connect(self.w1.login) self.w1.show() def init_treeWidget(self, list1, series): self.ui.treeWidget.clear() for j in list1: parent = QTreeWidgetItem( self.ui.treeWidget) #populate treewidget with names parent.setText(0, j) var = series.loc[series["c_name"] == j] list2 = var["code"].tolist() name = var["name"].tolist() #var = showcollection(i) #Display database items for idx, val in enumerate(list2): child = QTreeWidgetItem(parent) child.setText(0, name[idx] + "-" + str(val)) #for i in Drag: #grandson = QTreeWidgetItem(child) #Commented out because increases program response time #grandson.setText(0, i) #self.ui.treeWidget.itemDoubleClicked.connect(self.onClickItem) #Display Collection items def code_sort_tree(self, companies): self.ui.treeWidget.clear() sorted_comps = companies.sort_values(["code"]) code_list = sorted_comps["code"].tolist() name_list = sorted_comps["name"].tolist() shares_parent = QTreeWidgetItem(self.ui.treeWidget) shares_parent.setText(0, "个股行情") for idx, val in enumerate(code_list): child = QTreeWidgetItem(shares_parent) child.setText(0, name_list[idx] + "-" + str(val)) self.ui.treeWidget.expandToDepth(0) def search_comp(self, companies): self.ui.treeWidget.clear() text = self.ui.search_lineEdit.text() print(text) filtered_codes = companies[companies['code'].str.contains(text)] filtered_names = companies[companies['name'].str.contains(text)] filtered_comps = filtered_codes.append(filtered_names) code_list = filtered_comps["code"].tolist() name_list = filtered_comps["name"].tolist() parent = QTreeWidgetItem(self.ui.treeWidget) parent.setText(0, "搜索结果") for idx, val in enumerate(code_list): child = QTreeWidgetItem(parent) child.setText(0, name_list[idx] + "-" + str(val)) self.ui.treeWidget.expandToDepth(0) def modifycombo(self, pastQL, pastQ): if self.ui.combobox.currentText() == u"回测分析系统": self.ui.label_2.show() self.ui.dateEdit_2.show() self.ui.dateEdit.setDate(pastQL) self.ui.interval_label.show() self.ui.comboBox.hide() self.ui.comboBox.clear() self.ui.comboBox.addItems(["D"]) #same as above self.ui.treeWidget_2.clear() if self.ui.combobox.currentText() == u"获取历史K线": self.ui.label_2.show() self.ui.dateEdit_2.show() self.ui.dateEdit.setDate(pastQL) self.ui.interval_label.show() self.ui.comboBox.show() self.ui.comboBox.clear() self.ui.comboBox.addItems(["D", "W", "M", "5", "15", "30", "60"]) #same as above self.ui.treeWidget_2.clear() if self.ui.combobox.currentText( ) == u"获取复权数据": #if 复权 is selected, clear all existing queries to avoid value conflict self.ui.label_2.show() self.ui.dateEdit_2.show() self.ui.dateEdit.setDate(pastQL) self.ui.interval_label.show() self.ui.comboBox.show() self.ui.comboBox.clear() self.ui.comboBox.addItems(["hfq", "qfq"]) self.ui.treeWidget_2.clear() if self.ui.combobox.currentText() == u"获取分笔数据": self.ui.interval_label.hide() self.ui.comboBox.hide() self.ui.label_2.hide() self.ui.dateEdit_2.hide() self.ui.dateEdit.setDate(pastQ) self.ui.treeWidget_2.clear() if self.ui.combobox.currentText() == u"获取历史分钟数据": self.ui.interval_label.hide() self.ui.comboBox.show() self.ui.comboBox.clear() self.ui.comboBox.addItems( ["1min", "5min", "15min", "30min", "60min"]) self.ui.label_2.hide() self.ui.dateEdit_2.hide() self.ui.dateEdit.setDate(pastQ) self.ui.treeWidget_2.clear() if self.ui.combobox.currentText() == u"分析十大股东": self.ui.interval_label.hide() self.ui.comboBox.hide() self.ui.label_2.hide() self.ui.dateEdit_2.hide() self.ui.treeWidget_2.clear() def openMenu(self, position): indexes = self.ui.treeWidget.selectedIndexes() item = self.ui.treeWidget.itemAt(position) db_origin = "" #if item.parent(): # db_origin = item.parent().text(0) collec = str(item.text(0).encode("utf-8")) if len(indexes) > 0: level = 0 index = indexes[0] while index.parent().isValid(): index = index.parent() level = level + 1 menu = QMenu() #print((collec, db_origin)) if level == 0: pass else: #keyarray = GetKeys(collec, db_origin) #if "Open" in keyarray: if self.ui.combobox.currentText() == u"回测分析系统": menu.addAction(QAction("ATP model", menu, checkable=True)) if self.ui.combobox.currentText() == u"获取历史K线": menu.addAction(QAction("Kline", menu, checkable=True)) menu.addAction(QAction("Open", menu, checkable=True)) menu.addAction( QAction("Close", menu, checkable=True) ) #open up different menu with different kind of graphs menu.addAction(QAction("High", menu, checkable=True)) menu.addAction(QAction("Low", menu, checkable=True)) menu.addAction(QAction("Volume", menu, checkable=True)) #menu.addAction(QAction("P_change", menu, checkable=True)) #menu.addAction(QAction("Turnover",menu,checkable=True)) if self.ui.combobox.currentText() == u"获取复权数据": menu.addAction(QAction("Kline", menu, checkable=True)) menu.addAction(QAction("Open", menu, checkable=True)) menu.addAction(QAction("Close", menu, checkable=True)) menu.addAction(QAction("High", menu, checkable=True)) menu.addAction(QAction("Low", menu, checkable=True)) menu.addAction(QAction("Volume", menu, checkable=True)) menu.addAction(QAction("Amount", menu, checkable=True)) if self.ui.combobox.currentText() == u"获取分笔数据": menu.addAction(QAction("分笔", menu, checkable=True)) if self.ui.combobox.currentText() == u"获取历史分钟数据": menu.addAction(QAction("Kline", menu, checkable=True)) menu.addAction(QAction("Open", menu, checkable=True)) menu.addAction(QAction("Close", menu, checkable=True)) menu.addAction(QAction("High", menu, checkable=True)) menu.addAction(QAction("Low", menu, checkable=True)) menu.addAction(QAction("Volume", menu, checkable=True)) menu.addAction(QAction("Amount", menu, checkable=True)) if self.ui.combobox.currentText() == u"分析十大股东": menu.addAction(QAction("季度饼图", menu, checkable=True)) #menu.addAction(QAction("持股比例", menu, checkable=True)) #for g in keyarray: #menu.addAction(QAction(g, menu, checkable=True)) menu.triggered.connect( lambda action: self.methodSelected(action, collec)) menu.exec_(self.ui.treeWidget.viewport().mapToGlobal(position)) def methodSelected(self, action, collec): # print(action.text()) #Choice # if (self.ui.treewidget.count() == 5): # self.ui.label.setText("Maximum number of queries") # return # self.ui.label.setText("") Choice = action.text() Stock = collec # print(collec) #Stock Name # print(db_origin) #DataBase name # list1 = [self.tr(Stock+"-"+Choice+"-"+db_origin)] # self.ui.treewidget.addItems(list1) parent = QTreeWidgetItem(self.ui.treeWidget_2) parent.setText(0, Stock.decode("utf-8") + "-" + Choice) def openWidgetMenu(self, position): indexes = self.ui.treeWidget_2.selectedIndexes() item = self.ui.treeWidget_2.itemAt(position) if item == None: return #item = self.ui.listWidget.itemAt(position) if len(indexes) > 0: menu = QMenu() menu.addAction( QAction("Delete", menu, checkable=True)) #This function is perhaps useless #menu.triggered.connect(self.eraseItem) item = self.ui.treeWidget_2.itemAt(position) #collec = str(item.text()) menu.triggered.connect( lambda action: self.ListMethodSelected(action, item)) menu.exec_(self.ui.treeWidget_2.viewport().mapToGlobal(position)) def ListMethodSelected(self, action, item): if action.text() == "Delete": self.eraseItem() if action.text() == "Combine": global CombineKeyword collec = str(item.text()) CombineKeyword.append(collec) #Useless function(maybe?) list1 = [self.tr(collec)] self.ui.listwidget.addItems(list1) self.eraseItem() def eraseItem(self): for x in self.ui.treeWidget_2.selectedItems( ): #delete with write click menu #item = self.ui.treewidget.takeItem(self.ui.treewidget.currentRow()) sip.delete(x) #item.delete def classify(self, folder): startdate = self.ui.dateEdit.date() startdate = startdate.toPyDate() startdate = startdate.strftime( "%Y/%m/%d") #converts date from dateedit to tushare readable date enddate = self.ui.dateEdit_2.date() enddate = enddate.toPyDate() enddate = enddate.strftime("%Y/%m/%d") option = self.ui.comboBox.currentText() option = str(option) #if (self.ui.treewidget) == 0: #self.ui.label.setText("Need to select at least one query") #return root = self.ui.treeWidget_2.invisibleRootItem( ) # This is for iterating child items child_count = root.childCount() texts = [] if child_count == 0: return for i in range(child_count): item = root.child(i) text = item.text(0) #with 3 part'stock_name'+'-'+'code'+'-'+action texts.append(text) labels = [k for k in texts] #items = ([x.encode("utf-8") for x in labels]) width = self.ui.webView.width( ) #give width and height of user's screen so that graphs can be generated with dynamic size height = self.ui.webView.height() display(labels, startdate, enddate, option, width, height) #labels:复权ork线or分笔 option:hfq, qfq or 15, 30, D, etc self.ui.webView.reload() #refreshes webengine self.ui.webView.repaint() self.ui.webView.update() def graphmerge(self, combineKeyword): sth = "" for i in combineKeyword: if sth == "": sth = sth + i else: sth = sth + "\n" + "&" + "-" + i list1 = sth return sth global CombineKeyword CombineKeyword = [] self.ui.listwidget.clear( ) #combine stuff so that different graphs can be drawn together
def log(self): widget = QWidget(None) self.w1 = Ui_Form().setupUi(widget) # self.w1.pushButton.clicked.connect(self.w1.login) # self.w1.goregister.clicked.connect(self.w1.login) self.w1.show()
class mainInterface(QWidget): # 定义信号 processFinished = pyqtSignal(dict) def __init__(self): """ 初始化 :return: null """ # 超类初始化 super().__init__() # UI初始化 self.ui = Ui_mainWidget() self.ui.setupUi(self) self.grabKeyboard() self.setMouseTracking(True) self.setWindowFlags(Qt.FramelessWindowHint) self.setWindowIcon(QIcon('OCR.ico')) # 初始化相机 self.camera = QCamera() self.imageCapture = QCameraImageCapture(self.camera) self.viewsetting = QCameraViewfinderSettings() self.initimplement() # 初始化标题栏 self.initTitleBar() # 初始化系统托盘 self.tray = QSystemTrayIcon() self.tray.setIcon(QIcon('OCR.ico')) self.initTray() # OCR识别部分 self.OCR = ocr() self.OCR.setappid('1257206643') self.OCR.setsecretid('AKIDFTddWEg9Ncsz0sE7oOpBNOExdDdeCUJ3') self.OCR.setsecretkey('FQitsgUND8yfrZK0RrBMOJB5tWhCm5Ol') # 初始化登录部分 self.logWidget = QWidget() self.logui = Ui_Form() self.logui.setupUi(self.logWidget) self.logWidget.setWindowFlags(Qt.FramelessWindowHint) self.logWidget.setWindowModality(Qt.ApplicationModal) self.logui.close_btn.clicked.connect(self.logWidget.close) # 初始化变量 self.mousePressd = False self.mousePoint = None self.result = {} self.isFirst = False self.ocrType = ocrType.ocr_general # 默认为印刷体识别 # 初始化字定义信号连接 self.processFinished.connect(self.updateOCRInfo) self.ui.btn_login.clicked.connect(self.logWidget.show) self.ui.comboBox_choose.currentIndexChanged.connect(self.changeocrType) def initTitleBar(self): """ 初始化标题栏 :return: null """ self.ui.frame.setStyleSheet( "QFrame#frame{background-color:rgb(244, 76, 76);}") self.ui.label_logo.setStyleSheet( "QLabel{border-image:url(./image/ocr.png);}") self.ui.label_title.setStyleSheet( "QLabel{border-image:url(./image/iOCR.png);}") self.ui.comboBox_choose.setStyleSheet( "QComboBox {border-radius:15px;border: 2px solid #4AFFF4;font-family:'楷体';font-size:20px;}" "QComboBox QAbstractItemView::item{height:50px;width:200px;}" "QComboBox::down-arrow{image: url(./image/arrow.png);width:25px;height:25px;}" "QComboBox::drop-down {subcontrol-origin: padding;subcontrol-position:top right;border:none;margin-right:30px;}" "QComboBox::down-arrow:hover{image:url(./image/arrow_hover.png);width:25px;height:25px;}" "QComboBox::down-arrow:on {top: 1px;left: 1px;}") self.ui.comboBox_choose.insertItem(0, ' 印刷体识别') self.ui.comboBox_choose.insertItem(1, ' 手写体识别') self.ui.comboBox_choose.insertItem(2, ' 身份证识别') self.ui.comboBox_choose.insertItem(3, ' 名片识别') self.ui.comboBox_choose.insertItem(4, ' 银行卡识别') self.ui.btn_login.setStyleSheet( "QPushButton{border-image:url(./image/default-portrait.png);}") self.ui.btn_setting.setStyleSheet( "QPushButton{border-image:url(./image/settings.png);}" "QPushButton:hover{border-image:url(./image/qcconfig-hover.png);}") self.ui.btn_min.setStyleSheet( "QPushButton{border-image:url(./image/mini_new.png);}" "QPushButton:hover{border-image:url(./image/mini_hover_new.png);}") self.ui.btn_close.setStyleSheet( "QPushButton{border-image:url(./image/close.png);}" "QPushButton:hover{border-image:url(./image/close-hover.png);}") self.ui.checkBox_cam.setStyleSheet( "QCheckBox{spacing: 5px;font-size: 24px;vertical-align:middle}" "QCheckBox::indicator { width: 45px;height: 45px;}" "QCheckBox::indicator::unchecked {image: url(./image/close_cam.png);}" "QCheckBox::indicator::checked { image: url(./image/open_cam.png);}" ) self.ui.captureBtn.setStyleSheet( "QPushButton{border-style: outset;border-width: 2px;border-color: rgb(82,215,100);border-radius: 5px;font-size: 24px;}" "QPushButton:pressed{background-color: rgb(176,215,181);border-style: inset;}" ) self.ui.checkBox_cam.setChecked(True) self.ui.btn_close.clicked.connect(lambda: qApp.quit()) self.ui.btn_min.clicked.connect(self.miniToTray) self.ui.checkBox_cam.stateChanged.connect(self.camControl) def initTray(self): """ 初始化系统托盘信息 :return: """ tray_menu = QMenu() restoreAction = QAction('&Show', self) quitAction = QAction('&Quit', self) tray_menu.addAction(restoreAction) tray_menu.addAction(quitAction) self.tray.setContextMenu(tray_menu) restoreAction.triggered.connect(self.trayActivatedEvent) quitAction.triggered.connect(qApp.quit) self.tray.activated.connect(self.trayActivatedEvent) def initimplement(self): """ 初始化实现端口 :return: ui """ camInfo = QCameraInfo(self.camera) if camInfo.defaultCamera().isNull(): QMessageBox.warning(self, 'Warning', 'No available camera!', QMessageBox.Ok) return -1 else: self.ui.caputurePhoto.setText(camInfo.description()) self.camera.setViewfinder(self.ui.cameraShow) self.camera.setCaptureMode(QCamera.CaptureStillImage) self.camera.load() resolution = self.camera.supportedViewfinderResolutions() if len(resolution) != 0: if QSize(640, 480) in resolution: self.viewsetting.setResolution(QSize(640, 480)) elif QSize(640, 360) in resolution: self.viewsetting.setResolution(QSize(640, 360)) else: self.viewsetting.setResolution(resolution[0]) self.camera.setViewfinderSettings(self.viewsetting) # ------------------------------Note-------------------------------- # 此种方法利用摄像头准备捕捉图像的状态来进行捕捉图像,readyForCapture # 为true时,才进行捕捉图像,详见下面捕捉函数槽函数。这种方法将进行不 # 停的捕捉,将每次捕捉的相邻图像进行图像相似度判断。当图像相似度低于 # 阈值时,认定为新图像,才进行OCR识别。否则仅捕捉图像而不进行识别。当 # 然捕捉图像速度过于太快时,可以用定时器,每隔0.5秒,去检查readyFor # Capture状态位,进而有效控制程序资源。 # 本应用中采用按键捕捉方式,非自动,详见下面按键捕捉事件 # ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ # self.imageCapture.readyForCaptureChanged.connect(self.captureimage) self.camera.start() self.ui.caputurePhoto.setScaledContents(True) self.imageCapture.setCaptureDestination( QCameraImageCapture.CaptureToBuffer) self.imageCapture.imageCaptured.connect(self.displayimage) self.ui.captureBtn.clicked.connect(self.openDlg) def displayimage(self, num, image): """ 显示图形 :param num: number :param image: image :return: null """ self.ui.caputurePhoto.setPixmap(QPixmap.fromImage(image)) self.ui.ocrInfo.setText('识别中......') t = threading.Thread(target=self.ocrForImage, args=(image, )) t.start() # def captureimage(self, state): # """ # 捕捉图像槽函数 # :state: 状态变量 # :return: null # """ # if state is True: # self.camera.searchAndLock() # self.imageCapture.capture() # self.camera.unlock() # def saveimage(self): # """ # 保存图像槽函数 # :return: null # """ # pix = QPixmap(self.ui.caputurePhoto.pixmap()) # if pix: # pix.save(r'D://1.png', 'PNG') # QMessageBox.information(self, 'Message', 'Capture Successfully', QMessageBox.Ok) def ocrForImage(self, image): """ 为截取的图片进行ocr识别 :param image: QImage :return: null """ # Note:子线程里不能对ui界面做改动,ui界面修改只能在主线程中修改,下面注释的做法是错误的 # self.ui.ocrInfo.setText('识别中......') byte = QByteArray() buffer = QBuffer(byte) buffer.open(QIODevice.WriteOnly) image.save(buffer, 'PNG') if self.ocrType == ocrType.ocr_general: self.result = self.OCR.client.general_detect( CIBuffers([byte.data()])) elif self.ocrType == ocrType.ocr_handwriting: self.result = self.OCR.client.handwriting_detect( CIBuffers([byte.data()])) elif self.ocrType == ocrType.ocr_idcard: self.result = self.OCR.client.idcard_detect( CIBuffers([byte.data()]), 0) elif self.ocrType == ocrType.ocr_namecard: self.result = self.OCR.client.namecard_detect( CIBuffers([byte.data()]), 0) elif self.ocrType == ocrType.ocr_bankcard: self.result = self.OCR.client.bankcard_detect( CIBuffers([byte.data()])) else: pass self.processFinished.emit(self.result) def updateOCRInfo(self, res): """ 将ocr识别结果显示在信息框中 :param res: :return: """ if self.ocrType == ocrType.ocr_general or self.ocrType == ocrType.ocr_handwriting: if res['code'] == 0 and res['message'] == 'OK': self.ui.ocrInfo.setText('OK') ocrInfo = [] for i in range(len(self.result['data']['items'])): ocrInfo.append( self.result['data']['items'][i]['itemstring']) self.ui.ocrInfo.setText(''.join(ocrInfo)) else: self.ui.ocrInfo.setText('识别失败!') elif self.ocrType == ocrType.ocr_bankcard: if res['code'] == 0 and res['message'] == 'OK': self.ui.ocrInfo.setText('OK') ocrInfo = [] for i in range(len(self.result['data']['items'])): ocrInfo.append(self.result['data']['items'][i]['item']) ocrInfo.append(':') ocrInfo.append( self.result['data']['items'][i]['itemstring']) ocrInfo.append('\n') self.ui.ocrInfo.setText(''.join(ocrInfo)) else: self.ui.ocrInfo.setText('识别失败!') elif self.ocrType == ocrType.ocr_idcard: if res['result_list'][0]['code'] == 0 and res['result_list'][0][ 'message'] == 'OK': self.ui.ocrInfo.setText('OK') ocrInfo = [] ocrInfo_keys = list( self.result['result_list'][0]['data'].keys()) ocrInfo_values = list( self.result['result_list'][0]['data'].values()) for i in range( len(self.result['result_list'][0]['data']) // 2): ocrInfo.append(ocrInfo_keys[i]) ocrInfo.append(':') ocrInfo.append(ocrInfo_values[i]) ocrInfo.append('\n') self.ui.ocrInfo.setText(''.join(ocrInfo)) else: self.ui.ocrInfo.setText('识别失败!') elif self.ocrType == ocrType.ocr_namecard: if res['result_list'][0]['code'] == 0 and res['result_list'][0][ 'message'] == 'OK': self.ui.ocrInfo.setText('OK') ocrInfo = [] for i in range(len(self.result['result_list'][0]['data'])): ocrInfo.append( self.result['result_list'][0]['data'][i]['item']) ocrInfo.append(':') ocrInfo.append( self.result['result_list'][0]['data'][i]['value']) ocrInfo.append('\n') self.ui.ocrInfo.setText(''.join(ocrInfo)) else: self.ui.ocrInfo.setText('识别失败!') else: pass def camControl(self, state): """ 槽函数 控制相机开关 :param state: checkbox开关状态 :return:null """ if state == Qt.Unchecked: self.ui.cameraShow.setUpdatesEnabled(False) elif state == Qt.Checked: self.ui.cameraShow.setUpdatesEnabled(True) else: return -1 def miniToTray(self): """ 槽函数 最小化到系统托盘 :return:null """ if not self.tray.isVisible(): self.tray.show() if self.tray.isVisible(): if self.isFirst is False: QMessageBox.information( self, "Systray", "The program will keep running in the " "system tray. To terminate the program, " "choose <b>Quit</b> in the context menu " "of the system tray entry.") self.isFirst = True self.hide() def trayActivatedEvent(self, reason): """ 槽函数 响应点击托盘图标 :param reason: 响应原因 :return: null """ if reason == QSystemTrayIcon.Context: pass else: self.tray.hide() self.show() def openDlg(self): """ 槽函数 打开对话框选取文件 :return:文件名 """ filename, filetype = QFileDialog.getOpenFileName( self, '选取图片', path.expanduser('~'), "Image Files (*.png *.jpg *.bmp)") if filename: if QFile(filename).size() >= 6291456: QMessageBox.information(self, '打开图片', '选择图片大于6MB大小,暂不支持识别,请重新选择。') self.openDlg() else: self.displayimage(0, QImage(filename)) def keyPressEvent(self, e): """ 槽函数 键盘按键响应事件 :param e: 按键事件 :return: null """ if e.key() == Qt.Key_Space: if self.imageCapture.isReadyForCapture(): self.camera.searchAndLock() self.imageCapture.capture() self.camera.unlock() def mouseMoveEvent(self, e): """ 槽函数 定义鼠标移动事件 :param e: QMouseEvent :return: null """ if (e.buttons() == Qt.LeftButton) and self.mousePressd: self.move(e.globalPos() - self.mousePoint) e.accept() def mousePressEvent(self, e): """ 槽函数 定义鼠标按下事件 :param e: QMouseEvent :return: null """ if e.button() == Qt.LeftButton: self.mousePressd = True self.mousePoint = e.globalPos() - self.pos() e.accept() def mouseReleaseEvent(self, e): """ 槽函数 定义鼠标松开事件 :param e: QMouseEvent :return: null """ self.mousePressd = False def changeocrType(self, index): """ 槽函数 改变ocr识别类型 :param index: int :return: null """ if index == 0: self.ocrType = ocrType.ocr_general elif index == 1: self.ocrType = ocrType.ocr_handwriting elif index == 2: self.ocrType = ocrType.ocr_idcard elif index == 3: self.ocrType = ocrType.ocr_namecard elif index == 4: self.ocrType = ocrType.ocr_bankcard else: pass
def __init__(self, parent=None): QtGui.QWidget.__init__(self,parent) self.vlogin = Ui_Form() self.vlogin.setupUi(self) self.connect(self.vlogin.btn_aceptar, QtCore.SIGNAL('clicked()'),self.validaUsuario)
class v_login(QtGui.QDialog): def __init__(self, parent=None): QtGui.QWidget.__init__(self,parent) self.vlogin = Ui_Form() self.vlogin.setupUi(self) self.connect(self.vlogin.btn_aceptar, QtCore.SIGNAL('clicked()'),self.validaUsuario) def conectaPosMaster_Valida(self,sentencia): return False """ #QMessageBox.about(self, "Error Acceso Denegado", 'entre a consulta') conn = pyodbc.connect("DRIVER={SQL Server};SERVER=192.168.1.1;UID=usuario;PWD=password;") curs = conn.cursor() curs.execute(sentencia) rows = curs.fetchall() if rows != "[]": for row in rows: global usuario usuario = row.emp_nombre return True else: return False curs.close () conn.close () #""" def validaUsuario(self): usuario = self.vlogin.t_usuario.text() passwd = self.vlogin.t_password.text() passwd = passwd.encode('utf-8') passwd_md5 = hashlib.md5(passwd).hexdigest() #QMessageBox.about(self, "Error Acceso Denegado", passwd_md5) tienda_var = "select emp_nombre, emp_id, app_permiso\ from soporte..cat_empleado, soporte..cat_empleado_app\ where app_emp = emp_id\ and emp_login = '******'\ and emp_password = '******' and app_desc = 'DHCP'" % (usuario,passwd_md5) if self.conectaPosMaster_Valida(tienda_var) == True: self.ventana() else: QMessageBox.about(self, "Error Acceso Denegado", str('Acceso Denegado, Verifica Password ')) self.vlogin.t_password.clear() def ventana(self): #global usuario global ip self.hide() #usuario = self.vlogin.t_usuario.text() ip = socket.gethostbyname(socket.gethostname()) self.w = v_principal() self.w.show()
def __init__(self): Ui_Form.__init__(self) self.qwidget = QWidget() self.setupUi(self.qwidget) self.qwidget.setWindowTitle("欢迎")
def __init__(self): super(Login, self).__init__() self.ui = Ui_Form() self.ui.setupUi(self) self.escuchador() self.show()
class Login(QtWidgets.QWidget): def __init__(self): super(Login, self).__init__() self.ui = Ui_Form() self.resize(507, 249) self.setFixedSize(self.width(), self.height()) self.ui.setupUi(self) self.ui.pushButton.clicked.connect(self.login) self.series = '' self.room_id = '' self.auto_login() # 自动登录 # 绑定会议室序列号,并执行登录 def login(self): print("绑定会议室") self.series = self.ui.lineEdit.text() # 得到输入的值 response = self.verify_series(self.series, verify_type=0) # 验证输入的序列号 print(response) if response['status'] == 1: self.room_id = response['room_id'] # 保存配置 config = {} config['series'] = self.series config['id'] = self.room_id config_file_path = '../config/room.json' with open(config_file_path, 'w+') as f: config = f.write(json.dumps(config)) # 写入配置文件 index.get_data() # 开启更新检测 index.show() # 页面跳转 self.close() else: # 使用infomation信息框 QtWidgets.QMessageBox.information(self, "绑定失败", response['message'], QtWidgets.QMessageBox.Close) def auto_login(self): config_file_path = '../config/room.json' with open(config_file_path, 'r+') as f: config = f.read() config = json.loads(config) if config['series'] == '': pass else: # 验证序列号 self.series = config['series'] self.ui.lineEdit.setText(self.series) # 读取当前配置 self.room_id = config['id'] # 向后台请求数据,验证序列号 # response = self.verify_series(self.series, verify_type=1, room_id=self.room_id) # print(response) # if response['status'] == 1: # 验证通过 # self.close() # index.show() # 执行自动登录 # else: # QtWidgets.QMessageBox.information(self, "验证失败", response['message'], QtWidgets.QMessageBox.Close) # 验证/绑定序列号 def verify_series(self, series, verify_type, room_id=None): # verify_type为验证类型,为0时绑定, 为1时验证 data = {'series': series, 'room_id': room_id, 'type': verify_type} url = Server_IP + '/meeting/verify_series/' r = requests.post(url, data=data) response = r.content.decode('utf-8') response = json.loads(response) return response
class v_login(QtGui.QDialog): def __init__(self, parent=None): QtGui.QWidget.__init__(self, parent) self.vlogin = Ui_Form() self.vlogin.setupUi(self) self.connect(self.vlogin.btn_aceptar, QtCore.SIGNAL('clicked()'), self.validaUsuario) def conectaPosMaster_Valida(self, sentencia): return False """ #QMessageBox.about(self, "Error Acceso Denegado", 'entre a consulta') conn = pyodbc.connect("DRIVER={SQL Server};SERVER=192.168.1.1;UID=usuario;PWD=password;") curs = conn.cursor() curs.execute(sentencia) rows = curs.fetchall() if rows != "[]": for row in rows: global usuario usuario = row.emp_nombre return True else: return False curs.close () conn.close () #""" def validaUsuario(self): usuario = self.vlogin.t_usuario.text() passwd = self.vlogin.t_password.text() passwd = passwd.encode('utf-8') passwd_md5 = hashlib.md5(passwd).hexdigest() #QMessageBox.about(self, "Error Acceso Denegado", passwd_md5) tienda_var = "select emp_nombre, emp_id, app_permiso\ from soporte..cat_empleado, soporte..cat_empleado_app\ where app_emp = emp_id\ and emp_login = '******'\ and emp_password = '******' and app_desc = 'DHCP'" % ( usuario, passwd_md5) if self.conectaPosMaster_Valida(tienda_var) == True: self.ventana() else: QMessageBox.about(self, "Error Acceso Denegado", str('Acceso Denegado, Verifica Password ')) self.vlogin.t_password.clear() def ventana(self): #global usuario global ip self.hide() #usuario = self.vlogin.t_usuario.text() ip = socket.gethostbyname(socket.gethostname()) self.w = v_principal() self.w.show()