class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): #窗口设置 self.setGeometry(300, 300, 300, 320) self.setWindowTitle('聊天室') self.setWindowIcon(QIcon('timg.jpg')) #设置窗口图标 #按钮设置 btn = QPushButton('Button', self) btn.move(200, 200) btn.resize(100, 120) btn.clicked.connect(self.Onchanged) #消息框 self.textbox = QLineEdit(self) self.textbox.move(0, 200) self.textbox.resize(200, 120) #label设置 self.lb1 = QLabel(self) self.show() def Onchanged(self, text): txt = self.textbox.text() MySQL_Op.InsertTB(txt) self.lb1.setText(txt) self.lb1.adjustSize()
def initUI(self): #窗口显示在屏幕中央 self.center() #设置窗口大小为宽500,高300 self.resize(500,300) #窗口标题 self.setWindowTitle('抢票软件V1.0') #查询刷票按钮 qy = QPushButton("刷票",self) qy.resize(40,30) qy.move(450,80) #登录按钮 lbt = QPushButton('登录',self) lbt.resize(40,30) lbt.move(400,20) #验证码图片按钮 vbt = QPushButton('选择验证码',self) vbt.resize(80,30) vbt.move(300,20) #创建文本框 username = QLineEdit(self) username.resize(100, 30) username.move(20, 20) password = QLineEdit(self) password.resize(100, 30) password.move(140, 20) # 按钮点击事件关联 #self.button.clicked.connect(self.on_click) #显示在屏幕上 self.show()
class App(QWidget): def __init__(self): super().__init__() self.title = 'PyQt5 textbox' self.left = 10 self.top = 10 self.width = 320 self.height = 200 self.initUI() def initUI(self): self.setWindowTitle(self.title) self.setGeometry(self.left, self.top, self.width, self.height) # create textbox self.textbox = QLineEdit(self) self.textbox.move(20, 20) self.textbox.resize(280, 40) # Create a button in the window self.button = QPushButton('show text', self) self.button.move(20, 80) # connect button to function on_click self.button.clicked.connect(self.on_click) self.show() @pyqtSlot() def on_click(self): textboxValue = self.textbox.text() QMessageBox.question(self, "Message", 'You typed:' + textboxValue, QMessageBox.Ok, QMessageBox.Ok) """打印完毕之后清空文本框""" self.textbox.setText('')
class App(QWidget): def __init__(self): ''' 初始化操作 ''' # 调用父类QWidget的方法 super().__init__() # 对话框标题文字 self.title = '人人都是Pythonista' # 对话框初始显示位置(从屏幕左边开始往右数) self.left = 200 # 对话框的初始高度(从屏幕上面开始往下数) self.top = 250 # 对话框宽 self.width = 500 # 对话框高 self.height = 500 # 初始化时执行页面ui初始化方法 self.initUI() def initUI(self): ''' 页面ui初始化 ''' # 设置窗口标题 self.setWindowTitle(self.title) # 设置窗口初始位置 self.setGeometry(self.left, self.top, self.width, self.height) # 设置窗口小图标(icon) self.setWindowIcon(QtGui.QIcon('icon.jpg')) # 创建文本框 self.textbox = QLineEdit(self) # 文本框在界面中的初始位置(左上角的位置) self.textbox.move(20, 30) # 文本框的尺寸(长,宽) self.textbox.resize(400, 300) # 创建一个按钮 self.button = QPushButton('在这里点击', self) # 按钮的初始位置(左上角的位置) self.button.move(20, 340) # 将按钮点击事件与下面的on_click方法关联起来 self.button.clicked.connect(self.on_click) # 弹出对话框 self.show() @pyqtSlot() def on_click(self): ''' 点击事件 ''' # 获取文本框中输入的值 textboxValue = self.textbox.text() # 弹出对话框 QMessageBox.question(self, "Message", '你输入了这些内容:' + textboxValue, QMessageBox.Ok, QMessageBox.Ok) # 点击以后清空文本框 self.textbox.setText('')
class editpopup(QWidget): user_id = "" session = Session() def __init__(self): super().__init__() self.title = "Edit Pop Up" self.width = 500 self.height = 500 self.top = 100 self.left = 100 self.initUI() def initUI(self): self.username = QLineEdit(self) self.username.move(200, 200) self.password = QLineEdit(self) self.password.move(200, 240) self.password.setEchoMode(QLineEdit.Password) self.role = QComboBox(self) self.role.addItem("Student") self.role.addItem("Librarian") self.role.addItem("Admin") self.role.move(200, 280) self.savechanges = QPushButton("Save changes", self) self.savechanges.move(250, 350) self.savechanges.clicked.connect(self.updateValues) self.setWindowTitle(self.title) self.setGeometry(self.left, self.top, self.width, self.height) def setValues(self, user_id, user_name, user_password, user_role): self.user_id = user_id self.username.setText(user_name) self.password.setText(user_password) self.role.setCurrentText(user_role) def updateValues(self): result = self.session.query(User).filter( User.id == self.user_id).first() result.username = self.username.text() result.password = self.password.text() result.role = self.role.currentText() try: self.session.add(result) self.session.commit() self.close() except: print("Error occured while saving")
class Login(QWidget): session = Session() def __init__(self): super().__init__() self.title = "Admin Panel" self.width = 640 self.height = 400 self.top = 100 self.left = 100 self.adminPanelUI = AdminPanel() self.initUI() def initUI(self): self.lblusername = QLabel(self) self.lblpassword = QLabel(self) self.lblusername.move(200, 100) self.lblusername.setText("USERNAME") self.lblpassword.move(200, 140) self.lblpassword.setText("PASSWORD") self.username = QLineEdit(self) self.username.move(250, 100) self.password = QLineEdit(self) self.password.move(250, 140) self.password.setEchoMode(QLineEdit.Password) self.login = QPushButton("Login", self) self.login.move(280, 300) self.login.clicked.connect(self.onclick) self.setWindowTitle(self.title) self.setGeometry(self.left, self.top, self.width, self.height) self.show() def onclick(self): user = self.session.query(User).filter( User.username == self.username.text()).first() print("User Exists") if (user.password == self.password.text()): role = user.role print(role) if (role == "Student"): print("It is a student") elif (role == "Librarian"): print("Redirect to the librarian UI") else: self.adminPanelUI.show()
class App(QWidget): def __init__(self): super(App, self).__init__(None) self.title = 'steering angle test' self.left = 10 self.top = 10 self.width = 400 self.height = 400 self.initUI() def initUI(self): self.setWindowTitle(self.title) self.setGeometry(self.left, self.top, self.width, self.height) self.max_angle_label = QLabel("max_angle", self) self.max_angle_label.move(20, 20) self.max_angle_label.resize(80, 40) self.max_angle_text = QLineEdit('450', self) self.max_angle_text.move(120, 20) self.max_angle_text.resize(240, 40) self.angle_label = QLabel("angle", self) self.angle_label.move(20, 60) self.angle_label.resize(80, 40) self.angle_text = QLineEdit('450', self) self.angle_text.move(120, 60) self.angle_text.resize(240, 40) self.times_label = QLabel("times", self) self.times_label.move(20, 100) self.times_label.resize(80, 40) self.times_text = QLineEdit('10', self) self.times_text.move(120, 100) self.times_text.resize(240, 40) self.discret_label = QLabel("discret", self) self.discret_label.move(20, 140) self.discret_label.resize(80, 40) self.discret_text = QLineEdit('200', self) self.discret_text.move(120, 140) self.discret_text.resize(240, 40) self.test_button = QPushButton('test', self) self.test_button.move(20, 240) self.test_button.resize(360, 40) # connect button to function on_click self.test_button.clicked.connect(self.on_test_click) self.show() def on_test_click(self): sendVehicleCmd(vehicle_info.steering_angle, int(self.angle_text.text()), int(self.max_angle_text.text()), int(self.times_text.text()), int(self.discret_text.text()))
class AddUserUI(QMainWindow): def __init__(self): super().__init__() self.width = 640 self.height = 400 self.top = 100 self.left = 100 self.initUI() def initUI(self): self.labelUsername = QLabel(self) self.labelUsername.setText("Username") self.labelPassword = QLabel(self) self.labelPassword.setText("Password") self.labelRole = QLabel(self) self.labelRole.setText("Role") self.labelUsername.move(250, 100) self.labelPassword.move(250, 130) self.labelRole.move(250, 160) self.username = QLineEdit(self) self.username.move(300, 100) self.password = QLineEdit(self) self.password.setEchoMode(QLineEdit.Password) self.password.move(300, 130) self.role = QComboBox(self) self.role.addItem("Student") self.role.addItem("Librarian") self.role.addItem("Admin") self.role.move(300, 160) button = QPushButton("Add User", self) button.move(300, 190) button.clicked.connect(self.add_user) self.setWindowTitle("Add Users") self.setGeometry(self.left, self.top, self.width, self.height) def add_user(self): uname = self.username.text() password = self.password.text() role = self.role.currentText() print(uname) print(password) print(role) user = User(uname, password, role) session.add(user) session.commit() self.statusBar().showMessage("User Saved Successfully")
class Logwindow(QWidget): def __init__(self): super().__init__() self.InitGUI() def InitGUI(self): self.lab1 = QLabel('账号', self) self.lab1.move(23, 30) self.lab2 = QLabel('密码', self) self.lab2.move(23, 80) self.text1 = QLineEdit(self) self.text1.move(50, 30) self.text1.resize(150, 15) self.text2 = QLineEdit(self) self.text2.move(50, 80) self.text2.resize(150, 15) self.text2.setEchoMode(QLineEdit.Password) self.btn = QPushButton('登陆', self) self.btn.move(30, 150) self.btn.clicked.connect(lambda: self.check()) self.btn2 = QPushButton('退出', self) self.btn2.move(150, 150) self.btn2.clicked.connect(lambda: QCoreApplication.instance().quit()) self.setWindowTitle('登录') self.resize(250, 250) self.center() self.show() def center(self): qr = self.frameGeometry() cp = QDesktopWidget().availableGeometry().center() qr.moveCenter(cp) self.move(qr.topLeft()) def check(self): acc = self.text1.text() pas = self.text2.text() #if(check.check(acc,pas)): if (True): MW = M.MainW(acc) self.close() pass else: QMessageBox.critical(self, 'login', '账号密码错误')
class App(QWidget): def __init__(self): super(App, self).__init__(None) self.title = 'tos monitor' self.left = 10 self.top = 10 self.width = 400 self.height = 400 self.initUI() def initUI(self): self.setWindowTitle(self.title) self.setGeometry(self.left, self.top, self.width, self.height) self.period_label = QLabel("period", self) self.period_label.move(20, 20) self.period_label.resize(80, 40) self.period_text = QLineEdit('45', self) self.period_text.move(120, 20) self.period_text.resize(240, 40) self.times_label = QLabel("times", self) self.times_label.move(20, 80) self.times_label.resize(80, 40) self.times_text = QLineEdit('100', self) self.times_text.move(120, 80) self.times_text.resize(240, 40) self.cali_button = QPushButton('calibration', self) self.cali_button.move(20, 200) self.cali_button.resize(360, 40) # connect button to function on_click self.cali_button.clicked.connect(self.on_cali_click) self.show() def on_cali_click(self): sendVehicleCmd(float(self.period_text.text()), int(self.times_text.text()))
class App(QWidget): def __init__(self): super().__init__() self.title = '随机数' self.left = 300 self.top = 300 self.width = 320 self.height = 200 self.initUI() def initUI(self): self.setWindowTitle(self.title) self.setGeometry(self.left, self.top, self.width, self.height) # create textbox self.textbox = QLineEdit(self) self.textbox.move(20, 20) self.textbox.resize(280, 40) # Create a button in the window self.button = QPushButton('确定', self) self.button.move(20, 80) # connect button to function on_click self.button.clicked.connect(self.on_click) self.show() @pyqtSlot() def on_click(self): textboxValue = self.textbox.text() number = textboxValue.split(' ') while True: number = list(set(number)) if len(number) <= 4: number.append(random.randrange(1,10)) elif len(list(set(number))) == 5: break QMessageBox.question(self, "Message", 'You typed:' + str(number), QMessageBox.Ok, QMessageBox.Ok) self.textbox.setText(str(number).replace('\'','').replace('[','').replace(']','').replace(' ',''))
class AddBookUI(QMainWindow): def __init__(self): super().__init__() self.width = 640 self.height = 400 self.top = 500 self.left = 400 self.initUI() def initUI(self): self.labelBookName = QLabel(self) self.labelBookName.setText("Book Name") self.labelAuthor = QLabel(self) self.labelAuthor.setText("Author") self.labelBookName.move(250, 100) self.labelAuthor.move(250, 130) self.bookname = QLineEdit(self) self.bookname.move(300, 100) self.author = QLineEdit(self) self.author.move(300, 130) button = QPushButton("Add Book", self) button.move(300, 190) button.clicked.connect(self.add_book) self.setWindowTitle("Add Books") self.setGeometry(self.left, self.top, self.width, self.height) def add_book(self): book = self.bookname.text(); author = self.author.text(); print(book) print(author) book = Book(book, author) session.add(book) session.commit() self.statusBar().showMessage("Book Saved Successfully") self.bookname.clear() self.author.clear()
class editpopup(QWidget): book_id="" session=Session() def __init__(self): super().__init__() self.title="Edit Pop Up" self.width = 500 self.height = 500 self.top = 100 self.left = 100 self.initUI() def initUI(self): self.bookname=QLineEdit(self) self.bookname.move(200,200) self.author=QLineEdit(self) self.author.move(200,240) self.savechanges=QPushButton("Save changes",self) self.savechanges.move(250,300) self.savechanges.clicked.connect(self.updateValues) self.setWindowTitle(self.title) self.setGeometry(self.left,self.top,self.width,self.height) def setValues(self,book_id,book_name,book_author): self.book_id=book_id self.bookname.setText(book_name) self.author.setText(book_author) def updateValues(self): result=self.session.query(Book).filter(Book.id==self.book_id).first() result.name=self.bookname.text() result.author=self.author.text() try: self.session.add(result) self.session.commit() self.close() except: print("Error occured while saving")
class App(QWidget): def __init__(self): super().__init__() self.title = 'PyQt5 textbox' self.left = 20 self.top = 20 self.width = 640 self.height = 400 self.initUI() def initUI(self): self.setWindowTitle(self.title) self.setGeometry(self.left, self.top, self.width, self.height) # create textbox self.textbox = QLineEdit(self) self.textbox.move(40, 40) self.textbox.resize(560, 80) # Create a button in the window self.button = QPushButton('get triple', self) self.button.move(500, 160) # connect button to function on_click self.button.clicked.connect(self.on_click) self.show() @pyqtSlot() def on_click(self): textboxValue = self.textbox.text() pre_relation = svm_pre(textboxValue, utils_path='../baseline_svm/utils') # QMessageBox.question(self, "Message", 'Relation: ' + pre_relation[0], # QMessageBox.Ok, QMessageBox.Ok) QMessageBox.about(self, 'Triple', pre_relation[0]) """打印完毕之后清空文本框""" self.textbox.setText('')
class App(QWidget): def __init__(self): super().__init__() self.title = 'PyQt5 textbox' self.left = 10 self.top = 10 self.width = 320 self.height = 200 self.initUI() def initUI(self): self.setWindowTitle(self.title) self.setGeometry(self.left, self.top, self.width, self.height) # create textbox self.textbox = QLineEdit(self) self.textbox.move(20, 20) self.textbox.resize(280, 40) # Create a button in the window self.button = QPushButton('show text', self) self.button.move(20, 80) # connect button to function on_click self.button.clicked.connect(self.on_click) self.show() @pyqtSlot() def on_click(self): with open('/Users/sheldonwong/workspace/github/algo/tool/1.txt', 'r') as f: lines = f.readlines() lines_str = ''.join(lines) self.textbox.setText(lines_str) #textboxValue = self.textbox.text() #QMessageBox.question(self, "Message", 'You typed:' + textboxValue, # QMessageBox.Ok, QMessageBox.Ok) """打印完毕之后清空文本框"""
class App(QWidget): def __init__(self): super().__init__() self.title = 'BAIKE_HOOKER' self.left = 10 self.top = 10 self.width = 320 self.height = 150 self.initUI() def initUI(self): self.setWindowTitle(self.title) self.setGeometry(self.left, self.top, self.width, self.height) # create textbox self.textbox = QLineEdit(self) self.textbox.move(20, 20) self.textbox.resize(280, 30) # create label self.labelFIR = QLabel("EVERY_HOOKER", self) self.labelFIR.move(120, 5) self.labelSEC = QLabel("轻松获取网站的内容到本地", self) self.labelSEC.move(80, 60) # Create a button in the window self.button = QPushButton('START', self) self.button.move(120, 100) # connect button to function on_click self.button.clicked.connect(self.on_click) self.show() @pyqtSlot() def on_click(self): url = self.textbox.text() html2mjo(url)
class Window(QMainWindow): def __init__(self): super().__init__() self.title = "window" self.top = 200 self.left = 200 self.width = 1000 self.height = 800 self.CreatInteraction() self.InitWindow() self.num = 0 self.files_name = [] def InitWindow(self): self.setWindowTitle(self.title) self.setGeometry(self.left, self.top, self.width, self.height) self.show() def CreatInteraction(self): #按键 self.button_load = QPushButton("加载", self) self.button_load.setGeometry(QRect(0, 0, 80, 25)) self.button_load.clicked.connect(self.LoadFile) self.button_load = QPushButton("h", self) self.button_load.setGeometry(QRect(100, 0, 60, 25)) self.button_load.clicked.connect(self.Fileh) self.button_load = QPushButton("j", self) self.button_load.setGeometry(QRect(100, 30, 60, 25)) self.button_load.clicked.connect(self.Filej) self.button_load = QPushButton("k", self) self.button_load.setGeometry(QRect(100, 60, 60, 25)) self.button_load.clicked.connect(self.Filek) self.button_load = QPushButton("l", self) self.button_load.setGeometry(QRect(100, 90, 60, 25)) self.button_load.clicked.connect(self.Filel) self.button_load = QPushButton("跳转", self) self.button_load.setGeometry(QRect(800, 100, 60, 25)) self.button_load.clicked.connect(self.jump) self.press_h = QShortcut("h", self) self.press_j = QShortcut("j", self) self.press_k = QShortcut("k", self) self.press_l = QShortcut("l", self) self.press_h.activated.connect(self.hPart) self.press_j.activated.connect(self.jPart) self.press_k.activated.connect(self.kPart) self.press_l.activated.connect(self.lPart) self.textbox_h = QLineEdit(self) self.textbox_h.move(180, 0) self.textbox_h.resize(400, 25) self.num_h = QLineEdit(self) self.num_h.move(600, 0) self.num_h.resize(80, 25) self.textbox_j = QLineEdit(self) self.textbox_j.move(180, 30) self.textbox_j.resize(400, 25) self.num_j = QLineEdit(self) self.num_j.move(600, 30) self.num_j.resize(80, 25) self.textbox_k = QLineEdit(self) self.textbox_k.move(180, 60) self.textbox_k.resize(400, 25) self.num_k = QLineEdit(self) self.num_k.move(600, 60) self.num_k.resize(80, 25) self.textbox_l = QLineEdit(self) self.textbox_l.move(180, 90) self.textbox_l.resize(400, 25) self.num_l = QLineEdit(self) self.num_l.move(600, 90) self.num_l.resize(80, 25) self.textbox_msg = QLineEdit(self) self.textbox_msg.move(100, 120) self.textbox_msg.resize(500, 100) self.textbox_total = QLineEdit(self) self.textbox_total.setGeometry(QRect(700, 50, 80, 25)) self.textbox_now = QLineEdit(self) self.textbox_now.setGeometry(QRect(700, 100, 80, 25)) self.to_ward = QShortcut("d", self) self.back_ward = QShortcut("a", self) self.to_ward.activated.connect(self.Toward) self.back_ward.activated.connect(self.Backward) # self.shortcut = QShortcut("u", self.Delete) self.plt = pg.PlotWidget(self) self.plt.move(30, 280) self.plt.resize(800, 400) def LoadFile(self): #载入文件 self.directory = QFileDialog.getExistingDirectory(self, "选取文件夹", "./") # 起始路径 self.root = os.path.abspath(os.path.join(self.directory, "..")) for file in os.listdir(self.directory): self.files_name.append(os.path.join(self.directory, file)) self.len = len(self.files_name) self.file_name = os.path.join(self.directory, self.files_name[self.num]) if os.path.exists(self.file_name): self.pltshow(self.file_name) self.textbox_total.setText(str(self.len)) def Fileh(self): self.dir_h = QFileDialog.getExistingDirectory(self, "选取文件夹", self.root) self.textbox_h.setText(str(self.dir_h)) def Filej(self): self.dir_j = QFileDialog.getExistingDirectory(self, "选取文件夹", self.root) self.textbox_j.setText(str(self.dir_j)) def Filek(self): self.dir_k = QFileDialog.getExistingDirectory(self, "选取文件夹", self.root) self.textbox_k.setText(str(self.dir_k)) def Filel(self): self.dir_l = QFileDialog.getExistingDirectory(self, "选取文件夹", self.root) self.textbox_l.setText(str(self.dir_l)) def Toward(self): self.num += 1 if self.num > self.len: self.num = self.len self.file_name = os.path.join(self.directory, self.files_name[self.num]) if os.path.exists(self.file_name): self.pltshow(self.file_name) def Backward(self): self.num -= 1 if self.num < 0: self.num = 0 self.file_name = os.path.join(self.directory, self.files_name[self.num]) if os.path.exists(self.file_name): self.pltshow(self.file_name) def jump(self): self.num = int(self.textbox_now.text()) if os.path.exists(self.file_name): self.pltshow(self.file_name) def hPart(self): if os.path.exists(self.dir_h): shutil.move(self.file_name, self.dir_h) def jPart(self): if os.path.exists(self.dir_j): shutil.move(self.file_name, self.dir_j) def kPart(self): if os.path.exists(self.dir_k): shutil.move(self.file_name, self.dir_k) def lPart(self): if os.path.exists(self.dir_l): shutil.move(self.file_name, self.dir_l) def pltshow(self, path): # self. self.plt.clear() sig = open(path, "rb").read() sig = [i for i in sig if i != 0] sig = np.array(sig[0:12 * int(len(sig) / 12)]) data = sig.reshape(int(len(sig) / 12), 12).T self.plt.setXRange(0, 256, padding=0) self.plt.setYRange(0, 180, padding=0) self.plt.plot(data[10]) self.textbox_now.setText(str(self.num)) try: self.num_h.setText( str( len([ name for name in os.listdir(self.dir_h) if os.path.isfile(os.path.join(self.dir_h, name)) ]))) except: pass try: self.num_j.setText( str( len([ name for name in os.listdir(self.dir_j) if os.path.isfile(os.path.join(self.dir_j, name)) ]))) except: pass try: self.num_k.setText( str( len([ name for name in os.listdir(self.dir_k) if os.path.isfile(os.path.join(self.dir_k, name)) ]))) except: pass try: self.num_l.setText( str( len([ name for name in os.listdir(self.dir_l) if os.path.isfile(os.path.join(self.dir_l, name)) ]))) except: pass
class App(QWidget): def __init__(self): super().__init__() self.title = "WLAN入侵检测" self.left = 10 self.top = 10 self.width = 280 self.height = 200 self.initUI() def initUI(self): self.setWindowTitle(self.title) self.setGeometry(self.left, self.top, self.width, self.height) # 信道 self.label1 = QLabel(self) self.label1.setText("Channel:") self.label1.move(48, 20) self.channel = QLineEdit(self) self.channel.move(110, 20) self.channel.resize(50, 20) self.channel.setText("9") # 时长 self.label2 = QLabel(self) self.label2.setText("Duration(s):") self.label2.move(30, 50) self.duration_time = QLineEdit(self) self.duration_time.move(110, 50) self.duration_time.resize(50, 20) self.duration_time.setText("inf") # 缓存路径 self.label3 = QLabel(self) self.label3.setText("Storage Path:") self.label3.move(18, 80) self.buffer_path = QLineEdit(self) self.buffer_path.move(110, 80) self.buffer_path.resize(150, 20) self.buffer_path.setText("/tmp/capture/") # 启动按钮 self.activate = QPushButton('Activate', self) self.activate.move(50, 130) self.activate.clicked.connect(self.on_click1) # 停止按钮 self.stop = QPushButton('Stop', self) self.stop.move(150, 130) self.stop.clicked.connect(self.on_click2) # 初始化线程 self.cap_thread = threading.Thread() self.ins_thread = threading.Thread() os.popen("airport -z") self.show() def on_click1(self): # 获取参数 channel = self.channel.text() duration_time = self.duration_time.text() if duration_time == "inf" or duration_time == "": duration_time = "99999" buffer_path = self.buffer_path.text() if self.cap_thread.isAlive() or self.ins_thread.isAlive(): print("*** Detection in progress! *** ") else: # Ensure the buffer directory if os.path.exists(buffer_path): for _, _, file_names in os.walk(buffer_path): for file_name in file_names: os.remove(buffer_path + file_name) else: os.makedirs(buffer_path) # 设置线程 self.cap_thread = threading.Thread(target=live_capture, args=(channel, duration_time, buffer_path)) self.ins_thread = threading.Thread(target=inspect_thread, args=(buffer_path, )) # 开始线程 self.cap_thread.start() self.ins_thread.start() def on_click2(self): if self.cap_thread.isAlive() or self.ins_thread.isAlive(): # 杀掉进程 PIDs = os.popen("ps -e | grep 'tshark' | awk '{print $1}'").read() PID = "" for i in range(10): if i < len(PIDs): if not PIDs[i] == '\n': PID = PID + PIDs[i] else: break os.popen("kill -9 " + PID).read() else: print("*** No Detection is on! ***") def closeEvent(self, event): if self.cap_thread.isAlive() or self.ins_thread.isAlive(): # 杀掉进程 PIDs = os.popen("ps -e | grep 'tshark' | awk '{print $1}'").read() PID = "" for i in range(10): if i < len(PIDs): if not PIDs[i] == '\n': PID = PID + PIDs[i] else: break os.popen("kill -9 " + PID) os.popen("ifconfig en0 up")
class BearDetectionWidget(QWidget): def __init__(self): super().__init__() self.mImage = None self.mQImage = QImage() self.mDetectionModel = get_bear_detection_model() self.initUI() def initUI(self): self.setGeometry(200, 100, 600, 600) self.setWindowTitle('Bear Recognizer') self.setWindowIcon(QIcon('icon.jpg')) ## and hint hint = QLabel(self) hint.setText("输入要识别的图片地址") hint.move(10, 20) ##create text box self.textbox = QLineEdit(self) self.textbox.move(20, 50) self.textbox.resize(400, 30) ##add button self.button = QPushButton('添加图片', self) self.button.move(60, 90) self.button.clicked.connect(self.on_load_image) ##add button self.button = QPushButton('识别', self) self.button.move(200, 90) self.button.clicked.connect(self.on_detect_bear) ## and result label self.result_hint = QLabel(self) self.result_hint.setText(" ") self.result_hint.move(350, 100) self.show() def get_cv2image(self, image): cv2_image = cv2.cvtColor(np.array(image), cv2.COLOR_RGB2BGR) cv2_image = cv2.resize(cv2_image, (416, 416), interpolation=cv2.INTER_CUBIC) return cv2_image def get_qimage(self, image): height, width, colors = image.shape bytesPerLine = 3 * width image = QImage(image.data, width, height, bytesPerLine, QImage.Format_RGB888) image = image.rgbSwapped() return image def get_image_from_url(self, url): response = requests.get(url) img = Image.open(BytesIO(response.content)) return img @pyqtSlot() def on_load_image(self): textboxValue = self.textbox.text() try: self.mImage = self.get_image_from_url(textboxValue) cv2_image = self.get_cv2image(self.mImage) self.mQImage = self.get_qimage(cv2_image) self.update() except: QMessageBox.information(self, "错误", "图片加载失败", QMessageBox.Yes) @pyqtSlot() def on_detect_bear(self): if self.mImage is None: QMessageBox.information(self, "错误", "请先加载图片", QMessageBox.Yes) return predictions = self.mDetectionModel.predict_image(self.mImage) predictions.sort(key=lambda k: k['probability'], reverse=True) pred = predictions[0] cv2_image = self.get_cv2image(self.mImage) (x, y, w, h) = [int(i * 416) for i in pred.get('boundingBox').values()] cv2.rectangle(cv2_image, (x, y), (x + w, y + h), (0, 0, 255), 1) hint_text = pred.get('tagName') + ': ' + str(pred.get('probability')) cv2.putText(cv2_image, hint_text, (x, y + min(w, 10)), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 1) self.mQImage = self.get_qimage(cv2_image) #self.result_hint.setText(pred.get('tagName')+': '+str(pred.get('probability'))) self.update() def paintEvent(self, QPaintEvent): painter = QPainter() painter.begin(self) painter.drawImage(10, 150, self.mQImage) painter.end()
class Game(QWidget): def __init__(self): super().__init__() self._flag_1 = False self.media = QtCore.QUrl.fromLocalFile("MP3/music.mp3") content = QtMultimedia.QMediaContent(self.media) self.player = QtMultimedia.QMediaPlayer() self.player.setMedia(content) self.player.setVolume(50) self.initUI() def initUI(self): self.file_number = 2 self._score = 0 self.setMouseTracking(True) self.resize(500, 500) self.center() self.setWindowTitle('Игра') self.main_pic = QLabel(self) self.main_pic.setPixmap( QPixmap(resource_path("PIC/running_rabbit.jpg"))) self.main_pic.resize(500, 500) self.button_start_game = QPushButton("НАЧАТЬ ИГРУ", self) self.button_start_game.resize(140, 50) self.button_start_game.move(70, 300) self.button_start_game.clicked.connect(self.start_game) self.button_edit_map = QPushButton("СОЗДАТЬ КАРТУ", self) self.button_edit_map.resize(140, 50) self.button_edit_map.move(70, 360) self.button_edit_map.clicked.connect(self.edit_map_menu) self.button_exit = QPushButton("ЗАКОНЧИТЬ СЕАНС", self) self.button_exit.resize(140, 50) self.button_exit.move(70, 420) self.button_exit.clicked.connect(self.exit) self.timer_game = QTimer() self.timer_game.timeout.connect(self.updateValues) self.timer_game.start(200) self.setFocusPolicy(Qt.StrongFocus) self.lable_score = QLabel(self) self.lable_score.resize(200, 35) self.lable_score.setFont( QFont("RetroComputer[RUS by Daymarius]", 26, QFont.Bold)) self.lable_score.setVisible(False) self.button_menu = QPushButton("НАЗАД", self) self.button_menu.resize(120, 40) self.button_menu.clicked.connect(self.show_menu) self.button_menu.setVisible(False) self.lable_name = QLabel("ВВЕДИТЕ ВАШЕ ИМЯ:", self) self.lable_name.sizeHint() self.lable_name.setFont( QFont("RetroComputer[RUS by Daymarius]", 10, QFont.Bold)) self.lable_name.move(230, 300) self.input_name = QLineEdit("Без имени", self) self.input_name.resize(200, 20) self.input_name.move(230, 325) self.table_score = QTableWidget(self) self.table_score.resize(200, 120) self.table_score.move(230, 350) def bd_score(self): con = sqlite3.connect(resource_path("DB/score.db")) # Создание курсора cur = con.cursor() # Выполнение запроса и получение всех результатов result = cur.execute( "SELECT * FROM main ORDER BY score DESC;").fetchmany(5) cur.execute("DROP TABLE main") cur.execute("CREATE TABLE main (name STRING, score INTEGER)") for item in result: cur.execute("INSERT INTO main VALUES(?, ?)", (item[0], item[1])) con.commit() # Вывод результатов на экран if result != []: self.table_score.setColumnCount(len(result[0])) self.table_score.setRowCount(0) for i, row in enumerate(result): self.table_score.setRowCount(self.table_score.rowCount() + 1) for j, elem in enumerate(row): item = QTableWidgetItem(str(elem)) self.table_score.setItem(i, j, item) item.setFlags(QtCore.Qt.ItemIsEnabled) self.table_score.setHorizontalHeaderItem( 0, QTableWidgetItem("Имя игрока")) self.table_score.setHorizontalHeaderItem(1, QTableWidgetItem("Счет")) self.table_score.setColumnWidth(0, 127) self.table_score.setColumnWidth(1, 20) con.close() def append_bd_score_and_name(self): con = sqlite3.connect("DB/score.db") # Создание курсора cur = con.cursor() cur.execute("INSERT INTO main VALUES(?, ?)", (self.input_name.text(), self.get_score())) con.commit() self.bd_score() con.close() def get_score(self): return self._score def set_score(self, score): self._score = score def keyPressEvent(self, event): if event.key() == Qt.Key_Right: self.hero.go_right() elif event.key() == Qt.Key_Left: self.hero.go_left() elif event.key() == Qt.Key_Up: self.hero.go_up() elif event.key() == Qt.Key_Down: self.hero.go_down() elif event.key() == Qt.Key_Space: self.hero.go_dig() def keyReleaseEvent(self, QKeyEvent): if self._flag_1 and not QKeyEvent.isAutoRepeat(): self.hero.stop() def edit_map_menu(self): game.setVisible(False) edit_map.create_map() edit_map.show() def exit(self): sys.exit(app.exec()) def center(self): qr = self.frameGeometry() cp = QDesktopWidget().availableGeometry().center() qr.moveCenter(cp) self.move(qr.topLeft()) def reload_game(self): score = self.get_score() lifes = self.hero.get_lifes() self.start_game() self.set_score(score) self.hero.set_lifes(lifes) def start_game(self): self.player.play() self.set_score(0) self.map = Map(resource_path("MAP/" + str(self.file_number) + ".map")) for enemy in self.enemies: enemy.create_labirint() self.button_menu.setVisible(True) self.button_menu.setFocusPolicy(False) self.lable_score.setVisible(True) self.lable_score.move(0, 0) self.button_menu.move(self.map.get_col() * 40 - 120, 0) self.lable_score.setText("00000") sp_0_1 = [] for j in range(self.map.get_row()): for i in range(self.map.get_col()): if type(self.map.get_elem_xy(i, j)) == Empty and ( self.map.get_row() - 1 == j or type(self.map.get_elem_xy( i, j + 1)) in [Stairs, Brick]): sp_0_1.append((i, j)) zerro = Zerro() one = One() for i in range(int(round(len(sp_0_1) * 0.2))): t = randrange(0, len(sp_0_1)) x, y = sp_0_1[t] self.map.set_elem_xy(x, y, choice([zerro, one])) del sp_0_1[t] self.hide_menu() def show_menu(self): self.append_bd_score_and_name() game.player.pause() self.hero.timer.stop() for enemy in self.enemies: enemy.timer.stop() self.timer_game.stop() self.main_pic.show() self.table_score.show() self.input_name.show() self.lable_name.show() self.button_menu.setVisible(False) self.lable_score.setVisible(False) self.button_edit_map.setVisible(True) self.button_exit.setVisible(True) self.button_start_game.setVisible(True) self.resize(500, 500) self.center() self._flag_1 = False def hide_menu(self): game.player.play() self.hero.timer.start(200) for enemy in self.enemies: enemy.timer.start(200) game.timer_game.start(200) self.main_pic.hide() self.table_score.hide() self.input_name.hide() self.lable_name.hide() self.button_menu.setVisible(True) self.lable_score.setVisible(True) self.button_edit_map.setVisible(False) self.button_exit.setVisible(False) self.button_start_game.setVisible(False) self.resize(self.map.get_col() * 40, self.map.get_row() * 40 + 40) self.center() self._flag_1 = True def paintEvent(self, event): qp = QPainter() qp.begin(self) if self._flag_1: for i in range(self.map.get_col()): for j in range(self.map.get_row()): qp.drawPixmap( i * 40, j * 40 + 40, self.map.get_elem_xy( i, j).get_pic()) # рисуем картинками из elem_map qp.drawPixmap(self.hero.get_x() * 40, self.hero.get_y() * 40 + 40, self.hero.get_pic()) for enemy in self.enemies: qp.drawPixmap(enemy.get_x() * 40, enemy.get_y() * 40 + 40, enemy.get_pic()) for i in range(game.hero.get_lifes()): qp.drawPixmap(280 + i * 40, 0, self.hero._pic[self.hero._STOP][0]) txt = "00000" + str(self._score) self.lable_score.setText(txt[len(txt) - 5:len(txt)]) qp.end() def updateValues(self): self.update() def you_lose(self): self.player.pause() self.hero.timer.stop() for enemy in self.enemies: enemy.timer.stop() self.timer_game.stop() if self.hero.get_lifes() > 1: game.player.pause() buttonReply = QMessageBox.question( self, 'ВЫ ПРОИГРАЛИ', "Продолжить игру?", QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes) if buttonReply == QMessageBox.Yes: self.hero.set_lifes(self.hero.get_lifes() - 1) self.reload_game() self.timer_game.start(200) else: self.set_score(0) self.show_menu() else: game.player.pause() buttonReply = QMessageBox.information(self, 'ИГРА ОКОНЧЕНА', "Вы проиграли.") self.append_bd_score_and_name() self.show_menu()
class InputLine(QWidget): HEIGHT = 30 LABEL_WIDTH = 170 INPUT_TEXT_WIDTH = 200 BUTTON_WIDTH = 100 BUTTON_BLOCK_X = 380 ELEMENT_GAP = 5 ERROR_WIDTH = 250 ERROR_X = 595 def __init__(self, parent): super().__init__(parent) self.initUI() def initUI(self): component_stylesheet = """ .QPushButton { font-weight: bold; font-size: 13px; background-color:#E0E0E0; } .QPushButton:pressed { background-color:#CCCCCC; } .QLabel { padding-top: 7px; font-weight: bold; font-size: 14px; } .QLineEdit { font-weight: bold; font-size: 14px; } .QLabel#error { color: red; font-size: 12px; font-style: italic; padding-top: 0px; padding-left: 6px; } """ self.label = QLabel("", self) self.label.setStyleSheet(component_stylesheet) self.label.setAlignment(Qt.AlignRight) self.label.resize(InputLine.LABEL_WIDTH, InputLine.HEIGHT) self.label.move(0, 0) self.text = QLineEdit(self) self.text.setStyleSheet(component_stylesheet) self.text.resize(InputLine.INPUT_TEXT_WIDTH, InputLine.HEIGHT) self.text.move(InputLine.LABEL_WIDTH + InputLine.ELEMENT_GAP, 0) self.ok = QPushButton("OK", self) self.ok.setStyleSheet(component_stylesheet) self.ok.resize(InputLine.BUTTON_WIDTH, InputLine.HEIGHT) self.ok.move(InputLine.BUTTON_BLOCK_X, 0) self.cancel = QPushButton("Cancel", self) self.cancel.setStyleSheet(component_stylesheet) self.cancel.resize(InputLine.BUTTON_WIDTH, InputLine.HEIGHT) self.cancel.move(InputLine.BUTTON_BLOCK_X + InputLine.BUTTON_WIDTH + InputLine.ELEMENT_GAP, 0) self.error = QLabel("", self) self.error.setObjectName("error") self.error.setStyleSheet(component_stylesheet) self.error.resize(InputLine.ERROR_WIDTH, InputLine.HEIGHT) self.error.move(InputLine.ERROR_X, 0) """ listeners which control what happens on ok an cancel button presses """ def addOkListener(self, onOkEvent): self.ok.clicked.connect(onOkEvent) def addCancelListener(self, onCancelEvent): self.cancel.clicked.connect(onCancelEvent) """ utility methods of the widget """ def getText(self): return self.text.text() def setText(self, text): self.text.setText(text) def setLabelText(self, text): self.label.setText(text) def setErrorText(self, text): self.error.setText(text)
class App(QWidget): def __init__(self): super().__init__() self.title = 'SearchExcel ' self.pathTextBox = QLineEdit(self) self.setWindowTitle(self.title) self.pathTextBox.move(20, 20) # create searchTextBox self.searchTextBox = QLineEdit(self) self.searchTextBox.move(20, 80) self.searchTextBox.textChanged.connect(self.onTextChange) # Create a openPathButton in the window self.openPathButton = QPushButton('打开文件夹', self) self.tableWidget = QTableWidget(self) self.tableWidget.setObjectName("tableWidget") self.tableWidget.setColumnCount(5) self.tableWidget.setRowCount(0) for i in range(3): item = QTableWidgetItem() self.tableWidget.setVerticalHeaderItem(i, item) for i in range(5): item = QTableWidgetItem() item.setTextAlignment(Qt.AlignCenter) self.tableWidget.setHorizontalHeaderItem(i, item) self.tableWidget.horizontalHeader().setCascadingSectionResizes(True) item = self.tableWidget.horizontalHeaderItem(0) item.setText(_translate("widget", "文件名")) item = self.tableWidget.horizontalHeaderItem(1) item.setText(_translate("widget", "Sheet")) item = self.tableWidget.horizontalHeaderItem(2) item.setText(_translate("widget", "行")) item = self.tableWidget.horizontalHeaderItem(3) item.setText(_translate("widget", "列")) item = self.tableWidget.horizontalHeaderItem(4) item.setText(_translate("widget", "内容")) self.tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers) # connect openPathButton to function on_click self.openPathButton.clicked.connect(self.on_click) self.showMaximized() @pyqtSlot() def on_click(self): self.pathTextBox.setText( QFileDialog.getExistingDirectory(None, "请选择文件夹路径")) def resizeEvent(self, a0): self.pathTextBox.resize(self.width() * 0.8, 40) self.openPathButton.move(self.width() * 0.85, 20) self.openPathButton.resize(self.width() * 0.1, 40) self.searchTextBox.resize(self.width() - 40, 40) self.tableWidget.setGeometry(20, 180, self.width() - 40, self.height() - 200) self.tableWidget.horizontalHeader().resizeSection( 0, int(self.tableWidget.width() * 0.3)) self.tableWidget.horizontalHeader().resizeSection( 1, int(self.tableWidget.width() * 0.2)) self.tableWidget.horizontalHeader().resizeSection( 2, int(self.tableWidget.width() * 0.05)) self.tableWidget.horizontalHeader().resizeSection( 3, int(self.tableWidget.width() * 0.05)) self.tableWidget.horizontalHeader().resizeSection( 4, int(self.tableWidget.width() * 0.4)) def onTextChange(self): result_list = [] searchText = self.searchTextBox.text() if len(searchText) == 0: self.tableWidget.setRowCount(0) return excel_dir_path = self.pathTextBox.text() file_list = os.listdir(excel_dir_path) if file_list is None: self.tableWidget.setRowCount(0) return for file_name in file_list: if file_name.endswith("xlsx") or file_name.endswith("xls"): excel_file_path = os.path.join(excel_dir_path, file_name) try: excel = xlrd.open_workbook(excel_file_path, encoding_override="utf-8") except IOError: print("open %s failed" % excel_file_path) else: all_sheet = excel.sheet_names() for sheet_name in all_sheet: each_sheet_by_name = excel.sheet_by_name(sheet_name) for i in range(each_sheet_by_name.nrows): for j in range(each_sheet_by_name.ncols): if searchText in str( each_sheet_by_name.row_values(i)[j]): result_list.append( (file_name, sheet_name, i + 1, j + 1, each_sheet_by_name.row_values(i)[j])) self.tableWidget.setRowCount(len(result_list)) for i in range(len(result_list)): for j in range(5): item = QTableWidgetItem() self.tableWidget.setItem(i, j, item) item.setText(_translate("widget", str(result_list[i][j])))
class Register(QWidget): register_ok_sg = pyqtSignal() def __init__(self, parent=None): super(Register, self).__init__(parent) self.desktop = QApplication.desktop() self.screenRect = self.desktop.screenGeometry() self.h = self.screenRect.height() self.w = self.screenRect.width() self.xr = self.w / 930 self.yr = self.h / 640 self.zr = min(self.xr, self.yr) self.top_wi = QWidget(self) self.logo_la = QLabel(self.top_wi) self.ind_wi = QWidget(self) self.register_but = QPushButton(self.ind_wi) self.imp_la = QLabel(self.ind_wi) self.account_le = QLineEdit(self.ind_wi) self.psw_le = QLineEdit(self.ind_wi) self.name_le = QLineEdit(self.ind_wi) self.set_ui() with open('index.qss', 'r') as f: self.setStyleSheet(f.read()) def set_ui(self): self.setWindowTitle('Register') self.setObjectName('register') self.resize(self.w, self.h) self.top_wi.setObjectName('top') self.top_wi.resize(930 * self.xr, 95 * self.yr) self.logo_la.setObjectName('logo') self.logo_la.resize(65 * self.xr, 65 * self.zr) self.logo_la.move(29 * self.xr, 16 * self.yr) effect = QGraphicsDropShadowEffect() effect.setOffset(10, 10) effect.setColor(QColor(0, 0, 0, 80)) effect.setBlurRadius(20) self.ind_wi.setObjectName('login') self.ind_wi.resize(327 * self.xr, 388 * self.yr) self.ind_wi.move(300 * self.xr, 150 * self.yr) self.ind_wi.setGraphicsEffect(effect) self.register_but.setObjectName('button') self.register_but.move(64 * self.xr, 315 * self.yr) self.register_but.resize(202 * self.xr, 45 * self.yr) self.register_but.setText('注册新用户') self.register_but.clicked.connect(self.register) self.imp_la.setObjectName('imp_label') self.imp_la.resize(100 * self.zr, 100 * self.zr) self.imp_la.move(115 * self.xr + 100 * (self.xr - self.zr) / 2, 15 * self.yr) self.imp_la.setStyleSheet('border-radius:{}px;'.format(self.zr * 49)) self.account_le.setObjectName('input') self.account_le.setTextMargins(20, 0, 0, 0) self.account_le.resize(213 * self.xr, 45 * self.yr) self.account_le.move(59 * self.xr, 126 * self.yr) self.account_le.setPlaceholderText('账号') self.psw_le.setObjectName('input') self.psw_le.setTextMargins(20, 0, 0, 0) self.psw_le.resize(213 * self.xr, 45 * self.yr) self.psw_le.move(59 * self.xr, 181 * self.yr) self.psw_le.setPlaceholderText('密码') self.psw_le.setEchoMode(QLineEdit.Password) self.name_le.setObjectName('input') self.name_le.setTextMargins(20, 0, 0, 0) self.name_le.resize(213 * self.xr, 45 * self.yr) self.name_le.move(59 * self.xr, 236 * self.yr) self.name_le.setPlaceholderText('昵称') self.ind_wi.setStyleSheet('#input{border-radius:' + str(self.zr * 20) + 'px;}' + '#button{border-radius:' + str(self.zr * 20) + 'px;' + 'font-size:' + str(int(self.zr * 18)) + 'px;}') def register(self): account_p = self.account_le.text() psw_p = self.psw_le.text() # name_p = self.name_le.text() dic = register(account_p, psw_p) if dic['status'] == 1001: self.account_le.clear() self.psw_le.clear() self.account_le.setStyleSheet('border:4px solid;border-color:red;') self.account_le.setPlaceholderText('账号已存在') elif dic['status'] == 0: self.register_ok_sg.emit() else: self.account_le.clear() self.psw_le.clear() self.account_le.setStyleSheet('border:4px solid;border-color:red;') self.account_le.setPlaceholderText('未知错误')
class MFSSEL_UI(QMainWindow): def __init__(self): super().__init__() # 初始化UI self.initUI() # 创建action self.initAction() self.center() self.setWindowTitle("基于Spark的视频语义检测系统") self.setFixedSize(750, 600) self.__videoList = [] def initUI(self): """ 初始化UI :return: """ # QAction是一个抽象类,可以通过菜单栏,工具栏,或者快捷键实现, # 以下代码实现了带有图标和Exit的菜单的创建,同时设置了执行命令的快捷键以及鼠标悬停在这个菜单上的提示信息 exitAct = QAction(QIcon('exit.ico'), 'Exit', self) exitAct.setShortcut('Ctrl+Q') exitAct.setStatusTip('Press and quit') # 执行此动作时,发射一个triggered信号,这个信号和quit连接,执行相关事件 exitAct.triggered.connect(qApp.quit) # 状态栏 self.statusBar() # tbar = self.addToolBar('Exit') # tbar.addAction(exitAct) # 服务器地址label self.label_serverAddress = QtWidgets.QLabel(self) self.label_serverAddress.setText("服务器地址:") self.label_serverAddress.resize(120, 30) self.label_serverAddress.move(30, 35) # 服务器地址 self.textbox_serverAddress = QLineEdit(self) self.textbox_serverAddress.move(115, 35) # 用户名label self.label_userName = QtWidgets.QLabel(self) self.label_userName.setText("用户名:") # self.label_userName.resize(120, 30) self.label_userName.move(220, 35) # 用户名LineEdit self.textbox_userName = QLineEdit(self) self.textbox_userName.move(275, 35) # 密码label self.label_password = QtWidgets.QLabel(self) self.label_password.setText("密码:") # self.label_userName.resize(120, 30) self.label_password.move(380, 35) # 密码LineEdit self.textbox_password = QLineEdit(self) self.textbox_password.move(420, 35) self.textbox_password.setEchoMode(QLineEdit.Password) # 链接服务器按钮 self.bt_connectServer = QPushButton('连接服服务器', self) self.bt_connectServer.clicked.connect(self.on_click) self.bt_connectServer.move(620, 35) # 菜单栏 self.menubar = self.menuBar() # 打开menu self.menu_openvideos = QtWidgets.QMenu() self.menu_openvideos.setTitle("添加") self.menubar.addMenu(self.menu_openvideos) # 处理menu self.menu_dispose = QtWidgets.QMenu() self.menu_dispose.setTitle("处理") self.menubar.addMenu(self.menu_dispose) # 帮助menu self.menu_help = QtWidgets.QMenu() self.menu_help.setTitle("帮助") self.menubar.addMenu(self.menu_help) # 检测视频文件目录label self.label_videofiledir = QtWidgets.QLabel(self) self.label_videofiledir.setText("待检测视频列表:") self.label_videofiledir.resize(120, 30) self.label_videofiledir.move(380, 60) # 检测视频文件目录 self.treeview_videofiledir = QtWidgets.QTreeView(self) self.treeview_videofiledir.resize(340, 480) self.treeview_videofiledir.setHorizontalScrollBarPolicy( QtCore.Qt.ScrollBarAlwaysOn) self.treeview_videofiledir.setSizeAdjustPolicy( QtWidgets.QTreeView.AdjustToContents) self.treeview_videofiledir.header().setFixedWidth(700) self.model = QtGui.QStandardItemModel() self.model.setHorizontalHeaderItem(0, QtGui.QStandardItem("视频列表")) self.treeview_videofiledir.setModel(self.model) self.treeview_videofiledir.move(380, 90) # 播放视频的线程 # self.playvideothread = pvt.PlayVideoThread() # 双击文件目录连接启动播放视频的线程 self.treeview_videofiledir.doubleClicked.connect( self.startPlayVideoThread) # 视频播放label self.label_videoplay = QtWidgets.QLabel(self) self.label_videoplay.setText("视频播放:") self.label_videoplay.move(30, 60) # 显示视频框 self.picturelabel = QtWidgets.QLabel(self) init_image = QPixmap(QDir.currentPath() + "/no_video.jpg").scaled( 320, 240) self.picturelabel.setPixmap(init_image) self.picturelabel.resize(320, 240) self.picturelabel.move(30, 90) # 显示处理信息label self.label_showmessage = QtWidgets.QLabel(self) self.label_showmessage.setText("处理信息:") self.label_showmessage.move(30, 340) # 显示处理信息框 self.textedit = QtWidgets.QTextEdit(self) self.textedit.setReadOnly(True) self.textedit.resize(320, 200) self.textedit.move(30, 370) def initAction(self): """ 创建action :return: """ # 选取待检测视频menu的Action self.action_openvideos_choosevideos = QtWidgets.QAction( "添加视频到待检测视频列表", self) self.action_openvideos_choosevideos.triggered.connect( self.chooseVideos) self.action_openvideos_choosefolder = QtWidgets.QAction( "添加文件夹到待检测视频列表", self) self.action_openvideos_choosefolder.triggered.connect( self.chooseFolder) self.action_openvideos_clear = QtWidgets.QAction("清空待检测视频列表", self) self.action_openvideos_clear.triggered.connect(self.openVideos_clear) self.menu_openvideos.addAction(self.action_openvideos_choosevideos) self.menu_openvideos.addAction(self.action_openvideos_choosefolder) self.menu_openvideos.addAction(self.action_openvideos_clear) self.menu_openvideos.addSeparator() # 处理menu的Action self.action_keyframe = QtWidgets.QAction("Spark下关键帧提取", self) self.action_keyframe.setEnabled(False) self.action_keyframe.triggered.connect(self.extractKeyFrames) self.action_feature = QtWidgets.QAction("Spark下特征提取", self) self.action_feature.setEnabled(False) self.action_feature.triggered.connect(self.extractFeatures) self.action_trainmodel = QtWidgets.QAction("Spark下训练模型", self) self.action_trainmodel.setEnabled(False) self.action_trainmodel.triggered.connect(self.trainModel) self.action_detect = QtWidgets.QAction("检测视频", self) self.action_detect.triggered.connect(self.detectVideo) self.menu_dispose.addAction(self.action_keyframe) self.menu_dispose.addAction(self.action_feature) self.menu_dispose.addAction(self.action_trainmodel) self.menu_dispose.addAction(self.action_detect) self.menu_dispose.addSeparator() # 帮助menu的Action self.action_lookuphelp = QtWidgets.QAction("帮助", self) self.action_lookuphelp.triggered.connect(self.lookuphelpfile) self.action_about = QtWidgets.QAction("关于", self) self.action_about.triggered.connect(self.lookupaboutfile) self.menu_help.addAction(self.action_lookuphelp) self.menu_help.addAction(self.action_about) self.menu_help.addSeparator() def center(self): """ 控制窗口显示在屏幕中心的方法 :return: """ # 获得窗口 qr = self.frameGeometry() # 获得屏幕中心点 cp = QDesktopWidget().availableGeometry().center() # 显示到屏幕中心 qr.moveCenter(cp) # self.move(qr.topLeft()) self.move(320, 70) def on_click(self): """ 链接服务器按钮点击 :return: """ textbox_serverAddress_Value = self.textbox_serverAddress.text().strip() textbox_userName_Value = self.textbox_userName.text().strip() textbox_password_Value = self.textbox_password.text().strip() if (textbox_serverAddress_Value is "") or len(textbox_serverAddress_Value) == 0: QMessageBox.information(self, "注意", "服务器地址为空!") self.textbox_serverAddress.setFocus() elif (textbox_userName_Value is "") or len(textbox_userName_Value) == 0: QMessageBox.information(self, "注意", "用户名为空!") self.textbox_userName.setFocus() elif (textbox_password_Value is "") or len(textbox_password_Value) == 0: QMessageBox.information(self, "注意", "密码为空!") self.textbox_password.setFocus() try: self.ssh = paramiko.SSHClient() self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) self.ssh.connect(hostname=textbox_serverAddress_Value, username=textbox_userName_Value, password=textbox_password_Value) # self.ssh.connect(hostname=hostname, username=username, password=password) stdin, stdout, stderr = self.ssh.exec_command('who') whoMess = repr(stdout.read().decode()) search = whoMess.find(textbox_userName_Value) if search: info = '服务器连接成功。' self.flag = 1 self.action_trainmodel.setEnabled(True) self.action_keyframe.setEnabled(True) self.action_feature.setEnabled(True) else: info = '服务器连接失败。' self.flag = 2 self.action_trainmodel.setEnabled(False) self.action_keyframe.setEnabled(False) self.action_feature.setEnabled(False) except: info = '服务器连接失败。' self.flag = 2 self.action_trainmodel.setEnabled(False) self.action_keyframe.setEnabled(False) self.action_feature.setEnabled(False) self.textedit.append(info) def chooseVideos(self): """ 选取要检测的视频加入到视频列表中 :return: """ files, filetype = QFileDialog.getOpenFileNames( None, "视频选择", os.path.expanduser("~"), "Video Files (*.avi *.mpg *.mp4)") if files: # 清空model self.openVideos_clear() self.__videoList = files videoItem = QtGui.QStandardItem(os.path.dirname(files[0])) videoItem.setEditable(False) for file in files: videoItemChild = QtGui.QStandardItem(os.path.basename(file)) videoItemChild.setEditable(False) videoItem.appendRow(videoItemChild) self.model.appendRow(videoItem) self.treeview_videofiledir.setModel(self.model) def chooseFolder(self): """ 把文件夹中的视频加入视频列表中 :return: """ directory = QFileDialog.getExistingDirectory(None, "文件夹选择", os.path.expanduser("~")) if os.path.isdir(directory): # 清空model self.openVideos_clear() # 遍历文件夹 for dirpath, dirnames, filenames in os.walk(directory): for filename in filenames: filePath = os.path.join(dirpath, filename) self.__videoList.append(filePath) if filenames: videoItem = QtGui.QStandardItem(dirpath) videoItem.setEditable(False) for filename in filenames: # 获取文件名后缀,通过os.path.splitext(path)分离文件名和扩展名 ext = os.path.splitext(filename)[1] # 将文件名统一转化为小写 ext = ext.lower() if ext == '.avi' or ext == '.mpg' or ext == '.mp4': videoItemChild = QtGui.QStandardItem( os.path.basename(filename)) videoItemChild.setEditable(False) videoItem.appendRow(videoItemChild) self.model.appendRow(videoItem) self.treeview_videofiledir.setModel(self.model) def openVideos_clear(self): """ 清空视频列表 :return: """ self.__videoList.clear() self.model.clear() headerItem = QtGui.QStandardItem("视频列表") headerItem.setEditable(False) self.model.setHorizontalHeaderItem(0, headerItem) self.treeview_videofiledir.setModel(self.model) init_image = QPixmap(QDir.currentPath() + "/no_video.jpg").scaled( 320, 240) self.picturelabel.setPixmap(init_image) def startPlayVideoThread(self): """ 启动播放视频的线程 :return: """ # 获取选中的当前的Index index = self.treeview_videofiledir.selectionModel().currentIndex() # 如果当前Index有父节点,也就是说点击视频文件名 if index.parent().data(): # 视频的路径 videopath = index.parent().data() + os.sep + index.data() self.playCapture = cv2.VideoCapture(videopath) fps = self.playCapture.get(cv2.CAP_PROP_FPS) self.timer = QTimer() self.timer.timeout.connect(self.playVideo) self.timer.start(1000 / fps) # self.playvideothread.setFps(fps) # # 连接播放视频槽 # self.playvideothread.signal.connect(self.playVideo) # self.playvideothread.start() def playVideo(self): """ 播放视频 :return: """ if self.playCapture.isOpened(): ret, frame = self.playCapture.read() if ret: # self.treeview_videofiledir.setDisabled(True) # 获取视频播放label的大小 s = self.picturelabel.rect() # frame重置大小 R_frame = cv2.resize(frame, (QRect.width(s), QRect.height(s))) if R_frame.ndim == 3: R_frame_RGB = cv2.cvtColor(R_frame, cv2.COLOR_BGR2RGB) elif R_frame.ndim == 2: R_frame_RGB = cv2.cvtColor(R_frame, cv2.COLOR_GRAY2BGR) qImage = QtGui.QImage(R_frame_RGB[:], R_frame_RGB.shape[1], R_frame_RGB.shape[0], QtGui.QImage.Format_RGB888) pixmap = QPixmap.fromImage(qImage) self.picturelabel.setPixmap(pixmap) else: # 释放VideoCapture self.playCapture.release() # 关闭线程 self.timer.stop() # self.playvideothread.stop() # self.treeview_videofiledir.setDisabled(False) def extractKeyFrames(self): """ 关键帧提取 :return: """ if os.path.exists("/home/sunbite/MFSSEL/keyframe"): reply = QMessageBox.information(self, "注意", "已有关键帧信息,是否重新提取关键帧?", QMessageBox.Yes | QMessageBox.No) if reply == QMessageBox.Yes: self.startExtractKeyFramesThread() else: pass else: self.startExtractKeyFramesThread() def startExtractKeyFramesThread(self): """ 调用关键帧提取线程 :return: """ self.textedit.append("正在提取关键帧...") self.action_keyframe.setEnabled(False) self.action_feature.setEnabled(False) self.action_trainmodel.setEnabled(False) self.action_detect.setEnabled(False) self.extractKeyFramesThread = ExtractKeyFramesThread( self.receiveLogForExtractKeyFrames, self.ssh) # self.trainmodelthread.signal.connect(self.trainModel) self.extractKeyFramesThread.start() def receiveLogForExtractKeyFrames(self, msg): """ 接受log信息 :param msg: log信息 :return: """ self.textedit.append(msg) self.extractKeyFramesThread.stop() self.action_keyframe.setEnabled(True) self.action_feature.setEnabled(True) self.action_trainmodel.setEnabled(True) self.action_detect.setEnabled(True) def extractFeatures(self): """ 特征提取 :return: """ if os.path.exists("/home/sunbite/MFSSEL/features"): reply = QMessageBox.information(self, "注意", "已有特征信息,是否重新提取特征?", QMessageBox.Yes | QMessageBox.No) if reply == QMessageBox.Yes: if os.path.exists("/home/sunbite/MFSSEL/keyframe"): self.startExtractFeaturesThread() else: QMessageBox.information(self, "注意", "关键帧信息不存在,请重新提取关键帧!") else: pass else: if os.path.exists("/home/sunbite/MFSSEL/keyframe"): self.startExtractFeaturesThread() else: QMessageBox.information(self, "注意", "关键帧信息不存在,请重新提取关键帧!") def startExtractFeaturesThread(self): """ 调用训练model线程 :return: """ self.textedit.append("正在提取特征...") self.action_keyframe.setEnabled(False) self.action_feature.setEnabled(False) self.action_trainmodel.setEnabled(False) self.action_detect.setEnabled(False) self.extractfeaturesThread = ExtractFeaturesThread( self.receiveLogForExtractFeatures, self.ssh) # self.trainmodelthread.signal.connect(self.trainModel) self.extractfeaturesThread.start() def receiveLogForExtractFeatures(self, msg): """ 接受log信息 :param msg: log信息 :return: """ self.textedit.append(msg) self.extractfeaturesThread.stop() self.action_keyframe.setEnabled(True) self.action_feature.setEnabled(True) self.action_trainmodel.setEnabled(True) self.action_detect.setEnabled(True) def trainModel(self): """ 训练model :return: """ if os.path.exists("/home/sunbite/MFSSEL/model"): reply = QMessageBox.information(self, "注意", "已有训练模型,是否重新训练模型?", QMessageBox.Yes | QMessageBox.No) if reply == QMessageBox.Yes: if os.path.exists("/home/sunbite/MFSSEL/keyframe"): if os.path.exists("/home/sunbite/MFSSEL/features"): self.startTrainModelThread() else: QMessageBox.information(self, "注意", "特征信息不存在,请重新提取特征!") else: QMessageBox.information(self, "注意", "关键帧信息不存在,请重新提取关键帧!") else: pass else: if os.path.exists("/home/sunbite/MFSSEL/keyframe"): if os.path.exists("/home/sunbite/MFSSEL/features"): self.startTrainModelThread() else: QMessageBox.information(self, "注意", "特征信息不存在,请重新提取特征!") else: QMessageBox.information(self, "注意", "关键帧信息不存在,请重新提取关键帧!") def startTrainModelThread(self): """ 调用训练model线程 :return: """ self.textedit.append("正在训练模型...") self.action_keyframe.setEnabled(False) self.action_feature.setEnabled(False) self.action_trainmodel.setEnabled(False) self.action_detect.setEnabled(False) self.trainmodelthread = TrainModelThread(self.receiveLogForTrainModel, self.ssh) # self.trainmodelthread.signal.connect(self.trainModel) self.trainmodelthread.start() def receiveLogForTrainModel(self, msg): """ 接受log信息 :param msg: log信息 :return: """ self.textedit.append(msg) self.trainmodelthread.stop() self.action_keyframe.setEnabled(True) self.action_feature.setEnabled(True) self.action_trainmodel.setEnabled(True) self.action_detect.setEnabled(True) def detectVideo(self): """ 检测视频 :return: """ print(len(self.__videoList)) if len(self.__videoList) == 0: reply = QMessageBox.information(self, "注意", "待检测视频为空,请添加待检测视频!", QMessageBox.Ok) else: if os.path.exists("/home/sunbite/MFSSEL/model"): self.startDetectVideoThread() else: QMessageBox.information(self, "注意", "模型不存在,请重新训练模型!") def startDetectVideoThread(self): """ 调用检测线程 :return: """ self.textedit.append("正在检测视频...") self.action_openvideos_choosevideos.setEnabled(False) self.action_openvideos_choosefolder.setEnabled(False) self.action_openvideos_clear.setEnabled(False) self.action_keyframe.setEnabled(False) self.action_feature.setEnabled(False) self.action_trainmodel.setEnabled(False) self.action_detect.setEnabled(False) self.detectvideothread = DetectVideoThread( self.receiveLogForDetectVideo, self.__videoList) # self.trainmodelthread.signal.connect(self.trainModel) self.detectvideothread.start() def receiveLogForDetectVideo(self, msg): """ 接受log信息 :param msg: log信息 :return: """ self.textedit.append(msg) self.detectvideothread.stop() self.action_openvideos_choosevideos.setEnabled(True) self.action_openvideos_choosefolder.setEnabled(True) self.action_openvideos_clear.setEnabled(True) self.action_keyframe.setEnabled(True) self.action_feature.setEnabled(True) self.action_trainmodel.setEnabled(True) self.action_detect.setEnabled(True) def lookuphelpfile(self): """ 使用系统的浏览器打开帮助文档 :return: """ os.system( "firefox /home/sunbite/PycharmProjects/myFirstPoint/help.html") def lookupaboutfile(self): """ 使用系统的浏览器打开关于文档 :return: """ os.system( "firefox /home/sunbite/PycharmProjects/myFirstPoint/about.html")
class UI(QtWidgets.QWidget): """软件的界面布局""" def __init__(self): super().__init__() self.title = '扫货助手V2.3' self.left = 300 self.top = 300 self.width = 700 self.height = 850 self.setWindowTitle(self.title) self.setGeometry(self.left, self.top, self.width, self.height) # 最低价 self.label_min_price = QLabel('最低价', self) self.label_min_price.move(20, 20) self.textbox_min_price = QLineEdit(self) self.textbox_min_price.move(50, 20) self.textbox_min_price.resize(100, 25) # 最高价 self.label_max_price = QLabel('最高价', self) self.label_max_price.move(175, 20) self.textbox_max_price = QLineEdit(self) self.textbox_max_price.move(225, 20) self.textbox_max_price.resize(100, 25) # 浮动 self.label_flow_price = QLabel('浮动价格', self) self.label_flow_price.move(20, 60) self.textbox_flow_price = QLineEdit(self) self.textbox_flow_price.move(85, 60) self.textbox_flow_price.resize(65, 25) # 浮动类型 self.label_flow_type = QLabel('类型', self) self.label_flow_type.move(175, 60) self.select = QComboBox(self) self.select.move(225, 60) self.select.addItems(['增加', '降低']) self.select.resize(60, 20) # 查找次数 self.btn_login = QPushButton('登录', self) self.btn_login.move(50, 100) self.btn_login.resize(75, 30) self.btn_login.clicked.connect(self.login_driver) self.btn_start = QPushButton('开始扫货', self) self.btn_start.move(150, 100) self.btn_start.resize(75, 30) self.btn_start.clicked.connect(self.start_buy) self.btn_stop = QPushButton('停止扫货', self) self.btn_stop.move(250, 100) self.btn_stop.resize(75, 30) self.btn_stop.clicked.connect(self.stop_buy) self.btn_stop = QPushButton('保存设置', self) self.btn_stop.move(350, 100) self.btn_stop.resize(75, 30) self.btn_stop.clicked.connect(self.save_settings) # 日志框 self.label_log = QLabel('购\n买\n记\n录', self) self.label_log.move(23, 150) self.textbox_log = QTextBrowser(self) self.textbox_log.move(50, 150) self.textbox_log.resize(600, 670)
class MyWindow(QMainWindow): def __init__(self): super().__init__() self.title = 'Media Project' self.left = 100 self.top = 100 self.width = 960 self.height = 800 self.res = list(range(14)) self.initUI() def initUI(self): self.pixmap = QPixmap("White.png") self.setWindowTitle(self.title) self.setGeometry(self.left, self.top, self.width, self.height) openFile = QAction(QIcon('open.png'), 'Open', self) openFile.setShortcut('Ctrl+O') openFile.setStatusTip('Open new File') openFile.setFont(QFont("Roman times", 12)) openFile.triggered.connect(self.msg) menubar = self.menuBar() menubar.setFont(QFont("Roman times", 12)) fileMenu = menubar.addMenu('&File') fileMenu.addAction(openFile) lb1 = QLabel("Origin Picture", self) lb1.move(200, 50) lb1.setFont(QFont("Roman times", 14)) lb1.resize(150, 30) lb2 = QLabel("Heatmap", self) lb2.move(200, 390) lb2.setFont(QFont("Roman times", 14)) lb2.resize(150, 30) self.l1 = QLabel(self) self.l1.resize(224, 224) self.l1.move(150, 90) CLASS_NAMES = [ 'Atelectasis', 'Cardiomegaly', 'Effusion', 'Infiltration', 'Mass', 'Nodule', 'Pneumonia', 'Pneumothorax', 'Consolidation', 'Edema', 'Emphysema', 'Fibrosis', 'Pleural_Thickening', 'Hernia' ] lbl1 = QLabel(CLASS_NAMES[0], self) lbl1.move(550, 50) lbl1.setFont(QFont("Roman times", 12)) lbl1.resize(150, 30) self.t1 = QLineEdit(self) self.t1.move(700, 50) self.t1.setFont(QFont("Roman times", 12)) self.t1.resize(120, 30) lbl2 = QLabel(CLASS_NAMES[1], self) lbl2.move(550, 100) lbl2.setFont(QFont("Roman times", 12)) lbl2.resize(150, 30) self.t2 = QLineEdit(self) self.t2.move(700, 100) self.t2.setFont(QFont("Roman times", 12)) self.t2.resize(120, 30) lbl3 = QLabel(CLASS_NAMES[2], self) lbl3.move(550, 150) lbl3.setFont(QFont("Roman times", 12)) lbl3.resize(150, 30) self.t3 = QLineEdit(self) self.t3.move(700, 150) self.t3.setFont(QFont("Roman times", 12)) self.t3.resize(120, 30) lbl4 = QLabel(CLASS_NAMES[3], self) lbl4.move(550, 200) lbl4.setFont(QFont("Roman times", 12)) lbl4.resize(150, 30) self.t4 = QLineEdit(self) self.t4.move(700, 200) self.t4.setFont(QFont("Roman times", 12)) self.t4.resize(120, 30) lbl5 = QLabel(CLASS_NAMES[4], self) lbl5.move(550, 250) lbl5.setFont(QFont("Roman times", 12)) lbl5.resize(150, 30) self.t5 = QLineEdit(self) self.t5.move(700, 250) self.t5.setFont(QFont("Roman times", 12)) self.t5.resize(120, 30) lbl6 = QLabel(CLASS_NAMES[5], self) lbl6.move(550, 300) lbl6.setFont(QFont("Roman times", 12)) lbl6.resize(150, 30) self.t6 = QLineEdit(self) self.t6.move(700, 300) self.t6.setFont(QFont("Roman times", 12)) self.t6.resize(120, 30) lbl7 = QLabel(CLASS_NAMES[6], self) lbl7.move(550, 350) lbl7.setFont(QFont("Roman times", 12)) lbl7.resize(150, 30) self.t7 = QLineEdit(self) self.t7.move(700, 350) self.t7.setFont(QFont("Roman times", 12)) self.t7.resize(120, 30) lbl8 = QLabel(CLASS_NAMES[7], self) lbl8.move(550, 400) lbl8.setFont(QFont("Roman times", 12)) lbl8.resize(150, 30) self.t8 = QLineEdit(self) self.t8.move(700, 400) self.t8.setFont(QFont("Roman times", 12)) self.t8.resize(120, 30) lbl9 = QLabel(CLASS_NAMES[8], self) lbl9.move(550, 450) lbl9.setFont(QFont("Roman times", 12)) lbl9.resize(150, 30) self.t9 = QLineEdit(self) self.t9.move(700, 450) self.t9.setFont(QFont("Roman times", 12)) self.t9.resize(120, 30) lbl10 = QLabel(CLASS_NAMES[9], self) lbl10.move(550, 500) lbl10.setFont(QFont("Roman times", 12)) lbl10.resize(150, 30) self.t10 = QLineEdit(self) self.t10.move(700, 500) self.t10.setFont(QFont("Roman times", 12)) self.t10.resize(120, 30) lbl11 = QLabel(CLASS_NAMES[10], self) lbl11.move(550, 550) lbl11.setFont(QFont("Roman times", 12)) lbl11.resize(150, 30) self.t11 = QLineEdit(self) self.t11.move(700, 550) self.t11.setFont(QFont("Roman times", 12)) self.t11.resize(120, 30) lbl12 = QLabel(CLASS_NAMES[11], self) lbl12.move(550, 600) lbl12.setFont(QFont("Roman times", 12)) lbl12.resize(150, 30) self.t12 = QLineEdit(self) self.t12.move(700, 600) self.t12.setFont(QFont("Roman times", 12)) self.t12.resize(120, 30) lbl13 = QLabel(CLASS_NAMES[12], self) lbl13.move(550, 650) lbl13.setFont(QFont("Roman times", 12)) lbl13.resize(150, 30) self.t13 = QLineEdit(self) self.t13.move(700, 650) self.t13.setFont(QFont("Roman times", 12)) self.t13.resize(120, 30) lbl14 = QLabel(CLASS_NAMES[13], self) lbl14.move(550, 700) lbl14.setFont(QFont("Roman times", 12)) lbl14.resize(150, 30) self.t14 = QLineEdit(self) self.t14.move(700, 700) self.t14.setFont(QFont("Roman times", 12)) self.t14.resize(120, 30) self.l2 = QLabel(self) self.l2.resize(224, 224) self.l2.move(150, 430) self.clear() button1 = QPushButton('Diagnosis', self) button1.move(120, 340) button1.setFont(QFont("Roman times", 12)) button1.clicked.connect(self.diag) button2 = QPushButton('clear', self) button2.move(280, 340) button2.setFont(QFont("Roman times", 12)) button2.clicked.connect(self.clear) self.show() def diag(self): try: res = gen_heatmap(self.file1, heatmap) pixmap2 = QPixmap(heatmap) self.l2.setPixmap(pixmap2) self.t1.setText(str(res[0])) self.t2.setText(str(res[1])) self.t3.setText(str(res[2])) self.t4.setText(str(res[3])) self.t5.setText(str(res[4])) self.t6.setText(str(res[5])) self.t7.setText(str(res[6])) self.t8.setText(str(res[7])) self.t9.setText(str(res[8])) self.t10.setText(str(res[9])) self.t11.setText(str(res[10])) self.t12.setText(str(res[11])) self.t13.setText(str(res[12])) self.t14.setText(str(res[13])) except: print("Please choose a picture as input") def msg(self): fileName1, filetype = QFileDialog.getOpenFileName( self, "选取文件", "./", "All Files (*);;Picture Files (*.jpg)") self.file1 = fileName1 img = cv2.imread(fileName1) img = cv2.resize(img, (224, 224)) cv2.imwrite(fileName1, img) pixmap1 = QPixmap(fileName1) self.l1.setPixmap(pixmap1) def clear(self): self.t1.setText("") self.t2.setText("") self.t3.setText("") self.t4.setText("") self.t5.setText("") self.t6.setText("") self.t7.setText("") self.t8.setText("") self.t9.setText("") self.t10.setText("") self.t11.setText("") self.t12.setText("") self.t13.setText("") self.t14.setText("") self.l1.setPixmap(self.pixmap) self.l2.setPixmap(self.pixmap) self.file1 = ""
# Флажок цифры checkc = QCheckBox('Цифры', window) checkc.move(20, 60) # Поле для ввода целых чисел label = QtWidgets.QLabel('Количество символов', window) label.move(80, 102) spin = QSpinBox(window) spin.move(30, 100) spin.setValue(6) # Однострочное текстовое поле tekst = QLineEdit(window) tekst.resize(150, 25) tekst.move(20, 160) # Кнопка буфер обмена buttonb = QtWidgets.QPushButton("В буфер", window) buttonb.resize(80, 30) buttonb.move(20, 210) buttonb.clicked.connect(on_buff) # Кнопка выход buttone = QtWidgets.QPushButton("Выход", window) buttone.resize(80, 30) buttone.move(240, 210) buttone.clicked.connect(app.quit) # Выход из программы # Старт buttons = QtWidgets.QPushButton("Старт", window)
class Index(QWidget): show_mainindex_sg = pyqtSignal(int, str) show_register_sg = pyqtSignal() def __init__(self, parent=None): super(Index, self).__init__(parent) self.desktop = QApplication.desktop() self.screenRect = self.desktop.screenGeometry() self.h = self.screenRect.height() self.w = self.screenRect.width() self.xr = self.w / 930 self.yr = self.h / 640 self.zr = min(self.xr, self.yr) self.top_wi = QWidget(self) self.logo_la = QLabel(self.top_wi) self.ind_wi = QWidget(self) self.login_but = QPushButton(self.ind_wi) self.joke_but = QPushButton(self.ind_wi) self.register_but = QPushButton(self.ind_wi) self.imp_la = QLabel(self.ind_wi) self.account_le = QLineEdit(self.ind_wi) self.psw_le = QLineEdit(self.ind_wi) self.loading = QLabel(self) self.gif = QMovie('./resource/image/load.gif') self.set_ui() with open('index.qss', 'r') as f: self.setStyleSheet(f.read()) def set_ui(self): self.setWindowTitle('Login') self.setObjectName('index') self.resize(self.w, self.h) self.top_wi.setObjectName('top') self.top_wi.resize(930 * self.xr, 95 * self.yr) self.logo_la.setObjectName('logo') self.logo_la.resize(65 * self.xr, 65 * self.zr) self.logo_la.move(29 * self.xr, 16 * self.yr) effect = QGraphicsDropShadowEffect() effect.setOffset(10, 10) effect.setColor(QColor(0, 0, 0, 80)) effect.setBlurRadius(20) self.ind_wi.setObjectName('login') self.ind_wi.resize(327 * self.xr, 388 * self.yr) self.ind_wi.move(300 * self.xr, 150 * self.yr) self.ind_wi.setGraphicsEffect(effect) self.joke_but.setObjectName('joke') self.joke_but.resize(130 * self.xr, 30 * self.yr) self.joke_but.move(76 * self.xr, 234 * self.yr) self.joke_but.setFlat(True) self.joke_but.setText('忘记密码?我也没办法') self.login_but.setObjectName('button') self.login_but.move(64 * self.xr, 260 * self.yr) self.login_but.resize(202 * self.xr, 45 * self.yr) self.login_but.setText('登陆') self.login_but.clicked.connect(self.login) self.register_but.setObjectName('button') self.register_but.move(64 * self.xr, 315 * self.yr) self.register_but.resize(202 * self.xr, 45 * self.yr) self.register_but.setText('注册') self.register_but.clicked.connect(self.show_register) self.imp_la.setObjectName('imp_label') self.imp_la.resize(100 * self.zr, 100 * self.zr) self.imp_la.move(115 * self.xr + 100 * (self.xr - self.zr) / 2, 15 * self.yr) self.imp_la.setStyleSheet('border-radius:{}px;'.format(self.zr * 49)) self.account_le.setObjectName('input') self.account_le.setTextMargins(20, 0, 0, 0) self.account_le.resize(213 * self.xr, 45 * self.yr) self.account_le.move(59 * self.xr, 126 * self.yr) self.account_le.setPlaceholderText('账号') self.psw_le.setObjectName('input') self.psw_le.setTextMargins(20, 0, 0, 0) self.psw_le.resize(213 * self.xr, 45 * self.yr) self.psw_le.move(59 * self.xr, 181 * self.yr) self.psw_le.setPlaceholderText('密码') self.psw_le.setEchoMode(QLineEdit.Password) self.loading.setObjectName('load') self.loading.resize(self.xr * 150, self.yr * 150) self.loading.move(self.xr * 760, self.yr * 500) self.loading.setScaledContents(True) self.loading.setMovie(self.gif) self.gif.start() self.ind_wi.setStyleSheet('#input{border-radius:' + str(self.zr * 20) + 'px;}' + '#button{border-radius:' + str( self.zr * 20) + 'px;' + 'font-size:' + str(int(self.zr * 18)) + 'px;}') def login(self): account_p = self.account_le.text() psw_p = self.psw_le.text() dic = login(account_p, psw_p) if dic['status'] == 0: self.show_mainindex_sg.emit(dic['data']['user_id'], dic['data']['token']) elif dic['status'] == 1: self.account_le.clear() self.psw_le.clear() self.account_le.setStyleSheet('border:4px solid;border-color:red;') self.account_le.setPlaceholderText('网络超时') else: self.account_le.clear() self.psw_le.clear() self.account_le.setStyleSheet('border:4px solid;border-color:red;') self.account_le.setPlaceholderText('账号不存在或密码错误') def show_register(self): self.show_register_sg.emit()
class EditMap(QWidget): # класс для создания карты def __init__(self): self._sp_map = [] self._elem_map = [] self._activ_pic = 0 self._mouse_x = 0 self._mouse_y = 0 self._flag_1 = False self._flag_2 = True self._col = 14 self._row = 14 super().__init__() self.initUI() def initUI(self): self.setWindowFlags(Qt.Window | Qt.WindowTitleHint | Qt.CustomizeWindowHint) # self.setMouseTracking(True) # отслеживаем положение мыши self.resize(200, 100) # задаем размер окна с параметрами размеров карты self.center() # отцентровываем окно относительно экрана self.setWindowTitle('Редактор карты') self.input_col = QLineEdit(str(self._col), self) # создаем строку для ввода x self.input_col.resize(50, 25) # задаем размер строки для ввода x self.input_col.move( 30, 0 ) # задаем положение строки для ввода x в окне с параметрами размеров карты self.input_row = QLineEdit(str(self._row), self) # создаем строку для ввода y self.input_row.resize(50, 25) # задаем размер строки для ввода y self.input_row.move( 120, 0 ) # задаем положение строки для ввода y в окне с параметрами размеров карты self.button_new_map = QPushButton( "СОЗДАТЬ КАРТУ", self) # создаем кнопку "СОЗДАТЬ КАРТУ" self.button_new_map.resize(140, 50) # задаем размер кнопки "СОЗДАТЬ КАРТУ" self.button_new_map.move( 30, 50 ) # задаем положение кнопки "СОЗДАТЬ КАРТУ" в окне с параметрами размеров карты self.button_new_map.clicked.connect( self.new_map) # ждем событие от кнопки "СОЗДАТЬ КАРТУ" self.button_create = QPushButton("СОЗДАТЬ", self) # создаем кнопку "СОЗДАТЬ" self.button_create.resize(70, 30) # задаем размер кнопки "СОЗДАТЬ" self.button_create.setVisible(False) # прячем кнопку "СОЗДАТЬ" self.button_create.clicked.connect( self.create_map) # ждем событие от кнопки "СОЗДАТЬ" self.button_open = QPushButton("ОТКРЫТЬ", self) # создаем кнопку "ОТКРЫТЬ" self.button_open.resize(70, 30) # задаем размер кнопки "ОТКРЫТЬ" self.button_open.setVisible(False) # прячем кнопку "ОТКРЫТЬ" self.button_open.clicked.connect( self.open_map) # ждем событие от кнопки "ОТКРЫТЬ" self.button_save = QPushButton('СОХРАНИТЬ', self) # создаем кнопку "СОХРАНИТЬ" self.button_save.resize(70, 30) # задаем размер кнопки "СОХРАНИТЬ" self.button_save.setVisible(False) # прячем кнопку "СОХРАНИТЬ" self.button_save.clicked.connect( self.save_map) # ждем событие от кнопки "СОХРАНИТЬ" self.button_back = QPushButton("НАЗАД", self) # создаем кнопку "НАЗАД" self.button_back.resize(70, 30) # задаем размер кнопки "НАЗАД" self.button_back.setVisible(False) # прячем кнопку "НАЗАД" self.button_back.clicked.connect( self.close) # ждем событие от кнопки "НАЗАД" self.timer_edit_map = QTimer() self.timer_edit_map.timeout.connect(self.updateValues) self.timer_edit_map.start(200) def new_map(self): # метод класса Edit_Map, новая карта if (not self.input_col.text().isdigit() or not self.input_row.text().isdigit()) or \ (int(self.input_col.text()) < 14 or int(self.input_row.text()) < 14): # проверяем значения x, y. Если не числа, то выводим окно ошибки msg = QMessageBox() msg.setIcon(QMessageBox.Critical) msg.setText("Error") # текст окна msg msg.setWindowTitle("Error") # название окна msg msg.exec_() return self._col = int(self.input_col.text()) # запоминаем новое значение x self._row = int(self.input_row.text()) # запоминаем новое значение y self._sp_map = [[0 for i in range(self._col)] for j in range(self._row) ] # создаем список 0 по размерам x, y self.input_col.setVisible(False) # прячем строку для ввода x self.input_row.setVisible(False) # прячем строку для ввода y self.button_new_map.setVisible(False) # прячем кнопку "СОЗДАТЬ КАРТУ" edit_map.move_button( ) # Расширяем окно и меняем положение кнопок "ОТКРЫТЬ", "НАЗАД", "СОЗДАТЬ", "СОХРАНИТЬ" self.button_back.setVisible(True) # показываем кнопку "НАЗАД" self.button_save.setVisible(True) # показываем кнопку "СОХРАНИТЬ" self.button_open.setVisible(True) # показываем кнопку "ОТКРЫТЬ" self.button_create.setVisible(True) # показываем кнопку "СОЗДАТЬ" self.center() # отцентровываем окно относительно экрана for i in range( PIC ): # записываем в elem_map изображения из которых будет состоять карта self._elem_map.append(QPixmap()) self._elem_map[i].load(resource_path("PIC/" + str(i) + "_0.png")) self._flag_1 = True def center(self): # функция отцентровывает окно относительно окна qr = self.frameGeometry() cp = QDesktopWidget().availableGeometry().center() qr.moveCenter(cp) self.move(qr.topLeft()) def paintEvent(self, event): if self._flag_1: qp = QPainter() qp.begin(self) qp.setBrush(QColor(255, 237, 0)) # задаем желтый цвет для рамки выбора qp.drawRect(self._col * 40 + 15, self._activ_pic * 50, 50, 50) # задаем положение и размер рамки выбора for i in range(self._col): for j in range(self._row): qp.setBrush(QColor(50, 50, 50)) qp.drawRect(i * 40, j * 40, 40, 40) qp.drawPixmap(i * 40, j * 40, self._elem_map[ self._sp_map[j][i]]) # рисуем картинками из elem_map for i in range(PIC): qp.drawPixmap(self._col * 40 + 20, i * 50 + 5, self._elem_map[i]) if self._mouse_x < self._col * 40 and self._mouse_y < self._row * 40: qp.drawPixmap(self._mouse_x - 30, self._mouse_y - 30, self._elem_map[self._activ_pic]) qp.end() def mousePressEvent(self, event): if event.button() == Qt.LeftButton: if self._mouse_x < self._col * 40 and self._mouse_y < self._row * 40: self._sp_map[self._mouse_y // 40][self._mouse_x // 40] = self._activ_pic for i in range(PIC): if self._col * 40 + 20 < self._mouse_x < self._col * 40 + 80 and \ i * 50 + 5 < self._mouse_y < i * 50 + 65: self._activ_pic = i break def mouseMoveEvent(self, event): self._mouse_x = event.x() self._mouse_y = event.y() def create_map(self): self.button_create.setVisible(False) self.button_open.setVisible(False) self.button_save.setVisible(False) self.button_back.setVisible(False) self._flag_1 = False self.input_col.setVisible(True) self.input_row.setVisible(True) self.button_new_map.setVisible(True) self.resize(200, 100) self.center() def save_map(self): stroka = '' for j in range(self._row): for i in range(self._col): stroka += str(self._sp_map[j][i]) stroka += '\n' file_save_map = QFileDialog.getSaveFileName(self, filter='*.map')[0] if file_save_map != '': f = open(file_save_map, 'w', encoding="utf8") with f: f.write(stroka[:-1]) self._flag_2 = False f.close() def open_map(self): file_save_map = QFileDialog.getOpenFileName(self, filter='*.map')[0] f = open(file_save_map, encoding="utf8") with f: old_map = f.readlines() f.close() self._row = len(old_map) self._col = len(old_map[0]) - 1 self._sp_map = [] for j in range(self._row): self._sp_map.append([]) for i in range(self._col): self._sp_map[j].append(int(old_map[j][i])) edit_map.move_button() self.center() def close(self): if self._flag_2: result = QMessageBox.question(self, "ПРЕДУПРЕЖДЕНИЕ!", "Сохранить карту?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No) if result == QMessageBox.Yes: edit_map.save_map() self.setVisible(False) game.setVisible(True) def updateValues(self): self.update() def move_button(self): self.resize(self._col * 40 + 100, self._row * 40) # расширяем окно по параметрам x, y, добавляем 100 по х для elem_map self.button_back.move(self._col * 40 + 15, self._row * 40 - 30) # задаем положение кнопки "НАЗАД" self.button_save.move(self._col * 40 + 15, self._row * 40 - 60) # задаем положение кнопки "СОХРАНИТЬ" self.button_open.move(self._col * 40 + 15, self._row * 40 - 90) # задаем положение кнопки "ОТКРЫТЬ" self.button_create.move(self._col * 40 + 15, self._row * 40 - 120) # задаем положение кнопки "СОЗДАТЬ"
class MainWindow(QMainWindow): # 求解完成信号 done1Signal = pyqtSignal(str) done2Signal = pyqtSignal(str) def __init__(self): super().__init__() # 移动两根火柴和移动一根火柴的按钮 self.twobtn = QPushButton(self) self.onebtn = QPushButton(self) # 文本输入框以及提示字符,接受输入的等式 self.tip1 = QLabel(self) self.facin1 = QLineEdit(self) self.opin = QLineEdit(self) self.tipop = QLabel(self) self.facin2 = QLineEdit(self) self.tip2 = QLabel(self) self.ansin = QLineEdit(self) self.equaop = QLabel(self) self.tipans = QLabel(self) self.toolbar = QToolBar() # 数码管显示,由于算符无法使用故使用QLabel代替 self.lcd1 = QLCDNumber(self) self.lcd2 = QLCDNumber(self) self.lcd3 = QLCDNumber(self) self.lcd1.setDigitCount(2) self.lcd2.setDigitCount(2) self.lcd3.setDigitCount(2) self.lcd1.setMode(QLCDNumber.Dec) self.lcd2.setMode(QLCDNumber.Dec) self.lcd3.setMode(QLCDNumber.Dec) self.lcd1.setSegmentStyle(QLCDNumber.Flat) self.lcd1.setStyleSheet("border: 2px solid black; color: green; background: silver;") self.lcd2.setSegmentStyle(QLCDNumber.Flat) self.lcd2.setStyleSheet("border: 2px solid black; color: green; background: silver;") self.lcd3.setSegmentStyle(QLCDNumber.Flat) self.lcd3.setStyleSheet("border: 2px solid black; color: green; background: silver;") self.lcdop = QLabel(self) self.lcdeq = QLabel(self) # 上翻,下翻展示 self.last = QPushButton(self) self.next = QPushButton(self) # 提示信息,提示是否有解,有解还将显示难度系数 self.tips = QTextBrowser(self) # 程序名及版本号 self.version = 'SmartMatch_v1.1.18' # 帮助子窗口 self.help = HelpWindow() # 等式库子窗口 self.lib = LibraryWindow() # 移动一根所有变化的状态空间 self.closed1 = [] # 移动两根所有变化的状态空间 self.closed2 = [] # 等式列表 self.showlist = [] # 是否可保存 self.allowed = 0 # 等式列表中当前的等式序号 self.now = 0 # 输入为等式的标记 self.initeq = 0 # 状态栏 self.status = self.statusBar() self.init_ui() def init_ui(self): # 两个列表存放搜索结果 # 默认使用了我的桌面分辨率大小的标准尺寸 width = 1440 height = 900 x = width / 4 y = height / 4 w = width / 2 h = height / 2 # 创建全屏主窗口 self.setGeometry(x, y, w, h) self.setWindowTitle(self.version) self.setWindowIcon(QIcon("../images/icon.jpg")) #设置主窗口背景 palette = QPalette() palette.setBrush(self.backgroundRole(), QBrush(QPixmap('../images/background.png'))) self.setPalette(palette) # 进入后的提示信息 self.status.showMessage("欢迎") # 创建工具栏 self.addToolBar(self.toolbar) self.facin1.move(w / 6, h / 4) self.facin1.resize(w / 12, h / 12) self.facin1.setMaxLength(2) self.facin1.setFont(QFont('Roman times', 20, QFont.DemiBold)) self.facin1.setAlignment(Qt.AlignCenter) self.tip1.move(w / 6, h / 6) self.tip1.resize(w / 12, h / 12) self.tip1.setText('Number1:') self.tip1.setFont(QFont('Roman times', 12, QFont.DemiBold)) self.tip1.setAlignment(Qt.AlignCenter) self.opin.move(w/3, h / 4) self.opin.resize(w / 24, h / 12) self.opin.setMaxLength(1) self.opin.setFont(QFont('Roman times', 20, QFont.DemiBold)) self.opin.setAlignment(Qt.AlignCenter) self.tipop.move(5*w/16, h / 6) self.tipop.resize(w / 12, h / 12) self.tipop.setText('Operator:') self.tipop.setFont(QFont('Roman times', 12, QFont.DemiBold)) self.tipop.setAlignment(Qt.AlignCenter) self.facin2.move(11*w/24, h / 4) self.facin2.resize(w / 12, h / 12) self.facin2.setMaxLength(2) self.facin2.setFont(QFont('Roman times', 20, QFont.DemiBold)) self.facin2.setAlignment(Qt.AlignCenter) self.tip2.move(11*w/24, h / 6) self.tip2.resize(w / 12, h / 12) self.tip2.setText('Number2:') self.tip2.setFont(QFont('Roman times', 12, QFont.DemiBold)) self.tip2.setAlignment(Qt.AlignCenter) self.equaop.move(5*w/8, h / 4) self.equaop.resize(w / 24, h / 12) self.equaop.setText('=') self.equaop.setFont(QFont('Roman time2', 20, QFont.DemiBold)) self.equaop.setAlignment(Qt.AlignCenter) self.ansin.move(3*w/4, h / 4) self.ansin.resize(w / 12, h / 12) self.ansin.setMaxLength(2) self.ansin.setFont(QFont('Roman times', 20, QFont.DemiBold)) self.ansin.setAlignment(Qt.AlignCenter) self.tipans.move(3*w/4, h / 6) self.tipans.resize(w / 12, h / 12) self.tipans.setText('Answer:') self.tipans.setFont(QFont('Roman times', 12, QFont.DemiBold)) self.tipans.setAlignment(Qt.AlignCenter) # 移动一根火柴按钮 self.onebtn.move(w / 3, 3 * h / 8) self.onebtn.resize(w / 3, h / 16) self.onebtn.setText('搜索只移动一根火柴的结果') self.onebtn.setStatusTip('开始搜索只移动一根火柴的所有结果') self.onebtn.clicked.connect(lambda: self.startSearch(1)) # 移动两根火柴按钮 self.twobtn.move(w / 3, 7 * h / 16) self.twobtn.resize(w / 3, h / 16) self.twobtn.setText('搜索只移动两根火柴的结果') self.twobtn.setStatusTip('开始搜索只移动两根火柴的所有结果') self.twobtn.clicked.connect(lambda: self.startSearch(2)) # LCD显示摆放 self.lcd1.move(w/6, 7*h/12) self.lcd1.resize(w/12, h/8) self.lcd2.move(11*w/24, 7*h/12) self.lcd2.resize(w/12, h/8) self.lcd3.move(3*w/4, 7*h/12) self.lcd3.resize(w/12, h/8) self.lcdeq.move(5*w/8, 7*h/12) self.lcdeq.resize(w/24, h/8) self.lcdeq.setText('=') self.lcdeq.setStyleSheet("font:30pt;border-width: 2px;border-style: solid;border-color: rgb(0, 0, 0);" "background:silver;color: green;") self.lcdeq.setAlignment(Qt.AlignCenter) self.lcdop.move(w/3, 7*h/12) self.lcdop.resize(w/24, h/8) self.lcdop.setStyleSheet("font:30pt;border-width: 2px;border-style: solid;border-color: rgb(0, 0, 0);" "background:silver;color: green;") self.lcdop.setAlignment(Qt.AlignCenter) # 状态信息显示 self.tips.move(w/6, 3*h/4) self.tips.resize(2*w/3, h/10) self.tips.setStyleSheet("background:white;font:12pt") # 上翻下翻 self.last.move(w/4, 17*h/20) self.last.resize(w/8, h/18) self.last.setText('上一个') self.last.setStatusTip('查看上一个可行解') self.last.clicked.connect(lambda: self.changeShow(1)) self.next.move(5*w/8, 17*h/20) self.next.resize(w/8, h/18) self.next.setText('下一个') self.next.setStatusTip('查看下一个可行解') self.next.clicked.connect(lambda: self.changeShow(2)) # 退出动作 exitAct = QAction(QIcon('../images/exit.png'), '&Exit', self) # mac系统下的快捷键 exitAct.setShortcut('command+Q') exitAct.setStatusTip('退出') exitAct.setToolTip('快捷键:command+Q') exitAct.triggered.connect(lambda: self.sureClose()) # 移动一根火柴动作 start1Act = QAction(QIcon('../images/start1.png'), '&Start1', self) start1Act.setShortcut('command+W') start1Act.setToolTip('快捷键:command+W') start1Act.setStatusTip('开始搜索只移动一根火柴的所有结果') start1Act.triggered.connect(lambda: self.startSearch(1)) # 移动两根火柴动作 start2Act = QAction(QIcon('../images/start2.png'), '&Start2', self) start2Act.setShortcut('command+E') start2Act.setToolTip('快捷键:command+E') start2Act.setStatusTip('开始搜索只移动两根火柴的所有结果') start2Act.triggered.connect(lambda: self.startSearch(2)) # 从库中选择等式动作 openLib = QAction(QIcon('../images/lib.png'), '&Library', self) openLib.setShortcut('command+R') openLib.setToolTip('快捷键:command+R') openLib.setStatusTip('打开已有等式库') openLib.triggered.connect(lambda: self.openLibrary()) # 打开帮助和信息界面 openHelp = QAction(QIcon('../images/help.png'), '&Help', self) openHelp.setShortcut('command+A') openHelp.setToolTip('快捷键:command+A') openHelp.setStatusTip('打开帮助界面') openHelp.triggered.connect(lambda: self.openHelp()) # 保存可解等式动作 saveEquation = QAction(QIcon('../images/save.png'), '&Save', self) saveEquation.setShortcut('command+S') saveEquation.setToolTip('快捷键:command+S') saveEquation.setShortcut('保存可解的等式') saveEquation.setStatusTip('保存当前的可解等式') saveEquation.triggered.connect(lambda: self.saveEquation()) # 清除输入和工作区动作 clearAll = QAction(QIcon('../images/clear.png'), 'Clear', self) clearAll.setShortcut('command+C') clearAll.setToolTip('快捷键:command+C') clearAll.setShortcut('清除输入及变量') clearAll.setStatusTip('清除输入及变量') clearAll.triggered.connect(lambda: self.clearAction()) self.toolbar.addAction(start1Act) self.toolbar.addAction(start2Act) self.toolbar.addAction(clearAll) self.toolbar.addAction(openLib) self.toolbar.addAction(saveEquation) self.toolbar.addAction(openHelp) self.toolbar.addAction(exitAct) # 信号和槽连接 self.done1Signal.connect(self.getDone1) self.done2Signal.connect(self.getDone2) # 主功能函数,移动一根或两根全搜索 def startSearch(self, num): self.varClear() self.lcdClear() common = '请确保{}方格内输入{}。' if self.facin1.text() == '': warn = QMessageBox.about(self, '错误提示', common.format('Number1', '数字')) self.status.showMessage('空输入错误') elif self.facin2.text() == '': warn = QMessageBox.about(self, '错误提示', common.format('Number2', '数字')) self.status.showMessage('空输入错误') elif self.ansin.text() == '': warn = QMessageBox.about(self, '错误提示', common.format('Answer', '数字')) self.status.showMessage('空输入错误') elif self.opin.text() == '': warn = QMessageBox.about(self, '错误提示', common.format('Operator', '"+", "-"或"*"号')) self.status.showMessage('空输入错误') else: try: fac1 = str(self.facin1.text()) for x in range(0, len(fac1)): int(fac1[x]) fac2 = str(self.facin2.text()) for x in range(0, len(fac2)): int(fac2[x]) ans = str(self.ansin.text()) for x in range(0, len(ans)): int(ans[x]) except ValueError: warn = QMessageBox.about(self, '类型错误', common.format('Number1, Nubmber2和Answer', '仅为阿拉伯数字')) self.status.showMessage('输入类型错误') else: fac1 = str(self.facin1.text()) fac2 = str(self.facin2.text()) op = str(self.opin.text()) ans = str(self.ansin.text()) if not(op == '+' or op == '-' or op == '*'): warn = QMessageBox.about(self, '类型错误', common.format('Operator', '"+", "-"或"*"号')) self.status.showMessage('输入类型错误') else: base = MatchEquation(fac1, fac2, ans, op) if num == 1: self.closed1 = onePerop(base) self.done1Signal.emit('Done') elif num == 2: self.closed2 = twoPerop(base) self.done2Signal.emit('Done') self.status.showMessage('完成') # 打开等式库子窗口,接收选择等式 def openLibrary(self): self.lib.show() self.lib.equationSignal.connect(self.getLibequation) # 打开帮助界面子窗口 def openHelp(self): self.help.show() # 接收等式库子窗口的信号 def getLibequation(self, connect): temp = '' for x in range(0, len(connect)): if connect[x] == '+' or connect[x] == '-' or connect[x] == '*': self.opin.setText(connect[x]) self.facin1.setText(temp) temp = '' elif connect[x] == '=': self.facin2.setText(temp) temp = '' else: temp = temp + connect[x] self.ansin.setText(temp) # 接受对移动一根火柴问题求解完成的信号 def getDone1(self, connect): ansNum = 0 for equation in self.closed1: if equation.equal == True: ansNum = ansNum + 1 self.showlist.append(equation) if ansNum == 0 or (ansNum == 1 and self.closed1[0] == self.showlist[0]): self.tips.setText('很抱歉,该等式通过移动一根火柴无解。') elif ansNum > 1 and self.closed1[0] == self.showlist[0]: self.allowed = 1 self.initeq = 1 self.now = self.now + 1 info1 = '该问题是将等式变为新的等式问题, 有{}种新等式' info2 = '该问题的难度系数为{:.2f}' self.tips.setText(info1.format(ansNum - 1) + '<br>' + info2.format(len(self.closed1) / (ansNum - 1))) self.lcd1.display(self.showlist[self.now].factor1.tostr()) self.lcd2.display(self.showlist[self.now].factor2.tostr()) self.lcd3.display(self.showlist[self.now].answer.tostr()) self.lcdop.setText(self.showlist[self.now].operator.tostr()) else: self.allowed = 1 info1 = '通过移动一根火柴使等式成立,有{}种可行的解法' info2 = '该问题的难度系数为{:.2f}' self.tips.setText(info1.format(ansNum)+'<br>'+info2.format(len(self.closed1) / ansNum)) self.lcd1.display(self.showlist[self.now].factor1.tostr()) self.lcd2.display(self.showlist[self.now].factor2.tostr()) self.lcd3.display(self.showlist[self.now].answer.tostr()) self.lcdop.setText(self.showlist[self.now].operator.tostr()) # 接受对移动两根火柴问题求解完成的信号 def getDone2(self, connect): ansNum = 0 for equation in self.closed2: if equation.equal == True: ansNum = ansNum + 1 self.showlist.append(equation) if ansNum == 0 or (ansNum == 1 and self.closed2[0] == self.showlist[0]): self.tips.setText('很抱歉,该等式通过移动两根火柴无解。') elif ansNum > 1 and self.closed2[0] == self.showlist[0]: self.allowed = 2 self.initeq = 1 self.now = self.now + 1 info1 = '该问题是将等式变为新的等式问题, 有{}种新等式' info2 = '该问题的难度系数为{:.2f}' self.tips.setText(info1.format(ansNum - 1) + '<br>' + info2.format(len(self.closed2) / (ansNum - 1))) self.lcd1.display(self.showlist[self.now].factor1.tostr()) self.lcd2.display(self.showlist[self.now].factor2.tostr()) self.lcd3.display(self.showlist[self.now].answer.tostr()) self.lcdop.setText(self.showlist[self.now].operator.tostr()) else: self.allowed = 2 info1 = '通过移动两根火柴使等式成立,有{}种可行的解法' info2 = '该问题的难度系数为{:.2f}' self.tips.setText(info1.format(ansNum) + '<br>' + info2.format(len(self.closed2)/ansNum)) self.lcd1.display(self.showlist[self.now].factor1.tostr()) self.lcd2.display(self.showlist[self.now].factor2.tostr()) self.lcd3.display(self.showlist[self.now].answer.tostr()) self.lcdop.setText(self.showlist[self.now].operator.tostr()) # 接受上下翻信号 def changeShow(self, flag): if flag == 1: if self.now == 0 or (self.initeq == 1 and self.now == 1): self.status.showMessage('已经是第一个结果') else: self.now = self.now - 1 elif flag == 2: if self.now + 1 == len(self.showlist): self.status.showMessage('已经是最后一个结果') else: self.now = self.now + 1 if len(self.showlist) > 0: self.lcd1.display(self.showlist[self.now].factor1.tostr()) self.lcd2.display(self.showlist[self.now].factor2.tostr()) self.lcd3.display(self.showlist[self.now].answer.tostr()) self.lcdop.setText(self.showlist[self.now].operator.tostr()) else: self.status.showMessage('您还未输入并求解问题') # 保存可行等式 def saveEquation(self): if len(self.showlist) > 0: aim = '' eq = '' flag = 0 if self.allowed == 1: aim = (self.closed1[0].factor1.tostr() + ';' + self.closed1[0].factor2.tostr() + ';' + self.closed1[0].answer.tostr() + ';' + self.closed1[0].operator.tostr() + ';\n') eq = (self.closed1[0].factor1.tostr() + self.closed1[0].operator.tostr() + self.closed1[0].factor2.tostr() + '=' + self.closed1[0].answer.tostr()) elif self.allowed == 2: aim = (self.closed2[0].factor1.tostr() + ';' + self.closed2[0].factor2.tostr() + ';' + self.closed2[0].answer.tostr() + ';' + self.closed2[0].operator.tostr() + ';\n') eq = (self.closed2[0].factor1.tostr() + self.closed2[0].operator.tostr() + self.closed2[0].factor2.tostr() + '=' + self.closed2[0].answer.tostr()) else: warn = QMessageBox.about(self, '无法保存', '抱歉,不可解等式无法保存!') flag = 1 lib = open('../data/library.txt', 'r+') equations = lib.readlines() for equation in equations: if aim == equation: warn = QMessageBox.about(self, '当前等式已存在', '感谢您的贡献!但您要添加的等式已在库中。') flag = 1 break if flag == 0: lib.writelines(aim) # 刷新等式库 self.lib.combobox.addItem(eq) lib.close() else: warn = QMessageBox.about(self, '无法保存', '抱歉,未被求解并证明可解的等式无法保存!') # 清空lcd显示 def lcdClear(self): self.lcd1.display('') self.lcd2.display('') self.lcd3.display('') self.lcdop.setText('') self.tips.setText('') # 清空所有需保存的变量 def varClear(self): self.closed1.clear() self.closed2.clear() self.showlist.clear() self.now = 0 self.allowed = 0 self.initeq = 0 # 清除输入及变量 def clearAction(self): self.facin1.clear() self.facin2.clear() self.opin.clear() self.ansin.clear() self.lcdClear() self.varClear() # 重写关闭函数 def closeEvent(self, QCloseEvent): reply = QMessageBox.question(self, '退出程序', "确认要退出吗?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No) if reply == QMessageBox.Yes: QCloseEvent.accept() else: QCloseEvent.ignore() # 关闭窗口确认 def sureClose(self): reply = QMessageBox.question(self, '退出程序', "确认要退出吗?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No) if reply == QMessageBox.Yes: qApp.quit()
class Search(QWidget): search_sg = pyqtSignal(dict) back_sg = pyqtSignal() def __init__(self, parent=None): super(Search, self).__init__(parent) self.desktop = QApplication.desktop() self.screenRect = self.desktop.screenGeometry() self.h = self.screenRect.height() self.w = self.screenRect.width() self.xr = self.w / 930 self.yr = self.h / 640 self.zr = min(self.xr, self.yr) self.token = '' self.head = QLabel(self) self.search = QLineEdit(self) self.butt = QPushButton(self) self.but = QPushButton(self) self.set_ui() def set_ui(self): self.search.setObjectName('search') self.search.resize(self.xr * 520, self.yr * 40) self.search.move(self.xr * 205, self.yr * 300) self.search.setPlaceholderText('请输入战局ID') self.search.setTextMargins(20, 0, 0, 0) self.search.setStyleSheet('font-size:{}px;border-radius:{}px;'.format(int(self.zr * 16), self.zr * 15)) self.head.setObjectName('head') self.head.resize(self.xr * 200, self.yr * 50) self.head.move(self.xr * 360, self.yr * 240) self.head.setText('搜索战局') self.head.setAlignment(Qt.AlignCenter) self.head.setStyleSheet('font-size:{}px;'.format(int(self.zr * 25))) self.but.setObjectName('button') self.but.resize(self.xr * 130, self.yr * 40) self.but.move(self.xr * 480, self.yr * 380) self.but.setText('返回') self.but.clicked.connect(self.back_for) self.butt.setObjectName('button') self.butt.resize(self.xr * 130, self.yr * 40) self.butt.move(self.xr * 320, self.yr * 380) self.butt.setText('搜索') self.butt.clicked.connect(self.search_for) self.setStyleSheet('#button{font-size:' + str(int(self.zr * 18)) + 'px;border-radius:' + str( self.zr * 15) + 'px;background-color:#333643;color:#ffffff;}#button:hover{background-color:#575B6E;}#button:pressed{background-color:#202129;}') def search_for(self): id_p = self.search.text() self.search.clear() dic = find_info(id_p, self.token) # print(dic) if dic['status'] == 0: self.search_sg.emit(dic) else: self.search.setStyleSheet( 'font-size:{}px;border-radius:{}px;border:4px solid;border-color:red'.format(int(self.zr * 16), self.zr * 15)) self.search.clear() self.search.setPlaceholderText('ID不存在') def back_for(self): self.back_sg.emit() def get_token(self, t): self.token = t
class StickmanToolsPanel(QFrame): WIDTH = 1100 HEIGHT = 45 FRAME_SIZE_X = 180 FRAME_WIDTH = 1 FRAME_MARGIN = 2 ICON_SIZE = 35 ICON_BUTTON_WIDTH = 60 INPUT_TEXT_WIDTH = 300 INPUT_START_X = 213 SAY_BLOCK_X = 520 PHOTO_BUTTON_WIDTH = 240 PHOTO_BUTTON_X = 858 def __init__(self, parent, tools): super().__init__(parent) self.tools = tools self.initUI() def initUI(self): self.resize(StickmanToolsPanel.WIDTH, StickmanToolsPanel.HEIGHT + StickmanToolsPanel.FRAME_MARGIN*2) self.setFrameStyle(QFrame.StyledPanel) self.setFrameRect(QRect(0, 0, StickmanToolsPanel.FRAME_SIZE_X + StickmanToolsPanel.FRAME_MARGIN*2, StickmanToolsPanel.HEIGHT + StickmanToolsPanel.FRAME_MARGIN*2)) self.setLineWidth(StickmanToolsPanel.FRAME_WIDTH) component_stylesheet = """ .QPushButton { font-weight: bold; font-size: 13px; background-color:#E0E0E0; } .QPushButton:pressed { background-color:#CCCCCC; } .QLineEdit { font-weight: bold; font-size: 24px; } """ self.smile_button = QPushButton('', self) self.smile_button.setIcon(assets.smile) self.smile_button.setIconSize(QSize(StickmanToolsPanel.ICON_SIZE, StickmanToolsPanel.ICON_SIZE)) self.smile_button.resize(StickmanToolsPanel.ICON_BUTTON_WIDTH, StickmanToolsPanel.HEIGHT) self.smile_button.move(StickmanToolsPanel.FRAME_MARGIN, StickmanToolsPanel.FRAME_MARGIN) self.smile_button.setStyleSheet(component_stylesheet) self.smile_button.clicked.connect(self.changeExpression) self.smile_button.show() self.sad_button = QPushButton('', self) self.sad_button.setIcon(assets.sad) self.sad_button.setIconSize(QSize(StickmanToolsPanel.ICON_SIZE, StickmanToolsPanel.ICON_SIZE)) self.sad_button.resize(StickmanToolsPanel.ICON_BUTTON_WIDTH, StickmanToolsPanel.HEIGHT) self.sad_button.move(StickmanToolsPanel.FRAME_MARGIN + StickmanToolsPanel.ICON_BUTTON_WIDTH, StickmanToolsPanel.FRAME_MARGIN) self.sad_button.setStyleSheet(component_stylesheet) self.sad_button.clicked.connect(self.changeExpression) self.sad_button.show() self.confused_button = QPushButton('', self) self.confused_button.setIcon(assets.confused) self.confused_button.setIconSize(QSize(StickmanToolsPanel.ICON_SIZE, StickmanToolsPanel.ICON_SIZE)) self.confused_button.resize(StickmanToolsPanel.ICON_BUTTON_WIDTH, StickmanToolsPanel.HEIGHT) self.confused_button.move(StickmanToolsPanel.FRAME_MARGIN + StickmanToolsPanel.ICON_BUTTON_WIDTH*2, StickmanToolsPanel.FRAME_MARGIN) self.confused_button.setStyleSheet(component_stylesheet) self.confused_button.clicked.connect(self.changeExpression) self.confused_button.show() self.say_text = QLineEdit(self) self.say_text.setStyleSheet(component_stylesheet) self.say_text.resize(StickmanToolsPanel.INPUT_TEXT_WIDTH, StickmanToolsPanel.HEIGHT) self.say_text.move(StickmanToolsPanel.FRAME_MARGIN + StickmanToolsPanel.INPUT_START_X, StickmanToolsPanel.FRAME_MARGIN) self.say_left = QPushButton('', self) self.say_left.setIcon(assets.say_left) self.say_left.setIconSize(QSize(StickmanToolsPanel.ICON_SIZE, StickmanToolsPanel.ICON_SIZE)) self.say_left.resize(StickmanToolsPanel.ICON_BUTTON_WIDTH, StickmanToolsPanel.HEIGHT) self.say_left.move(StickmanToolsPanel.SAY_BLOCK_X, StickmanToolsPanel.FRAME_MARGIN) self.say_left.setStyleSheet(component_stylesheet) self.say_left.clicked.connect(self.sayLeft) self.say_right = QPushButton('', self) self.say_right.setIcon(assets.say_right) self.say_right.setIconSize(QSize(StickmanToolsPanel.ICON_SIZE, StickmanToolsPanel.ICON_SIZE)) self.say_right.resize(StickmanToolsPanel.ICON_BUTTON_WIDTH, StickmanToolsPanel.HEIGHT) self.say_right.move(StickmanToolsPanel.SAY_BLOCK_X + StickmanToolsPanel.ICON_BUTTON_WIDTH, StickmanToolsPanel.FRAME_MARGIN) self.say_right.setStyleSheet(component_stylesheet) self.say_right.clicked.connect(self.sayRight) self.say_exit = QPushButton('', self) self.say_exit.setIcon(assets.exit) self.say_exit.setIconSize(QSize(StickmanToolsPanel.ICON_SIZE, StickmanToolsPanel.ICON_SIZE)) self.say_exit.resize(StickmanToolsPanel.ICON_BUTTON_WIDTH, StickmanToolsPanel.HEIGHT) self.say_exit.move(StickmanToolsPanel.SAY_BLOCK_X + StickmanToolsPanel.ICON_BUTTON_WIDTH*2, StickmanToolsPanel.FRAME_MARGIN) self.say_exit.setStyleSheet(component_stylesheet) self.say_exit.clicked.connect(self.sayClear) self.photo = QPushButton('', self) self.photo.setIcon(assets.camera) self.photo.setIconSize(QSize(StickmanToolsPanel.ICON_SIZE, StickmanToolsPanel.ICON_SIZE)) self.photo.resize(StickmanToolsPanel.PHOTO_BUTTON_WIDTH, StickmanToolsPanel.HEIGHT) self.photo.move(StickmanToolsPanel.PHOTO_BUTTON_X, StickmanToolsPanel.FRAME_MARGIN) self.photo.setStyleSheet(component_stylesheet) self.photo.clicked.connect(self.makePhoto) def sayLeft(self): search = getWorld().getActive() if search != None: search.sayLeft(self.say_text.text()) self.say_text.setText("") def sayRight(self): search = getWorld().getActive() if search != None: search.sayRight(self.say_text.text()) self.say_text.setText("") def sayClear(self): search = getWorld().getActive() if search != None: search.sayRemove() self.say_text.setText("") def changeExpression(self): search = getWorld().getActive() if search != None: if self.sender() == self.smile_button: search.setHappy() elif self.sender() == self.sad_button: search.setSad() else: search.setConfused() def makePhoto(self): self.tools.framemenu.addNewFrame(getWorld().getFrame())