class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.lcd = QLCDNumber(self) # 设置数字类 self.lcd.setDigitCount(25) self.lcd.setMode(QLCDNumber.Dec) self.lcd.setSegmentStyle(QLCDNumber.Flat) self.lcd.setStyleSheet( "border: 1px solid green; color: green; background: silver;" ) # 设置显示的颜色样式 # vbox = QVBoxLayout() # 设置布局 # vbox.addWidget(self.lcd) # self.setLayout(vbox) self.setGeometry(300, 300, 250, 150) self.setWindowTitle('hello') dir_path = os.path.abspath(os.path.dirname(__file__)) + '\image\\1.ico' self.setWindowIcon(QIcon(dir_path)) self.show() self.timer = QTimer() self.timer.start(1) self.timer.timeout.connect(self.flush) # 使用了计时器 ''' 创建计时器->设置1ms刷新间隔->每次刷新执行flush函数 ''' def flush(self): # 获取系统当前时间 dateTime = QDateTime.currentDateTime() # 显示的内容 self.lcd.display(dateTime.toString("yyyy-MM-dd HH:mm:ss.zzz"))
class Demo(QWidget): def __init__(self): super(Demo, self).__init__() self.resize(600, 600) self.lcd_1 = QLCDNumber(self) # 1 self.lcd_1.setDigitCount(10) self.lcd_1.display(1234567890) self.lcd_2 = QLCDNumber(self) # 2 self.lcd_2.setSegmentStyle(QLCDNumber.Flat) # self.lcd_2.setSmallDecimalPoint(True) self.lcd_2.setDigitCount(10) self.lcd_2.display(0.1456789) self.lcd_3 = QLCDNumber(self) # 3 self.lcd_3.setSegmentStyle(QLCDNumber.Filled) self.lcd_3.display('HELLO') self.lcd_4 = QLCDNumber(self) # 4 self.lcd_4.setSegmentStyle(QLCDNumber.Outline) self.lcd_4.setMode(QLCDNumber.Hex) self.lcd_4.setDigitCount(6) self.lcd_4.display(666) self.v_layout = QVBoxLayout() self.v_layout.addWidget(self.lcd_1) self.v_layout.addWidget(self.lcd_2) self.v_layout.addWidget(self.lcd_3) self.v_layout.addWidget(self.lcd_4) self.setLayout(self.v_layout)
class Example(QWidget): ''' 液晶显示屏 ''' def __init__(self): ''' 一些初始设置 ''' super().__init__() self.initUI() def initUI(self): ''' 界面初始设置 ''' self.resize(370, 190) self.setWindowTitle('关注微信公众号:学点编程吧--倒计时:LCD数字') self.lcd = QLCDNumber(self) lb = QLabel("距离2022年北京-张家口冬季奥林匹克运动会还有", self) ft = QFont() ft.setPointSize(15) lb.setFont(ft) vbox = QVBoxLayout(self) vbox.addWidget(lb) vbox.addWidget(self.lcd) self.lcd.setDigitCount(12)# 将新建的QLCDNumber对象设置为12位 self.lcd.setMode(QLCDNumber.Dec)# 显示模式十进制(默认) self.lcd.setStyleSheet("border: 2px solid black; color: red; background: silver;") # Lcd样式设置 time = QTimer(self) time.setInterval(1000)# 固定1s发出timeout信号 time.timeout.connect(self.refresh) time.start() self.show() def refresh(self): ''' 当时间每隔1s,LCD上信息会刷新一下的。 ''' startDate = QDateTime.currentMSecsSinceEpoch() # 将其转换成当前时间到1970-01-01T00:00:00世界协调时间以来的毫秒数 endDate = QDateTime(QDate(2020, 2, 4), QTime(0, 0, 0)).toMSecsSinceEpoch() # 返回2020年2月4日0:0:0自1970-01-01T00:00:00.000世界协调时间以来的毫秒数 interval = endDate - startDate # 距离冬奥会还有多少时间 if interval > 0: days = interval // (24 * 60 * 60 * 1000) hour = (interval - days * 24 * 60 * 60 * 1000) // (60 * 60 * 1000) min = (interval - days * 24 * 60 * 60 * 1000 - hour * 60 * 60 * 1000) // (60 * 1000) sec = (interval - days * 24 * 60 * 60 * 1000 - hour * 60 * 60 * 1000 - min * 60 * 1000) // 1000 intervals = str(days) + ':' + str(hour) + ':' + str(min) + ':' + str(sec) self.lcd.display(intervals)
class MY_TIME(QWidget): def __init__(self): super().__init__() self.initUI() self.init_timer() def update_time(self): # 设置时间元祖 time.localtime() 获取本地时间 self.lcd.display(time.strftime('%X', time.localtime())) def init_timer(self): self.timer = QTimer() #设置定时器,每一秒触发一次 timeout 信号 self.timer.setInterval(1000) #启动定时器 self.timer.start() self.timer.timeout.connect(self.update_time) def initUI(self): self.resize(250, 100) self.setWindowTitle('王守鹏') self.move_center() self.lcd = QLCDNumber() #设置要显示的数字个数 self.lcd.setDigitCount(10) #采用的是十进制模式 self.lcd.setMode(QLCDNumber.Dec) #设置平面模式 self.lcd.setSegmentStyle(QLCDNumber.Flat) #设置时间元祖 time.localtime() 获取本地时间 self.lcd.display(time.strftime('%X', time.localtime())) #构建一个盒子布局 self.main_layout = QVBoxLayout() #把上面的组件添加进盒子布局 self.main_layout.addWidget(self.lcd) #设置组件居中 self.main_layout.setAlignment(Qt.AlignCenter) #设置给顶层布局 self.setLayout(self.main_layout) #设置界面颜色 self.main_bg = QPalette() #设置颜色为蓝色 self.main_bg.setColor(QPalette.Background, Qt.darkGreen) #设置自动填充背景颜色 self.setAutoFillBackground(True) #把颜色设置给顶级窗口 self.setPalette(self.main_bg) def move_center(self): #设置矩形 m_rect = self.frameGeometry() #获取这个屏幕的中心点 w_center_point = QDesktopWidget().availableGeometry().center() m_rect.moveCenter(w_center_point) #从左上角开始移动,直到中间 self.move(m_rect.topLeft()) self.show()
class MyTime(QWidget): def __init__(self): super().__init__() self.initUI() self.init_timer() #规定槽函数 更新时间 def update_time(self): #获取本地时间 显示到窗口 self.lcd.display(time.strftime('%X',time.localtime())) #实现定时器 信号 和槽函数 def init_timer(self): #初始化定时器 self.timer = QTimer() #设置触发信号,1000毫秒 self.timer.setInterval(1000) #启动定时器 self.timer.start() #信号触发 self.timer.timeout.connect(self.update_time) #实现界面所有编写 实例方法 this def initUI(self): #设置组件大小 宽高251px * 150px self.resize(251,150) #设置窗口标题 self.setWindowTitle('构建创意时钟') #设置窗口LOGO self.setWindowIcon(QIcon('C:/Users/19845/Desktop/a.jpg')) #初始化 调色板 self.plt = QPalette() #设置背景颜色 深青色 self.plt.setColor(QPalette.Background,Qt.darkCyan) #设置当前窗体自动填充渲染背景颜色 self.setAutoFillBackground(True) #设置顶层布局 self.setPalette(self.plt) #初始化 LCD数字组件 self.lcd = QLCDNumber() #设置显示数字个数 self.lcd.setDigitCount(10) #设置显示样式的模式,为平面模式 self.lcd.setSegmentStyle(QLCDNumber.Flat) #设置显示模式,为10进制 self.lcd.setMode(QLCDNumber.Dec) #获取本地时间,显示到窗口中 self.lcd.display(time.strftime('%X',time.localtime())) #初始化盒子布局 self.box = QVBoxLayout() #把要显示的LCD界面添加到布局中 统一管理 self.box.addWidget(self.lcd) #设置组件到窗口中间位置显示 self.box.setAlignment(Qt.AlignCenter) #将所有逻辑设置到顶层布局中 self.setLayout(self.box) #显示所有ui界面 self.show()
class MyTime(QWidget): # 构造方法 def __init__(self): # self代表当前实例对象的本身 ps:不是类本身 super().__init__() self.initUI() self.init_timer() def update_time(self): # 获取当前的系统时间 self.lcd.display(time.strftime('%X',time.localtime())) def init_timer(self): # 定时器 self.timer = QTimer() # 间隔0.5s发送一次信号 self.timer.setInterval(500) # 启动定时器 self.timer.start() # 信号 和 槽函数 self.timer.timeout.connect(self.update_time) def initUI(self): # 窗口组件的大小 251px * 150 self.resize(251,150) # 窗口组件的名称 self.setWindowTitle('不完美时钟') # 设置窗口图标 self.setWindowIcon(QIcon('微信图片_20180706210835.jpg')) # 颜色调色板 self.pa = QPalette() # 设置背景颜色为深黄色 self.pa.setColor(QPalette.Background,Qt.darkCyan) self.setAutoFillBackground(True) self.setPalette(self.pa) self.lcd = QLCDNumber() # 设置数字的个数为10个 self.lcd.setDigitCount(10) # 设置显示的数字模式为10进制 self.lcd.setMode(QLCDNumber.Dec) # 设置展示的模式为水平 self.lcd.setSegmentStyle(QLCDNumber.Flat) # 获取当前的系统时间 self.lcd.display(time.strftime('%X',time.localtime())) # 初始化一个盒子布局 self.main_layout = QVBoxLayout() # 把时间添加到布局中 self.main_layout.addWidget(self.lcd) # 设置组件到布局的中间 self.main_layout.setAlignment(Qt.AlignCenter) # 将子布局 设置到 顶层布局 self.setLayout(self.main_layout) # 显示布局 self.show()
class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.resize(370, 190) self.setWindowTitle('关注微信公众号:学点编程吧--倒计时:LCD数字') self.lcd = QLCDNumber(self) lb = QLabel("距离2022年北京-张家口冬季奥林匹克运动会还有", self) ft = QFont() ft.setPointSize(15) lb.setFont(ft) vbox = QVBoxLayout(self) vbox.addWidget(lb) vbox.addWidget(self.lcd) self.lcd.setDigitCount(12) self.lcd.setMode( QLCDNumber.Dec) # etMode()该属性保存当前的显示模式(数字库),对应于当前显示模式, self.lcd.setStyleSheet( "border: 2px solid black; color: blue; background: silver; border-radius:10px;border-width:3px;" ) time = QTimer(self) time.setInterval(1000) # 1000毫秒=1秒 time.timeout.connect(self.refresh) # 以固定时间1秒,向refresh槽发出信号 time.start() self.show() def refresh(self): startDate = QDateTime.currentMSecsSinceEpoch() endDate = QDateTime( QDate(2020, 2, 4), QTime(0, 0, 0) ).toMSecsSinceEpoch( ) # 假设是0:0:0开始的,我们创建一个QDatetime对象,并使用toMSecsSinceEpoch()返回2020年2月4日0:0:0自1970-01-01T00:00:00.000世界协调时间以来的毫秒数。 interval = endDate - startDate if interval > 0: days = interval // (24 * 60 * 60 * 1000) hour = (interval - days * 24 * 60 * 60 * 1000) // (60 * 60 * 1000) min = (interval - days * 24 * 60 * 60 * 1000 - hour * 60 * 60 * 1000) // (60 * 1000) sec = (interval - days * 24 * 60 * 60 * 1000 - hour * 60 * 60 * 1000 - min * 60 * 1000) // 1000 intervals = str(days) + ':' + str(hour) + ':' + str( min) + ':' + str(sec) self.lcd.display(intervals)
class Demo(QWidget): def __init__(self): super(Demo, self).__init__() self.resize(600, 600) # 实例化一个QLCDNumber控件, # 然后通过setDiditCount()方法来设置一共可以显示多少为数字; self.lcd_1 = QLCDNumber(self) self.lcd_1.setDigitCount(10) self.lcd_1.display(1234567890) # lcd_2显示浮点型数字 self.lcd_2 = QLCDNumber(self) # 通过setSegmentStyle()可以设置显示屏数字样式 """ 常量 值 描述 QLCDNumber.Outline 0 让内容浮显,其颜色显示屏背景颜色相同 QLCDNumber.Filled 1 让内容浮显,颜色窗口标题相同 QLCDNumber.Flat 2 让内容扁平化显示,颜色同窗口标题颜色相同 """ self.lcd_2.setSegmentStyle(QLCDNumber.Flat) # setSmallDecimalPoint(bool)方法可以设置小数点的显示方式: # 若为True,那么小数点就会在两个数字之间显示出来,而不会单独占一个位置。如果为False,那就会单独占位(默认为False)。 # self.lcd_2.setSmallDecimalPoint(True) self.lcd_2.setDigitCount(10) self.lcd_2.display(0.123456789) # 3. lcd_3显示的为字符串,可以显示的字母种类有限:A, B, C, D, E, F, h, H, L, # o, P, r, u, U, Y, O/0, S/5, g/9; self.lcd_3 = QLCDNumber(self) # 3 self.lcd_3.setSegmentStyle(QLCDNumber.Filled) self.lcd_3.display('HELLO') self.lcd_4 = QLCDNumber(self) # 4 self.lcd_4.setSegmentStyle(QLCDNumber.Outline) self.lcd_4.setMode(QLCDNumber.Hex) self.lcd_4.setDigitCount(6) self.lcd_4.display(666) self.v_layout = QVBoxLayout() self.v_layout.addWidget(self.lcd_1) self.v_layout.addWidget(self.lcd_2) self.v_layout.addWidget(self.lcd_3) self.v_layout.addWidget(self.lcd_4) self.setLayout(self.v_layout)
class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.resize(370, 190) self.setWindowTitle('LCD数字') self.lcd = QLCDNumber(self) lb = QLabel("距离2022年北京-张家口冬季奥林匹克运动会还有", self) ft = QFont() ft.setPointSize(15) lb.setFont(ft) vbox = QVBoxLayout(self) vbox.addWidget(lb) vbox.addWidget(self.lcd) self.lcd.setDigitCount(13) self.lcd.setMode(QLCDNumber.Dec) self.lcd.setStyleSheet( "border: 2px solid black; color: red; background: silver;") time = QTimer(self) time.setInterval(1000) time.timeout.connect(self.refresh) time.start() self.show() def refresh(self): startDate = QDateTime.currentMSecsSinceEpoch() endDate = QDateTime(QDate(2022, 2, 4), QTime(0, 0, 0)).toMSecsSinceEpoch() interval = endDate - startDate if interval > 0: days = interval // (24 * 60 * 60 * 1000) hour = (interval - days * 24 * 60 * 60 * 1000) // (60 * 60 * 1000) min = (interval - days * 24 * 60 * 60 * 1000 - hour * 60 * 60 * 1000) // (60 * 1000) sec = (interval - days * 24 * 60 * 60 * 1000 - hour * 60 * 60 * 1000 - min * 60 * 1000) // 1000 intervals = str(days) + ':' + str(hour) + ':' + str( min) + ':' + str(sec) self.lcd.display(intervals)
class MyTimer(QWidget): def __init__(self): super(MyTimer, self).__init__() self.lcd = QLCDNumber() self.lcd.setDigitCount(10) self.lcd.setMode(QLCDNumber.Dec) self.lcd.setSegmentStyle(QLCDNumber.Flat) layout = QVBoxLayout() layout.addWidget(self.lcd) self.setLayout(layout) self.timer = QTimer() self.timer.setInterval(1000) self.timer.start() self.timer.timeout.connect(self.onTimerOut) def onTimerOut(self): self.lcd.display(time.strftime("%X", time.localtime()))
class MainWindow(Ui_MainWindow, QMainWindow): """ 主界面二次设计 """ def __init__(self): super(MainWindow, self).__init__() # 获取桌面尺寸 desktop = QApplication.desktop() desk_width = desktop.screenGeometry().width() desk_height = desktop.screenGeometry().height() # 摄像头图像设置 self.frame = DIYLabel(self) self.frame.setGeometry(0, 0, desk_width, desk_height) self.setupUi(self) # 按钮定位 self.buttons = [ self.att_rec, self.face_login, self.face_rec, self.face_reg ] map( lambda x: x.move( desk_width * 0.80, desk_height * 0.33 + self.buttons.index(x) * (x.height() + 8)), self.buttons) map(lambda x: x.raise_(), self.buttons) # 设置时钟 self.clock = QLCDNumber(self) self.clock.setDigitCount(10) self.clock.setMode(QLCDNumber.Dec) self.clock.setSegmentStyle(QLCDNumber.Flat) self.clock.display(time.strftime("%X", time.localtime())) self.clock.setStyleSheet("QLCDNumber{color:rgba(255,0,0,100);}") self.clock.resize(280, 120) self.clock.move(50, desk_height - 30 - self.clock.height()) self.setWindowFlags(Qt.FramelessWindowHint) # 隐藏窗口 self.showFullScreen() # 窗体全屏
class ShiZhong(QWidget): def __init__(self): super(ShiZhong, self).__init__() self.initUI() self.init_timer() def initUI(self): self.resize(250, 150) self.setWindowTitle('电子时钟By LC') self.move_center() self.m = QPalette() self.m.setColor(QPalette.Background, Qt.green) self.setAutoFillBackground(True) self.setPalette(self.m) self.lcd = QLCDNumber() self.lcd.setDigitCount(10) self.lcd.setMode(QLCDNumber.Dec) self.lcd.setSegmentStyle(QLCDNumber.Flat) self.lcd.display(time.strftime("%X", time.localtime())) self.m_layout = QVBoxLayout() self.m_layout.addWidget(self.lcd) self.m_layout.setAlignment(Qt.AlignCenter) self.setLayout(self.m_layout) self.show() def init_timer(self): self.timer = QTimer() self.timer.setInterval(1000) self.timer.start() self.timer.timeout.connect(self.update_time) def update_time(self): self.lcd.display(time.strftime("%X", time.localtime())) def move_center(self): m_rect = self.frameGeometry() w_center_point = QDesktopWidget().availableGeometry().center() m_rect.moveCenter(w_center_point) self.move(m_rect.topLeft())
class CWind(QMainWindow): """ 主窗口 """ def __init__(self): super().__init__() self._initUI() self.my_init_timer() self.socket = QTcpSocket() self.nextBlockSize = 0 self.request = None self.socket.connected.connect(self.my_sendRequest) self.socket.readyRead.connect(self.my_readResponse) self.socket.disconnected.connect(self.my_serverHasStopped) self.socket.error.connect(self.my_serverHasError) # 若已有交易环境配置文件,则打开并读到self.config变量中 self.config = () if os.path.isfile('setting.cfg') == True: self.config = self.my_read_config() self.my_update_atr() # 状态栏显示启动信息,并存入日志文件 rec_text = my_cur_time() + ' 开启交易助手!' self.statusBar().showMessage(rec_text) my_operating_record(rec_text) def _initUI(self): self.setFixedSize(300, 400) self.setWindowFlags(Qt.WindowStaysOnTopHint) self.my_center() self.setWindowTitle('交易助手') self.setWindowIcon(QIcon('myIcon.ico')) QToolTip.setFont(QFont('微软雅黑', 10)) # 以下设置菜单 menubar = self.menuBar() fileMenu = menubar.addMenu('设置') self.settingAct = QAction(QIcon('setting.png'), '设置交易环境', self) self.settingAct.setShortcut('Ctrl+P') aboutAct = QAction(QIcon('contact.png'), '联系我们', self) aboutAct.setShortcut('Ctrl+A') aboutAct.triggered.connect(self._about) exitAct = QAction(QIcon('exit.png'), '退出', self) exitAct.setShortcut('Ctrl+Q') exitAct.triggered.connect(qApp.quit) fileMenu.addAction(self.settingAct) fileMenu.addAction(aboutAct) fileMenu.addAction(exitAct) # LCD时钟 self.lcd = QLCDNumber(self) self.lcd.setDigitCount(5) self.lcd.setMode(QLCDNumber.Dec) self.lcd.setSegmentStyle(QLCDNumber.Flat) self.lcd.display(time.strftime("%X", time.localtime())) self.lcd.resize(200, 66) self.lcd.move(50, 170) # 以下布局窗口各个控件 self.lab0 = QLabel('', self) font0 = QFont() font0.setFamily("微软雅黑") font0.setPointSize(9) font0.setBold(True) self.lab0.setFont(font0) self.lab0.setStyleSheet('color: rgb(0, 0, 127)') self.lab0.resize(288, 20) self.lab0.move(5, 36) symbols = ['EURUSD', 'GBPUSD', 'XAUUSD', 'USDJPY'] lab1 = QLabel('交易品种 (1)', self) lab1.move(20, 77) self.combo1 = QComboBox(self) for symbol in symbols: self.combo1.addItem(symbol) self.combo1.move(20, 112) font12 = QFont() font12.setBold(True) self.combo1.setFont(font12) self.cb_buy1 = QCheckBox('做多', self) self.cb_buy1.move(140, 80) self.cb_buy1.toggle() self.cb_buy1.setChecked(False) self.cb_sell1 = QCheckBox('做空', self) self.cb_sell1.move(140, 115) self.cb_sell1.toggle() self.cb_sell1.setChecked(False) self.btn_open1 = QPushButton('挂单/直开', self) self.btn_open1.setToolTip('挂单或者当前市价开仓') self.btn_open1.resize(85, 25) self.btn_open1.move(200, 70) self.btn_open1.clicked.connect(self.my_btn_open1_Clicked) self.btn_close1 = QPushButton('撤单/平仓', self) self.btn_close1.setToolTip('撤销挂单或平掉已有仓位') self.btn_close1.resize(85, 25) self.btn_close1.move(200, 100) self.btn_close1.clicked.connect(self.my_btn_close1_Clicked) self.btn_ProtectiveStop1 = QPushButton('成本价离场', self) self.btn_ProtectiveStop1.setToolTip('将止损移到成本价') self.btn_ProtectiveStop1.resize(85, 25) self.btn_ProtectiveStop1.move(200, 130) self.btn_ProtectiveStop1.clicked.connect( self.my_btn_ProtectiveStop1_Clicked) lab2 = QLabel('交易品种 (2)', self) lab2.move(20, 257) self.combo2 = QComboBox(self) for symbol in symbols: self.combo2.addItem(symbol) self.combo2.setCurrentText(symbols[1]) self.combo2.move(20, 292) self.combo2.setFont(font12) self.cb_buy2 = QCheckBox('做多', self) self.cb_buy2.move(140, 260) self.cb_buy2.toggle() self.cb_buy2.setChecked(False) self.cb_sell2 = QCheckBox('做空', self) self.cb_sell2.move(140, 295) self.cb_sell2.toggle() self.cb_sell2.setChecked(False) self.btn_open2 = QPushButton('挂单/直开', self) self.btn_open2.setToolTip('挂单或者当前市价开仓') self.btn_open2.resize(85, 25) self.btn_open2.move(200, 250) self.btn_open2.clicked.connect(self.my_btn_open2_Clicked) self.btn_close2 = QPushButton('撤单/平仓', self) self.btn_close2.setToolTip('撤销挂单或平掉已有仓位') self.btn_close2.resize(85, 25) self.btn_close2.move(200, 280) self.btn_close2.clicked.connect(self.my_btn_close2_Clicked) self.btn_ProtectiveStop2 = QPushButton('成本价离场', self) self.btn_ProtectiveStop2.setToolTip('将止损移到成本价') self.btn_ProtectiveStop2.resize(85, 25) self.btn_ProtectiveStop2.move(200, 310) self.btn_ProtectiveStop2.clicked.connect( self.my_btn_ProtectiveStop2_Clicked) lbl3 = QLabel('单笔止损:%', self) lbl3.move(20, 345) self.rb11 = QRadioButton('0.5', self) self.rb11.move(115, 345) self.rb11.setChecked(True) self.rb12 = QRadioButton('1.0', self) self.rb12.move(175, 345) self.rb13 = QRadioButton('2.0', self) self.rb13.move(235, 345) self.show() def closeEvent(self, event): reply = QMessageBox.question(self, '操作提示!', '您确定要关闭“交易助手”?', QMessageBox.Yes | QMessageBox.No, QMessageBox.No) if reply == QMessageBox.Yes: self.socket.close() rec_text = my_cur_time() + ' 关闭交易助手!' my_operating_record(rec_text) event.accept() else: event.ignore() def keyPressEvent(self, e): if e.key() == Qt.Key_Escape: self.showMinimized() def my_center(self): screen = QDesktopWidget().screenGeometry() size = self.geometry() self.move((screen.width() - size.width()) / 2 + 132, (screen.height() - size.height() - 90)) def my_init_timer(self): """ 定时器 """ self.timer = QTimer() self.timer.setInterval(500) self.timer.start() self.timer.timeout.connect(self.my_update_timer) def my_update_timer(self): # 定时刷新LCD时钟 # self.lcd.display(time.strftime("%X", time.localtime())) # 定时刷新各品种的ATR self.my_update_atr() def my_update_atr(self): """ 读取ATR文件并更新标签文本 """ if len(self.config) == 0: self.config = self.my_read_config() mode = self.config[1] # 从配置文件里找到看盘MT4的Files文件夹 if mode == 'Local': atr_file_path = self.config[3] elif mode == 'Network': atr_file_path = self.config[4] # ATR文件存放在看盘MT4的Files文件夹里 file_name = atr_file_path + '\\' + 'myatr.txt' if os.path.isfile(file_name): try: with open(file_name, 'r') as file_object: atr = file_object.read() # 刷新各品种的ATR self.lab0.setText(atr[:38]) # 刷新LCD时钟(交易服务器时间) self.lcd.display(atr[43:48]) except: pass else: self.lab0.setText('请打开MT4看盘软件并加载ATR_EA程序') def _about(self): """ 关于菜单 """ QMessageBox.information(self, '联系我们——瑞讯银行智能化交易系统', self.tr('微信:zyhj518,手机:13770675275。')) def my_btn_open1_Clicked(self): """ 挂单或直接市价开仓操作 """ if self.cb_buy1.isChecked() or self.cb_sell1.isChecked(): signal_text = self.combo1.currentText() if self.cb_buy1.isChecked(): signal_text += 'BUY' if self.cb_sell1.isChecked(): signal_text += 'SELL' if self.rb12.isChecked(): signal_text += '1' elif self.rb13.isChecked(): signal_text += '2' self.my_send_signal(signal_text) else: QMessageBox.information(self, '错误提示!', self.tr('请勾选交易方向后,再开仓!')) def my_btn_close1_Clicked(self): """ 撤销挂单,或平掉已有仓位 """ signal_text = self.combo1.currentText() + 'CLOSE' self.my_send_signal(signal_text) def my_btn_ProtectiveStop1_Clicked(self): """ 保护性止损 """ signal_text = self.combo1.currentText() + 'ProtectiveStop' self.my_send_signal(signal_text) def my_btn_open2_Clicked(self): """ 挂单或直接市价开仓操作 """ if self.cb_buy2.isChecked() or self.cb_sell2.isChecked(): signal_text = self.combo2.currentText() if self.cb_buy2.isChecked(): signal_text += 'BUY' if self.cb_sell2.isChecked(): signal_text += 'SELL' if self.rb12.isChecked(): signal_text += '1' elif self.rb13.isChecked(): signal_text += '2' self.my_send_signal(signal_text) else: QMessageBox.critical(self, '错误提示!', self.tr('请勾选交易方向后,再开仓!')) def my_btn_close2_Clicked(self): """ 撤销挂单,或平掉已有仓位 """ signal_text = self.combo2.currentText() + 'CLOSE' self.my_send_signal(signal_text) def my_btn_ProtectiveStop2_Clicked(self): """ 保护性止损 """ signal_text = self.combo2.currentText() + 'ProtectiveStop' self.my_send_signal(signal_text) def my_updateUI(self): if self.request is not None: enabled = False else: enabled = True self.btn_open1.setEnabled(enabled) self.btn_close1.setEnabled(enabled) self.btn_ProtectiveStop1.setEnabled(enabled) self.btn_open2.setEnabled(enabled) self.btn_close2.setEnabled(enabled) self.btn_ProtectiveStop2.setEnabled(enabled) def my_read_config(self): """ 读取交易环境的配置文件,返回MT4账户和IP地址或文件夹 """ config = configparser.ConfigParser() config.read('setting.cfg') account_number = config.get('MT4', 'account_number') mode = config.get('Pathway', 'mode') atr = config.get('ATR', 'directory') if config.get('Pathway', 'mode') == 'Local': directory = config.get('Local', 'directory') return account_number, mode, directory, atr elif config.get('Pathway', 'mode') == 'Network': host = config.get('Network', 'host') port = config.get('Network', 'port') return account_number, mode, host, port, atr def my_send_signal(self, inp_text): """ 发送交易指令到MT4的Files文件夹,或发送到交易服务器 """ # 读取配置文件到字典变量 if len(self.config) == 0: self.config = self.my_read_config() mode = self.config[1] if mode == 'Local': symbols = ['EURUSD', 'GBPUSD', 'XAUUSD', 'USDJPY'] for symbol in symbols: if inp_text.find(symbol) >= 0: trade_symbol = symbol file_path = self.config[2] # 检查交易品种的子文件夹是否存在,不存在就新建相应的子文件夹 if os.path.exists(file_path + '\\' + trade_symbol) == False: os.mkdir(file_path + '\\' + trade_symbol) file_path = file_path + '\\' + trade_symbol + '\\' # 将指令存到对应的子文件夹里 file_name = file_path + 'trade_signal.txt' with open(file_name, 'w') as file_object: file_object.write(inp_text) # 将交易指令传到交易服务器上 elif mode == 'Network': account_number = self.config[0] host = self.config[2] port = int(self.config[3]) self.request = QByteArray() stream = QDataStream(self.request, QIODevice.WriteOnly) stream.writeUInt16(0) stream.writeQString(account_number) stream.writeQString(inp_text) stream.device().seek(0) stream.writeUInt16(self.request.size() - SIZEOF_UINT16) self.my_updateUI() if self.socket.isOpen(): self.socket.close() self.socket.connectToHost(host, port) rec_text = my_cur_time() + ' 正在连接远程交易服务器...' self.statusBar().showMessage(rec_text) my_operating_record(rec_text) def my_sendRequest(self): self.nextBlockSize = 0 self.socket.write(self.request) self.request = None rec_text = my_cur_time() + ' 正在发送您的交易指令...' self.statusBar().showMessage(rec_text) my_operating_record(rec_text) def my_readResponse(self): stream = QDataStream(self.socket) while True: if self.nextBlockSize == 0: if self.socket.bytesAvailable() < SIZEOF_UINT16: break self.nextBlockSize = stream.readUInt16() if self.socket.bytesAvailable() < self.nextBlockSize: break ser_reply = stream.readQString() if ser_reply == 'None': QMessageBox.critical(self, '错误提示!', self.tr('您没有开通服务器交易功能!')) rec_text = my_cur_time() + ' 您没有开通服务器交易功能!' self.statusBar().showMessage(rec_text) my_operating_record(rec_text) else: rec_text = my_cur_time() + ' 服务器已接收指令:{0}'.format(ser_reply) self.statusBar().showMessage(rec_text) my_operating_record(rec_text) self.nextBlockSize = 0 self.socket.close() self.my_updateUI() rec_text = my_cur_time() + ' 已断开服务器连接!' my_operating_record(rec_text) def my_serverHasStopped(self): self.socket.close() def my_serverHasError(self, error): self.socket.close() rec_text = my_cur_time() + ' 错误:{0}'.format(self.socket.errorString()) self.statusBar().showMessage(rec_text) my_operating_record(rec_text)
class Game(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): grid = QGridLayout() grid.setSpacing(10) # 创建标签之间的空间。 self.labels = [] self.palettes = [] for i in range(ROW**2): # create label label = QLabel('0', self) label.setAlignment(Qt.AlignCenter) # 居中显示 label.setFixedWidth(80) label.setFixedHeight(80) label.setFont(QFont("Arial", 20, QFont.Bold)) # 粗体 grid.addWidget(label, i // ROW, i % ROW) self.labels.append(label) # create palette pe = QPalette() pe.setColor(QPalette.WindowText, NUM_MAP_COLOR['0']['font']) label.setAutoFillBackground(True) # 设置背景充满,为设置背景颜色的必要条件 pe.setColor(QPalette.Window, NUM_MAP_COLOR['0']['background']) # 设置背景颜色 label.setPalette(pe) self.palettes.append(pe) self.randomSetLabels(2) self.succeed = False self.isMove = False self.isLose = False # lcd self.lcd = QLCDNumber(self) lb = QLabel("game running time : ", self) self.lcd.setDigitCount(8) self.lcd.setMode(QLCDNumber.Dec) self.lcd.setStyleSheet( "border: 2px solid black; color: red; background: silver;") grid.addWidget(lb, 4, 0, 1, 2) grid.addWidget(self.lcd, 4, 2, 1, 2) # debug label self.__debug_label = QLabel('debug text', self) grid.addWidget(self.__debug_label, 5, 0, 4, 4) self.setLayout(grid) # timer self.second_count = 0 time = QTimer(self) time.setInterval(1000) time.timeout.connect(self.refresh) time.start() self.setGeometry(300, 300, 400, 600) self.setWindowTitle('2048 game') self.setWindowIcon(QIcon('2048.png')) self.show() def refresh(self): self.second_count += 1 sec = self.second_count % 60 min = int(self.second_count / 60) % 60 hour = int(self.second_count / 60 / 60) % 60 sec_str = str(sec) if sec > 9 else '0' + str(sec) min_str = str(sec) if min > 9 else '0' + str(min) hour_str = str(sec) if hour > 9 else '0' + str(hour) show_num = '{}:{}:{}'.format(hour_str, min_str, sec_str) self.lcd.display(show_num) def resetLabel(self): for i in range(ROW * COL): self.setTextAndColor(i, '0', setIsMove=False) self.randomSetLabels(2) self.second_count = 0 def keyPressEvent(self, e): if e.key() == Qt.Key_Up: self.__debug_label.setText('↑') self.gridMove('up') elif e.key() == Qt.Key_Down: self.__debug_label.setText('↓') self.gridMove('down') elif e.key() == Qt.Key_Left: self.__debug_label.setText('←') self.gridMove('left') elif e.key() == Qt.Key_Right: self.__debug_label.setText('→') self.gridMove('right') elif e.key() == Qt.Key_R: self.resetLabel() def gridMove(self, dir): self.removeEmptyLabel(dir) self.mergeSameLabel(dir) if self.isLose: self.gameOver() if self.succeed: self.gameSuccess() if self.isMove: self.isMove = False self.randomSetLabels(1) def removeEmptyLabel(self, dir): self.isLose = True if dir == 'right': for i in range(ROW): # 每一行 row_point = [] # 记录所有有效值 for j in range(COL - 1, -1, -1): if self.labels[i * ROW + j].text() != '0': row_point.append(self.labels[i * ROW + j].text()) else: self.isLose = False j = COL - 1 # 依次填充有效值 for text in row_point: self.setTextAndColor(i * ROW + j, text) j -= 1 # 剩余label补零 while j != -1: self.setTextAndColor(i * ROW + j, '0') j -= 1 elif dir == 'left': for i in range(ROW): # 每一行 row_point = [] for j in range(COL): if self.labels[i * ROW + j].text() != '0': row_point.append(self.labels[i * ROW + j].text()) else: self.isLose = False j = 0 for text in row_point: self.setTextAndColor(i * ROW + j, text) j += 1 while j != COL: self.setTextAndColor(i * ROW + j, '0') j += 1 elif dir == 'up': for j in range(COL): # 每一行 row_point = [] for i in range(ROW): if self.labels[i * ROW + j].text() != '0': row_point.append(self.labels[i * ROW + j].text()) else: self.isLose = False i = 0 for text in row_point: self.setTextAndColor(i * ROW + j, text) i += 1 while i != ROW: self.setTextAndColor(i * ROW + j, '0') i += 1 elif dir == 'down': for j in range(COL): # 每一行 col_point = [] for i in range(ROW - 1, -1, -1): if self.labels[i * ROW + j].text() != '0': col_point.append(self.labels[i * ROW + j].text()) else: self.isLose = False i = ROW - 1 for text in col_point: self.setTextAndColor(i * ROW + j, text) i -= 1 while i != -1: self.setTextAndColor(i * ROW + j, '0') i -= 1 def mergeSameLabel(self, dir): if dir == 'right': for j in range(ROW): # 每一行 for i in range(COL - 1, 0, -1): # 每一列 right_label = self.labels[j * ROW + i] # 每一行中相邻两个靠右的label left_label = self.labels[j * ROW + i - 1] # 靠左的label if right_label.text() == left_label.text(): # 两个格相等 num = int(right_label.text()) self.finishedMerge(j * ROW + i, num * 2) self.setTextAndColor(j * ROW + i, str(num * 2)) for k in range(i - 1, 0, -1): # 依次右移一格 self.setTextAndColor( j * ROW + k, self.labels[j * ROW + k - 1].text()) self.setTextAndColor(j * ROW + 0, '0') break elif dir == 'left': for j in range(ROW): # 每一行 for i in range(COL - 1): # 每一列 right_label = self.labels[j * ROW + i + 1] left_label = self.labels[j * ROW + i] if right_label.text() == left_label.text(): # 两个格相等 num = int(left_label.text()) self.finishedMerge(j * ROW + i, num * 2) self.setTextAndColor(j * ROW + i, str(num * 2)) for k in range(i + 1, COL - 1): self.setTextAndColor( j * ROW + k, self.labels[j * ROW + k + 1].text()) self.setTextAndColor(j * ROW + COL - 1, '0') break elif dir == 'down': for i in range(COL): for j in range(ROW - 1, 0, -1): up_label = self.labels[(j - 1) * ROW + i] down_label = self.labels[j * ROW + i] if up_label.text() == down_label.text(): # 两个格相等 num = int(down_label.text()) self.finishedMerge(j * ROW + i, num * 2) self.setTextAndColor(j * ROW + i, str(num * 2)) for k in range(j - 1, 0, -1): self.setTextAndColor( k * ROW + i, self.labels[(k - 1) * ROW + i].text()) self.setTextAndColor(0 * ROW + i, '0') break elif dir == 'up': for i in range(COL): for j in range(ROW - 1): up_label = self.labels[j * ROW + i] down_label = self.labels[(j + 1) * ROW + i] if up_label.text() == down_label.text(): # 两个格相等 num = int(up_label.text()) self.finishedMerge(j * ROW + i, num * 2) self.setTextAndColor(j * ROW + i, str(num * 2)) for k in range(j + 1, ROW - 1): self.labels[k * ROW + i].setText( self.labels[(k + 1) * ROW + i].text()) self.setTextAndColor( k * ROW + i, self.labels[(k + 1) * ROW + i].text()) self.setTextAndColor((COL - 1) * ROW + i, '0') break def randomSetLabels(self, nums): empty_grids = self.getEmptyGrid() num_strs = '22244' for _ in range(nums): num = random.choice(num_strs) # todo 添加权重 label_index = random.choice(empty_grids) self.setTextAndColor(label_index, num, setIsMove=False) def getEmptyGrid(self): results = [ index for index, labels in enumerate(self.labels) if labels.text() == '0' ] return results def gameSuccess(self): button = QMessageBox.question( self, "Congratulations", "You are very NB! Do you want to restart?", QMessageBox.Ok | QMessageBox.Cancel, QMessageBox.Ok) if button == QMessageBox.Ok: self.resetLabel() self.__debug_label.setText("Question button/Ok") elif button == QMessageBox.Cancel: self.__debug_label.setText("Question button/Cancel") def setTextAndColor(self, index, num, setIsMove=True): if setIsMove: pre_text = self.labels[index].text() if pre_text != num: self.isMove = True self.labels[index].setText(num) self.palettes[index].setColor(QPalette.WindowText, NUM_MAP_COLOR[num]['font']) self.palettes[index].setColor(QPalette.Window, NUM_MAP_COLOR[num]['background']) self.labels[index].setPalette(self.palettes[index]) def finishedMerge(self, index, num): if num == 2048: self.succeed = True self.isLose = False def gameOver(self): button = QMessageBox.question(self, "Sorry", "Game over! Do you want to restart?", QMessageBox.Ok | QMessageBox.Cancel, QMessageBox.Ok) if button == QMessageBox.Ok: self.resetLabel() self.__debug_label.setText("Question button/Ok") elif button == QMessageBox.Cancel: self.__debug_label.setText("Question button/Cancel")
class OperationalPlanning(QWidget): signal_gameover = Signal.get_signal().signal_gameover def __init__(self): super(OperationalPlanning, self).__init__() self.setObjectName('OperationalPlanning') self.setStyleSheet(GetQssFile.readQss('../resource/qss/operationalPlanning.qss')) self.log = logging.getLogger('StarCraftII') # test fix algorithm self.algorithm = None self.algorithmThread = None # font font = QFont() font.setWeight(50) font.setPixelSize(15) # set widget of layout self.frame = QFrame(self) self.frame.setGeometry(QDesktopWidget().screenGeometry()) self.main_layout = QHBoxLayout(self) self.main_layout.setSpacing(20) self.setLayout(self.main_layout) # start action self.start = QPushButton() self.start.setObjectName('start') self.startLabel = QLabel('start') self.startLabel.setFont(font) self.start_layout = QVBoxLayout() self.start_layout.addWidget(self.start, alignment=Qt.AlignCenter) self.start_layout.addWidget(self.startLabel, alignment=Qt.AlignCenter) self.main_layout.addLayout(self.start_layout) # pause action # self.pause = QPushButton() # self.pause.setObjectName('pause') # self.pauseLabel = QLabel('pause') # self.pauseLabel.setFont(font) # self.pause_layout = QVBoxLayout() # self.pause_layout.addWidget(self.pause, alignment=Qt.AlignCenter) # self.pause_layout.addWidget(self.pauseLabel, alignment=Qt.AlignCenter) # self.main_layout.addLayout(self.pause_layout) # stop action self.stop = QPushButton() self.stop.setObjectName('stop') self.stopLabel = QLabel('stop') self.stopLabel.setFont(font) self.stop_layout = QVBoxLayout() self.stop_layout.addWidget(self.stop, alignment=Qt.AlignCenter) self.stop_layout.addWidget(self.stopLabel, alignment=Qt.AlignCenter) self.main_layout.addLayout(self.stop_layout) # switch policy action self.switch = QPushButton() self.switch.setObjectName('switch') self.switchLabel = QLabel('switch policy') self.switchLabel.setFont(font) self.switch_layout = QVBoxLayout() self.switch_layout.addWidget(self.switch, alignment=Qt.AlignCenter) self.switch_layout.addWidget(self.switchLabel, alignment=Qt.AlignCenter) self.main_layout.addLayout(self.switch_layout) # simulation time self.lcd = QLCDNumber() self.lcd.setObjectName('lcd') self.lcd.setDigitCount(10) self.lcd.setMode(QLCDNumber.Dec) self.lcd.setSegmentStyle(QLCDNumber.Flat) self.lcd.setFrameStyle(QFrame.Panel | QFrame.Raised) self.lcd.display(time.strftime("%X", time.localtime())) self.lcdLabel = QLabel('simulation time') self.lcdLabel.setFont(font) self.lcd_layout = QVBoxLayout() self.lcd_layout.addWidget(self.lcd, alignment=Qt.AlignBottom) self.lcd_layout.addWidget(self.lcdLabel, alignment=Qt.AlignBottom) self.main_layout.addLayout(self.lcd_layout) # define time self.qtime = QTimer() self.qtime.timeout.connect(self.refresh) # define global variable global interval interval = 0 global start_or_pause start_or_pause = False global stop stop = True # map description self.map = QPushButton() self.map.setObjectName('map') self.mapLabel = QLabel('map description') self.mapLabel.setFont(font) self.map_layout = QVBoxLayout() self.map_layout.addWidget(self.map, alignment=Qt.AlignCenter) self.map_layout.addWidget(self.mapLabel, alignment=Qt.AlignCenter) self.main_layout.addLayout(self.map_layout) # add stretch self.main_layout.addStretch(1) # popup window self.dialog = None # initialization self.initUI() def refresh(self): timeworker = TimeWorker(self.lcd, OperationalPlanning.interval) OperationalPlanning.interval += 1 timeworker.run() def initUI(self): # connect the slot function self.start.clicked.connect(self.buttonEvent) # self.pause.clicked.connect(self.buttonEvent) self.stop.clicked.connect(self.buttonEvent) self.switch.clicked.connect(self.buttonEvent) self.map.clicked.connect(self.buttonEvent) self.signal_gameover.connect(self.stopEvent) def buttonEvent(self): sender = self.sender() if sender == self.start: self.startEvent() # elif sender == self.pause: # self.pauseEvent() elif sender == self.stop: self.stopEvent() elif sender == self.switch: self.switchEvent() elif sender == self.map: self.mapEvent() # start simulation def startEvent(self): message = 'start the simulation' self.log.info(message) Signal.get_signal().emit_signal_str(message) # fix rl algorithm globalInformation.set_value(strings.IS_STOP, False) OperationalPlanning.interval = 0 OperationalPlanning.start_or_pause = True OperationalPlanning.stop = False self.qtime.start(1000) def playWithHuman(): subprocess.Popen(strings.PLAY_WITH_HUMAN) def playWithMachine(): """ map_name = '3m' difficulty = '3' param_set = {} param_set['gamma'] = 0.99 param_set['td_lambda'] = 0.8 param_set['learning_rate'] = 0.0005 param_set['alpha'] = 0.99 param_set['eps'] = 1e-05 param_set['epsilon_start'] = 1 param_set['epsilon_end'] = 0.01 param_set['time_length'] = 100000 param_set['grad_norm_clip'] = 10 param_set['before_learn'] = 50 param_set['batch_size'] = 16 param_set['target_update_interval'] = 400 # # # iql set # param_set['algorithm'] = 'iql_CT' # path = '../model/' + map_name + '_iql_CT_3/' # COMA set param_set['algorithm'] = 'COMA' path = '../model/' + map_name + '_COMA_3/' param_set['map_name'] = map_name param_set['difficulty'] = difficulty param_set['path'] = path param_set['load_model'] = True param_set['test'] = True # self.algorithm = MARL() # self.algorithmThread = threading.Thread( # target=self.algorithm.algorithm(param_set), # name='StarCraft2Thread') """ # self.algorithm = AlgorithmAgent() # self.algorithm.start() self.algorithm = MasterAgent() self.algorithm.start() if globalInformation.get_value('pattern') == strings.HUMAN_VS_MACHINE: playWithHuman() elif globalInformation.get_value('pattern') == strings.MACHINE_VS_MACHINE: playWithMachine() # Signal.get_signal().emit_signal_none() # pause simulation def pauseEvent(self): message = 'pause the simulation' self.log.info(message) Signal.get_signal().emit_signal_str(message) if OperationalPlanning.stop: return if OperationalPlanning.start_or_pause: self.qtime.stop() OperationalPlanning.start_or_pause = False else: self.qtime.start(1000) OperationalPlanning.start_or_pause = True # stop simulation def stopEvent(self): message = 'stop the simulation' self.log.info(message) Signal.get_signal().emit_signal_str(message) self.qtime.stop() OperationalPlanning.start_or_pause = False OperationalPlanning.stop = True globalInformation.set_value(strings.IS_STOP, True) # a description of current map def mapEvent(self): message = 'open the map description' self.log.info(message) Signal.get_signal().emit_signal_str(message) self.window = FramelessWindow('map description') self.dialog = QDialog() mapDialog = MapDescriptionDialog() mapDialog.setupUi(self.dialog) self.dialog.setModal(True) self.window.setWidget(self.dialog) self.initFrameLessWindow( QSize(700, 600), 'Operational Planning', QIcon('../resource/drawable/logo.png') ) self.window.show() # self.dialog.show() # switch policy of a dialog # there is a description of each algorithm def switchEvent(self): message = 'switch policy' self.log.info(message) Signal.get_signal().emit_signal_str(message) self.window = FramelessWindow('switch policy') self.dialog = QDialog() # tab item name list_str = [ strings.ALGORITHM_COMA, strings.ALGORITHM_COMMNET_COMA, strings.ALGORITHM_QMIX, strings.ALGORITHM_QTRAN_ALT, strings.ALGORITHM_QTRAN_BASE, strings.ALGORITHM_VDN ] # item content list_item = [ strings.CLASS_ALGORITHM_COMA, strings.CLASS_ALGORITHM_COMMNET_COMA, strings.CLASS_ALGORITHM_QMIX, strings.CLASS_ALGORITHM_QTRAN_ALT, strings.CLASS_ALGORITHM_QTRAN_BASE, strings.CLASS_ALGORITHM_VDN ] # title name self.listDialog = ListDialog(list_str, list_item, strings.OPERATIONAL_PLANNING_TITLE, strings.TYPE_POLICY) self.listDialog.setupUi(self.dialog, self.window) self.window.setWidget(self.dialog) self.initFrameLessWindow( QSize(700, 600), 'Operational Planning', QIcon('../resource/drawable/logo.png') ) self.window.show() # self.dialog.setModal(True) # self.dialog.show() def initFrameLessWindow(self, size, title, icon): self.window.resize(size) self.window.setWindowTitle(title) self.window.setWindowIcon(icon)
class WindowGraphShow(QWidget): def __init__(self): super(WindowGraphShow, self).__init__() self.judge_close = True self.initUI() def show(self): self.judge_close = False super(WindowGraphShow, self).show() def initUI(self): self.setWindowTitle('Graph') self.setFixedSize(1000, 800) self.list_channel = QListWidget(self) self.stack_window = QStackedWidget(self) self.channel_monitor = QWidget() self.graph_control = QWidget() layout_main = QHBoxLayout(spacing=0) layout_main.setContentsMargins(0, 0, 0, 0) layout_main.addWidget(self.list_channel) layout_main.addWidget(self.stack_window) layout_main.addWidget(self.channel_monitor) layout_main.addWidget(self.graph_control) self.setLayout(layout_main) """# List Channel""" self.list_channel.setFrameShape(QListWidget.NoFrame) self.list_channel.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.list_channel.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.list_channel.currentRowChanged.connect(self.stack_window.setCurrentIndex) self.list_channel.setStyleSheet(""" QListWidget{ min-width: 150px; max-width: 150px; color: white; background: grey; } """) font = QFont() font.setFamily('MonoxLight') font.setPointSize(20) for i in range(6): item = QListWidgetItem() item.setFont(font) item.setText('%03d - %03d' % (32*i + 1, 32*(i + 1))) item.setSizeHint(QSize(0, 60)) item.setTextAlignment(Qt.AlignCenter) self.list_channel.addItem(item) item = QListWidgetItem() item.setFont(font) item.setText('Custom') item.setSizeHint(QSize(0, 60)) item.setTextAlignment(Qt.AlignCenter) self.list_channel.addItem(item) """# Stack Window""" self.list_page_widget = [] self.list_graph_show = [] self.list_layout_page = [] self.list_tabwidget = [] pg.setConfigOption('background', 'w') pg.setConfigOption('foreground', 'k') list_stringaxis = [] for i in range(7): list_stringaxis.append(CustomAxis({1:'a', 2: 'b'}, orientation='left')) self.list_page_widget.append(QWidget()) self.list_graph_show.append(PlotWidgetCol(axisItems={'left':list_stringaxis[i]})) self.list_layout_page.append(QHBoxLayout()) self.list_layout_page[i].setContentsMargins(0, 0, 0, 0) self.list_tabwidget.append(QTabWidget()) for i in range(7): self.list_page_widget[i].setLayout(self.list_layout_page[i]) self.list_layout_page[i].addWidget(self.list_tabwidget[i]) self.stack_window.addWidget(self.list_page_widget[i]) tab_graph = QWidget() tab_monitor = QWidget() self.list_tabwidget[i].addTab(tab_graph, 'Graph') self.list_tabwidget[i].addTab(tab_monitor, 'Monitor') layout_page = QHBoxLayout() layout_graph = QHBoxLayout() layout_graph.addWidget(self.list_graph_show[i]) tab_graph.setLayout(layout_graph) layout_monitor = QGridLayout() tab_monitor.setLayout(layout_monitor) tab_custom_option = QWidget() layout_tab_custom_option = QVBoxLayout() tab_custom_option.setLayout(layout_tab_custom_option) self.list_tabwidget[6].addTab(tab_custom_option, 'Select') """# Page Custom Tab Select""" layout_tab_custom_option_up = QHBoxLayout() layout_tab_custom_option_mid = QHBoxLayout() layout_tab_custom_option_down = QHBoxLayout() layout_tab_custom_option.addLayout(layout_tab_custom_option_up) layout_tab_custom_option.addLayout(layout_tab_custom_option_mid) layout_tab_custom_option.addLayout(layout_tab_custom_option_down) font = QFont() font.setFamily('MonoxLight') font.setPointSize(12) label_custom_select_num = QLabel('Profile ID ') label_custom_select_num.setFont(font) self.label_custom_select_num = QLabel('00 / 32') self.label_custom_select_num.setFont(font) self.lineedit_custom_select_num = QLineEdit(16*'0' + '-' + 16*'0' + '-' + 16*'0') self.lineedit_custom_select_num.setFont(font) self.data_lineedit_custom_select_num = self.lineedit_custom_select_num.text() self.pushbutton_custom_select_num = QPushButton('&Ok') layout_tab_custom_option_up.addWidget(label_custom_select_num) layout_tab_custom_option_up.addWidget(self.lineedit_custom_select_num) layout_tab_custom_option_up.addWidget(self.pushbutton_custom_select_num) layout_tab_custom_option_down.addStretch(1) layout_tab_custom_option_down.setAlignment(Qt.AlignBottom) layout_tab_custom_option_down.addWidget(self.label_custom_select_num) groupbox_custom_option_channel_a = QGroupBox('A') groupbox_custom_option_channel_a.setAlignment(Qt.AlignCenter) groupbox_custom_option_channel_a.setStyleSheet(""" QGroupBox{ font-family: MonoxRegular; font-size: 20px; } """) groupbox_custom_option_channel_b = QGroupBox('B') groupbox_custom_option_channel_b.setAlignment(Qt.AlignCenter) groupbox_custom_option_channel_b.setStyleSheet(""" QGroupBox{ font-family: MonoxRegular; font-size: 20px; } """) groupbox_custom_option_channel_c = QGroupBox('C') groupbox_custom_option_channel_c.setAlignment(Qt.AlignCenter) groupbox_custom_option_channel_c.setStyleSheet(""" QGroupBox{ font-family: MonoxRegular; font-size: 20px; } """) self.list_checkbox_channel = [] for i in range(192): checkbox_select = QCheckBox('%03i' % (i + 1)) checkbox_select.setStyleSheet(""" QCheckBox{ font-family: MonoxRegular; font-size: 15px; } """) self.list_checkbox_channel.append(checkbox_select) layout_tab_custom_option_mid.addWidget(groupbox_custom_option_channel_a) layout_tab_custom_option_mid.addWidget(groupbox_custom_option_channel_b) layout_tab_custom_option_mid.addWidget(groupbox_custom_option_channel_c) list_layout_custom_option_channel_global = [] for i in range(3): list_layout_custom_option_channel_global.append(QHBoxLayout()) groupbox_custom_option_channel_a.setLayout(list_layout_custom_option_channel_global[0]) groupbox_custom_option_channel_b.setLayout(list_layout_custom_option_channel_global[1]) groupbox_custom_option_channel_c.setLayout(list_layout_custom_option_channel_global[2]) list_layout_custom_option_channel = [] num = 12 for i in range(num): list_layout_custom_option_channel.append(QVBoxLayout()) list_layout_custom_option_channel[i].setAlignment(Qt.AlignCenter) for i in range(3): for j in range(num // 3): list_layout_custom_option_channel_global[i].addLayout(list_layout_custom_option_channel[(num // 3)*i + j]) for i in range(num): for j in range(192 // num): list_layout_custom_option_channel[i].addWidget(self.list_checkbox_channel[(192 // num)*i + j]) layout_graph_control = QVBoxLayout() layout_graph_control.setAlignment(Qt.AlignBottom) #layout_graph_control.setSpacing() self.graph_control.setLayout(layout_graph_control) self.lcdnumber_countdown = QLCDNumber() self.lcdnumber_countdown.setDigitCount(4) self.lcdnumber_countdown.setMode(QLCDNumber.Dec) self.lcdnumber_countdown.setSegmentStyle(QLCDNumber.Flat) self.lcdnumber_countdown.setStyleSheet(""" QLCDNumber{ min-width: 150px; max-width: 150px; min-height: 80px; max-height: 80px; } """) layout_graph_control.addWidget(self.lcdnumber_countdown) self.lcdnumber_countdown_num = QLCDNumber() self.lcdnumber_countdown_num.setDigitCount(4) self.lcdnumber_countdown_num.setMode(QLCDNumber.Dec) self.lcdnumber_countdown_num.setSegmentStyle(QLCDNumber.Flat) self.lcdnumber_countdown_num.setStyleSheet(""" QLCDNumber{ min-width: 150px; max-width: 150px; min-height: 80px; max-height: 80px; } """) layout_graph_control.addWidget(self.lcdnumber_countdown_num) self.pushbutton_graph_save = QPushButton('Save') self.pushbutton_graph_save.setStyleSheet(""" QPushButton{ min-width: 150px; min-height: 60px; } """) widget_control_button = QWidget() widget_control_button.setStyleSheet(""" QWidget{ min-height: 300px; } """) layout_graph_control_button = QVBoxLayout() widget_control_button.setLayout(layout_graph_control_button) layout_graph_control_button.setAlignment(Qt.AlignBottom) layout_graph_control_button.addWidget(self.pushbutton_graph_save) layout_graph_control.addWidget(widget_control_button) def closeEvent(self, e): self.judge_close = True super(WindowGraphShow, self).closeEvent(e) def isClosed(self): return self.judge_close
class timer(QMainWindow): def __init__(self): super(timer, self).__init__() self.initial_variables() #zd self.init_ui() self.show() def init_ui(self): self.time = QTimer(self) self.time.setInterval(1000) self.time.timeout.connect(self.refresh) self.time.timeout.connect(self.skip_day) #zd self.time_start_up = QTime(0, 0, 0) #正计时的开始时间 self.time_start_fall = QTime(23, 59, 59) #倒计时结束时分秒 self.time_start_data = QDate.currentDate() #倒计时结束年月日 self.time_system = QTimer(self) self.time_system.setInterval(1000) self.time_system.timeout.connect(self.refresh_system) self.time_system.start() self.hour = 0 #暂停前已经记录的时分秒 self.minute = 0 self.second = 0 self.interval = 0 self.time.start() self.init_window() self.init_lcd() self.init_Button() self.init_bar() self.init_label() def init_window(self): self.resize(900, 600) self.setWindowTitle('觅时') self.setWindowIcon(QIcon('./images/others/icon.png')) self.image_file = "./images/background/timg.png" mixer.init() self.sound = mixer.music.load( "./sound/Berliner Philharmoniker.mp3") #默认背景音乐 mixer.music.play(-1, 0.0) def init_bar(self): self.statusBar() menubar = self.menuBar() menubar.setNativeMenuBar(False) background_menu = menubar.addMenu('背景图片') sound_menu = menubar.addMenu('背景音乐') model_menu = menubar.addMenu('窗口模式') self.open_picture_action = QAction('本地图片', self) background_menu.addAction(self.open_picture_action) self.open_picture_action.triggered.connect(self.open_picture) self.open_music_action = QAction('本地音乐', self) self.stop_music_action = QAction('音乐暂停', self) self.continue_music_action = QAction('音乐继续', self) self.start_music_action = QAction('从头播放', self) sound_menu.addAction(self.open_music_action) sound_menu.addAction(self.stop_music_action) sound_menu.addAction(self.continue_music_action) sound_menu.addAction(self.start_music_action) self.open_music_action.triggered.connect(self.open_music) self.stop_music_action.triggered.connect(self.stop_music) self.continue_music_action.triggered.connect(self.continue_music) self.start_music_action.triggered.connect(self.start_music) self.float_action = QAction('悬浮窗', self) self.normal_action = QAction('正常窗口', self) model_menu.addAction(self.float_action) model_menu.addAction(self.normal_action) self.float_action.triggered.connect(self.float) self.normal_action.triggered.connect(self.normal) def open_picture(self): #选择本地图片 self.image_file, _ = QFileDialog.getOpenFileName( self, 'Open file', './images/background', 'Image files (*.jpg *.gif *.png *.jpeg)') self.setAutoFillBackground(True) if path.exists(self.image_file) == False: return palette = QPalette() palette.setBrush( QPalette.Background, QBrush( QPixmap(self.image_file).scaled(self.size(), Qt.IgnoreAspectRatio, Qt.SmoothTransformation))) self.setPalette(palette) def open_music(self): #选择本地音乐 self.music_file, _ = QFileDialog.getOpenFileName( self, 'Open file', './sound', 'Image files (*.mp3 *.wan *.midi)') if path.exists(self.music_file) == False: return mixer.init() self.sound = mixer.music.load(self.music_file) mixer.music.play(-1, 0.0) def stop_music(self): #音乐暂停 mixer.music.pause() def continue_music(self): #音乐继续 mixer.music.unpause() def start_music(self): #音乐从头开始 mixer.music.play() def init_lcd(self): #正计时LCD self.lcd1 = QLCDNumber(self) self.lcd1.setStyleSheet("background: transparent;font-size:50000px") self.lcd1.setObjectName("lcd1") self.lcd1.setDigitCount(12) self.lcd1.setMode(QLCDNumber.Dec) self.lcd1.setSegmentStyle(QLCDNumber.Flat) self.lcd1.setVisible(True) #倒计时LCD self.lcd2 = QLCDNumber(self) self.lcd2.setStyleSheet("background: transparent;font-size:50000px") self.lcd2.setObjectName("lcd2") self.lcd2.setDigitCount(12) self.lcd2.setMode(QLCDNumber.Dec) self.lcd2.setSegmentStyle(QLCDNumber.Flat) self.lcd2.setVisible(False) #系统时间LCD self.lcd3 = QLCDNumber(self) self.lcd3.setStyleSheet( "background: transparent;font-size:50000px;color:rgb(255,255,255)") self.lcd3.setObjectName("lcd3") self.lcd3.setDigitCount(12) self.lcd3.setMode(QLCDNumber.Dec) self.lcd3.setSegmentStyle(QLCDNumber.Flat) def init_label(self): #显示标签 self.label = QLabel("", self) self.label.setVisible(True) self.label.setFixedWidth(500) self.label.setFixedHeight(100) self.setStyleSheet( "QLabel{font-size:30px;font-weight:normal;font-family:Arial;}") self.label.setGeometry(QRect(300, 100, 20, 11)) def float(self): #进入悬浮窗 self.hide() self.resize(550, 60) # self.setWindowFlags(QtCore.Qt.WindowMinimizeButtonHint) self.lcd3.setVisible(False) self.splider.setVisible(False) self.label.setVisible(False) #self.setWindowFlags(Qt.WindowMaximizeButtonHint) self.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint) self.setAutoFillBackground(True) palette = QPalette() palette.setBrush( QPalette.Background, QBrush( QPixmap(self.image_file).scaled(self.size(), Qt.IgnoreAspectRatio, Qt.SmoothTransformation))) self.setPalette(palette) self.show() self.showNormal() def normal(self): #退出悬浮窗 self.hide() self.resize(900, 500) screen = QDesktopWidget().screenGeometry() size = self.geometry() self.move((screen.width() - size.width()) / 2, (screen.height() - size.height()) / 3) self.setWindowFlags(Qt.Widget) self.lcd3.setVisible(True) self.splider.setVisible(True) self.label.setVisible(True) self.show() def resizeEvent(self, *args, **kwargs): width = self.width() height = self.height() self.lcd1.setGeometry( QRect((width - 300) / 2, (height - 111) / 2, 300, 111)) self.lcd2.setGeometry( QRect((width - 300) / 2, (height - 111) / 2, 300, 111)) self.lcd3.setGeometry(QRect(width - 200, height - 100, 200, 111)) self.label.setGeometry(QRect((width - 75) / 2, height / 2, 300, 111)) self.setAutoFillBackground(True) palette = QPalette() palette.setBrush( QPalette.Background, QBrush( QPixmap(self.image_file).scaled(self.size(), Qt.IgnoreAspectRatio, Qt.SmoothTransformation))) self.setPalette(palette) def init_Button(self): #开始结束按钮 self.state_start_end = 0 self.pushButton = QPushButton() self.pushButton.setStyleSheet("background:transparent;") self.pushButton.setText("") icon = QIcon() icon.addPixmap(QPixmap(":/start/start.png")) self.pushButton.setIcon(icon) self.pushButton.setIconSize(QSize(30, 30)) self.pushButton.setCheckable(True) self.pushButton.setFlat(True) self.pushButton.setObjectName("开始/结束") self.pushButton.clicked.connect(self.start_end) #暂停继续按钮 self.state_continue_stop = 0 self.pushButton_2 = QPushButton() self.pushButton_2.setStyleSheet("background:transparent;") self.pushButton_2.setText("") icon1 = QIcon() icon1.addPixmap(QPixmap(":/on/stop.png")) self.pushButton_2.setIcon(icon1) self.pushButton_2.setIconSize(QSize(30, 30)) self.pushButton_2.setCheckable(True) self.pushButton_2.setFlat(True) self.pushButton_2.setObjectName("pushButton_2") self.pushButton_2.clicked.connect(self.continue_stop) #数据分析按钮 self.toolButton = QToolButton() self.toolButton.setLayoutDirection(Qt.LeftToRight) self.toolButton.setStyleSheet("background:transparent;") icon2 = QIcon() icon2.addPixmap(QPixmap(":/analytics/analytics.png"), QIcon.Normal, QIcon.Off) self.toolButton.setIcon(icon2) self.toolButton.setIconSize(QSize(30, 30)) self.toolButton.setAutoRaise(True) self.toolButton.setObjectName("toolButton") self.toolButton.clicked.connect(self.analyze) #声音播放静音按钮 self.sound_state = 0 self.pushButton_4 = QPushButton() self.pushButton_4.setStyleSheet("background:transparent;") self.pushButton_4.setText("") icon3 = QIcon() icon3.addPixmap(QPixmap(":/sound/sound.png"), QIcon.Normal, QIcon.Off) icon3.addPixmap(QPixmap(":/sound_off/Sound_off.png"), QIcon.Normal, QIcon.On) self.pushButton_4.setIcon(icon3) self.pushButton_4.setIconSize(QSize(30, 30)) self.pushButton_4.setCheckable(True) self.pushButton_4.setFlat(True) self.pushButton_4.setObjectName("pushButton_4") self.pushButton_4.clicked.connect(self.sound_renew) #self.pushButton_4.rclicked.connect(self.sound_renew()) #声音大小调节按钮 self.splider = QSlider(Qt.Horizontal) self.splider.valueChanged.connect(self.valChange) self.splider.setMinimum(0) self.splider.setMaximum(100) self.splider.setSingleStep(1) self.splider.setTickInterval(1) self.splider.setValue(100) #布局 hbox = QHBoxLayout() vbox = QVBoxLayout() hbox.addWidget(self.pushButton) hbox.addWidget(self.pushButton_2) hbox.addWidget(self.toolButton) hbox.addWidget(self.pushButton_4) hbox.addWidget(self.splider) hbox.addStretch(1) vbox.addStretch(1) vbox.addLayout(hbox) main_frame = QWidget() main_frame.setLayout(vbox) self.setCentralWidget(main_frame) def refresh(self): #正计时 self.startDate_up = QDateTime( QDate.currentDate(), self.time_start_up).toMSecsSinceEpoch() #显示正计时 self.endDate_up = QDateTime.currentMSecsSinceEpoch() interval_up = self.endDate_up - self.startDate_up + self.interval if interval_up > 0: hour = interval_up // (60 * 60 * 1000) min = (interval_up - hour * 60 * 60 * 1000) // (60 * 1000) sec = (interval_up - hour * 60 * 60 * 1000 - min * 60 * 1000) // 1000 intervals = '0' * (2 - len(str(hour))) + str( hour) + ':' + '0' * (2 - len(str(min))) + str( min) + ':' + '0' * (2 - len(str(sec))) + str(sec) self.lcd1.display(intervals) #倒计时 self.startDate_fall = QDateTime.currentMSecsSinceEpoch() #显示倒计时 self.endDate_fall = QDateTime( self.time_start_data, self.time_start_fall).toMSecsSinceEpoch() interval_fall = self.endDate_fall - self.startDate_fall - self.interval if interval_fall > 0: hour = interval_fall // (60 * 60 * 1000) min = (interval_fall - hour * 60 * 60 * 1000) // (60 * 1000) sec = (interval_fall - hour * 60 * 60 * 1000 - min * 60 * 1000) // 1000 intervals = '0' * (2 - len(str(hour))) + str( hour) + ':' + '0' * (2 - len(str(min))) + str( min) + ':' + '0' * (2 - len(str(sec))) + str(sec) self.lcd2.display(intervals) if hour == 0 and min == 0 and sec == 0: mixer.init() self.sound = mixer.music.load( "./sound/My Soul,Your Beats!.mp3") mixer.music.play(-1, 0.0) def refresh_system(self): hour = QTime.currentTime().hour() #显示系统时间 min = QTime.currentTime().minute() sec = QTime.currentTime().second() intervals = '0' * (2 - len(str(hour))) + str( hour) + ':' + '0' * (2 - len(str(min))) + str( min) + ':' + '0' * (2 - len(str(sec))) + str(sec) self.lcd3.display(intervals) def sound_renew(self): #背景音乐状态按钮 #if self.pushButton_4 == Qt.LeftButton: if self.sound_state == 0: self.sound_state = 1 mixer.music.set_volume(0.0) self.splider.setValue(0) self.splider.setEnabled(False) else: self.sound_state = 0 mixer.music.set_volume(1.0) self.splider.setValue(100) self.splider.setEnabled(True) def valChange(self): #设置音量为滑动条音量 mixer.music.set_volume(self.splider.value() / 100) def start_end(self): time_1 = QTimer(self) time_1.setInterval(1) time_1.timeout.connect(self.state_refresh) time_1.start() if self.state_start_end % 2 == 0: #任务开始 self.state_continue_stop = 1 self.statis = statistic() self.interval = 0 self.time.start() if self.state_start_end % 2 == 1: #任务结束 self.check = "无" text, ok = QInputDialog.getText(self, '任务备注', '任务备注') if ok: now_end = QDate.currentDate() print(now_end.toString(Qt.DefaultLocaleLongDate)) #结束时的年月日 time_end = QTime.currentTime() print(time_end.toString(Qt.DefaultLocaleLongDate)) #结束时的时分秒 self.new_check = QLabel(text) self.check = self.new_check.text() print('任务备注=%s' % self.check) #title self.set_end(time_end.toString(Qt.DefaultLocaleLongDate), self.check) #zd icon = QIcon() icon.addPixmap(QPixmap(":/start/start.png")) self.pushButton.setIcon(icon) icon1 = QIcon() icon1.addPixmap(QPixmap(":/on/stop.png")) self.pushButton_2.setIcon(icon1) if self.statis.time_button == 1: mixer.music.stop() mixer.music.load("./sound/Berliner Philharmoniker.mp3") mixer.music.play(-1, 0.0) self.time.stop() else: #没有确认退出 self.state_start_end += 1 self.state_start_end += 1 def state_refresh(self): if self.statis.state == 1: self.statis.state = 0 #print(self.statis.label_return)#标签 start = QDate.currentDate() #print(start.toString(Qt.DefaultLocaleLongDate))#开始的年月日 time_start = QTime.currentTime() print(time_start.toString(Qt.DefaultLocaleLongDate)) #开始的时分秒 self.set_begin( start.toString(Qt.DefaultLocaleLongDate), #zd time_start.toString(Qt.DefaultLocaleLongDate), self.statis.label_return) icon = QIcon() icon.addPixmap(QPixmap(":/over/over.png")) self.pushButton.setIcon(icon) icon1 = QIcon() icon1.addPixmap(QPixmap(":/stop/on.png")) self.pushButton_2.setIcon(icon1) self.label.setText(self.statis.label_return) if self.statis.time_button == 0: self.time_start_up = time_start self.lcd1.setVisible(True) self.lcd2.setVisible(False) else: hour = int(time_start.hour()) + int( self.statis.hour_time_return) minute = int(time_start.minute()) + int( self.statis.minute_time_return) second = int(time_start.second()) + int( self.statis.second_time_return) msec = int(self.statis.hour_time_return) * 3600 * 1000 + int( self.statis.minute_time_return) * 60 * 1000 + int( self.statis.second_time_return) * 1000 self.time_start_data = start if second >= 60: minute += 1 if minute >= 60: hour += 1 if hour >= 24: self.time_start_data = start.addDays(1) self.time_start_up = time_start self.time_start_fall = time_start.addMSecs(msec) self.lcd1.setVisible(False) self.lcd2.setVisible(True) if self.statis.state == 2: self.statis.state = 0 self.state_start_end += 1 def continue_stop(self): #暂停继续 self.state_continue_stop += 1 if self.state_start_end % 2 == 1 and self.state_continue_stop % 2 == 1: self.statis.state = 1 self.state_refresh() icon1 = QIcon() icon1.addPixmap(QPixmap(":/stop/on.png")) self.pushButton_2.setIcon(icon1) self.time.start() if self.state_start_end % 2 == 1 and self.state_continue_stop % 2 == 0: self.check = "无" text, ok = QInputDialog.getText(self, '任务备注', '任务备注') if ok: now_end = QDate.currentDate() print(now_end.toString(Qt.DefaultLocaleLongDate)) #结束时的年月日 time_end = QTime.currentTime() print(time_end.toString(Qt.DefaultLocaleLongDate)) #结束时的时分秒 self.new_check = QLabel(text) self.check = self.new_check.text() print('任务备注=%s' % self.check) #title self.set_end(time_end.toString(Qt.DefaultLocaleLongDate), self.check) #zd self.set_begin(now_end.toString(Qt.DefaultLocaleLongDate), time_end.toString(Qt.DefaultLocaleLongDate), '') icon1 = QIcon() icon1.addPixmap(QPixmap(":/on/stop.png")) self.pushButton_2.setIcon(icon1) self.interval += self.time_start_up.msecsTo(time_end) if self.interval < 0: self.interval += 86400 * 1000 self.time.stop() else: self.state_continue_stop += 1 #每次开始会调用 def set_begin(self, year, begin_time, tags): # zd # 年的格式转化 self.task_is_on = True def year_transform(year): new_year = '' for i in year: if i >= '0' and i <= '9': new_year = new_year + i else: new_year = new_year + '/' return new_year[:-1] self.year = year_transform(year) self.begin_time = begin_time if tags: self.tags = tags #结束或者暂停会调用 用于写入数据库 def set_end(self, end_time, title): #zd self.task_is_on = False # 判断是否大于1分钟,是则返回true否则false def cmp_1min(time1, time2): # print('begin compare') #print(time1+' '+time2) t1 = time1.split(':') t1 = [int(x) for x in t1] t2 = time2.split(':') t2 = [int(x) for x in t2] # print('interval is {}'.format(60*( 60*(t2[0]-t1[0])+(t2[1]-t1[1]) )+(t2[2]-t1[2]))) return 60 * (60 * (t2[0] - t1[0]) + (t2[1] - t1[1])) + (t2[2] - t1[2]) >= 60 if not cmp_1min(self.begin_time, end_time): print('小于1分钟,不予计入') QMessageBox.warning(self, '提示', '小于1分钟,不予计入', QMessageBox.Yes) return obj = { 'title': title, 'phase': (self.year, self.begin_time, end_time), 'tags': self.tags } if not obj['title']: obj['title'] = '(无)' print(obj) with open('./data/tasks', 'a') as f: f.write(dumps(obj) + '\n') with open('./data/date_list', 'r') as f: date_list = [x.strip() for x in f.readlines()] if self.year in date_list: return with open('./data/date_list', 'a') as f: f.write(self.year + '\n') print('加入新日期') #调用数据分析窗口 def analyze(self): self.anayze_window_opened = True self.anayze_window = analysis() def closeEvent(self, QCloseEvent): res = QMessageBox.question(self, '消息', '是否关闭这个窗口?', QMessageBox.Yes | QMessageBox.No, QMessageBox.No) if res == QMessageBox.Yes: if self.anayze_window_opened: self.anayze_window.close() if self.task_is_on: self.set_end( QTime.currentTime().toString(Qt.DefaultLocaleLongDate), '(无任务名)') QCloseEvent.accept() else: QCloseEvent.ignore() def initial_variables(self): #zd self.anayze_window_opened = False self.task_is_on = False self.year = '' self.tt = 0 def skip_day(self): if not self.task_is_on: return # 年的格式转化 def year_transform(year): new_year = '' for i in year: if i >= '0' and i <= '9': new_year = new_year + i else: new_year = new_year + '/' return new_year[:-1] #last_time = QTime.currentTime().toString(Qt.DefaultLocaleLongDate) last_date = QDate.currentDate().toString(Qt.DefaultLocaleLongDate) if self.year != year_transform(last_date): print('天数不同!!!') self.set_end('23:59:59', '(无)') self.set_begin(last_date, '00:00:00', self.tags) def test(self): self.tt += 1 print('悬浮窗第{}次'.format(self.tt))
class WindowFingerTest(QWidget): """ DocString for WindowFingerTest""" def __init__(self, ): #@todo: to be defined. super(WindowFingerTest, self).__init__() self.order_finger = True self.list_finger_value = [72, 72, 72, 72, 72] self.initUI() def initUI(self, ): """DocString for initUI""" #@todo: to be defined. lcd_number_style = 'QLCDNumber{\ min-width: 150px;\ max-width: 150px;\ min-height: 80px;\ max-height: 80px;\ }' pushbutton_style = 'QPushButton{\ min-width: 150px;\ max-width: 150ox;\ min-height: 80px;\ max-height: 80px;\ }' self.setWindowTitle('Test') self.setFixedSize(700, 800) self.list_test_widget = [ FingerTest(), FingerTest(), FingerTest(), FingerTest(), FingerTest() ] size = (100, 775) for i in range(len(self.list_finger_value)): self.list_test_widget[i].setText('', False) for i in range(5): self.list_test_widget[i].setSize(size, False) layout_main = QHBoxLayout() layout_finger_test = QHBoxLayout() layout_control = QVBoxLayout() for i in range(5): layout_finger_test.addWidget(self.list_test_widget[i]) self.setLayout(layout_main) self.lcdnumber_countdown = QLCDNumber() self.lcdnumber_countdown.setDigitCount(4) self.lcdnumber_countdown.setMode(QLCDNumber.Dec) self.lcdnumber_countdown.setSegmentStyle(QLCDNumber.Flat) self.lcdnumber_countdown.setStyleSheet(lcd_number_style) self.lcdnumber_countdown_num = QLCDNumber() self.lcdnumber_countdown_num.setDigitCount(4) self.lcdnumber_countdown_num.setMode(QLCDNumber.Dec) self.lcdnumber_countdown_num.setSegmentStyle(QLCDNumber.Flat) self.lcdnumber_countdown_num.setStyleSheet(lcd_number_style) self.pushbutton_change_hand = QPushButton('Change hand') self.pushbutton_change_hand.setStyleSheet(pushbutton_style) self.pushbutton_start = QPushButton('Start') self.pushbutton_start.setStyleSheet(pushbutton_style) widget = QWidget() widget.setMinimumSize(20, 300) layout_control.addWidget(widget) layout_control.addWidget(self.lcdnumber_countdown) layout_control.addWidget(self.lcdnumber_countdown_num) layout_control.addWidget(widget) layout_control.addWidget(self.pushbutton_change_hand) layout_control.addWidget(self.pushbutton_start) layout_main.addLayout(layout_finger_test) layout_main.addLayout(layout_control)
class MyTime(QWidget): def __init__(self): super().__init__() self.initUI() self.init_timer() def update_time(self): '''更新时间''' self.lcd.display(time.strftime('%X', time.localtime())) def init_timer(self): '''时间的显示''' self.timer = QTimer() # 设置定时器时间,每一秒触发一次 触发timeout方法 self.timer.setInterval(1000) # 启动定时器 self.timer.start() # 定时器触发调用时间更新方法 self.timer.timeout.connect(self.update_time) def initUI(self): '''窗口大小 参数:高度,宽度 ''' self.resize(250, 150) # 标题 self.setWindowTitle('电子时钟') self.move_center() # 显示组件 self.lcd = QLCDNumber() # 要显示的数字个数 self.lcd.setDigitCount(10) # 采用十进制模式 self.lcd.setMode(QLCDNumber.Dec) # 设置平面模式 self.lcd.setSegmentStyle(QLCDNumber.Flat) # 时间元组 time.localtime()设置本地时间 self.lcd.display(time.strftime('%X', time.localtime())) # 构建一个盒子布局 self.main_layout = QVBoxLayout() # 把上面的组件添加到盒子布局中 self.main_layout.addWidget(self.lcd) # 设置组件的位置,设置居中 self.main_layout.setAlignment(Qt.AlignCenter) # 设置给顶层布局 self.setLayout(self.main_layout) # 设置颜色 self.main_p = QPalette() # 设置背景色 self.main_p.setColor(QPalette.Background, Qt.darkCyan) # 自动填充背景颜色 self.setAutoFillBackground(True) # 颜色设置给住窗口 self.setPalette(self.main_p) # 显示界面 self.show() def move_center(self): '''设置矩形''' my_rect = self.frameGeometry() # 获取整个屏幕的中心 w_center_point = QDesktopWidget().availableGeometry().center() my_rect.moveCenter(w_center_point) # # 从左上角开始移动,直到中间 self.move(my_rect.topLeft())
class MyTime(QWidget): def __init__(self): super().__init__() self.initUI() self.init_timer() #UI界面搭建 def update_time(self): self.lcd.display(time.strftime('%X', time.localtime())) def init_timer(self): self.timer=QTimer() self.timer.setInterval(1000)#设置定时器 1S触发一次 self.timer.start()#启动定时器 self.timer.timeout.connect(self.update_time) def initUI(self): self.resize(400,200) self.setWindowTitle("创意时钟") self.setWindowIcon(QIcon('xiaomayun.jpg')) #初始化 调色板 self.pl=QPalette() self.pl.setColor(QPalette.Background,Qt.darkYellow) self.setAutoFillBackground(True) self.setPalette(self.pl)#设置顶层布局 self.lcd=QLCDNumber() #初始化lcd self.lcd.setDigitCount(10)#设置数字个数 self.lcd.setMode(QLCDNumber.Dec)#数字十进制 self.lcd.setSegmentStyle(QLCDNumber.Flat)#平面模式 self.lcd.display(time.strftime('%X',time.localtime())) ##初始化盒子布局 self.box_layout=QVBoxLayout() self.box_layout.addWidget(self.lcd)#添加LCD组件 self.box_layout.setAlignment(Qt.AlignCenter)#设置组件在布局中间 self.setLayout(self.box_layout)#设置窗体布局 self.btn = QPushButton('Button', self) self.btn.setToolTip('This is a <b>QPushButton</b> widget') self.btn.resize(self.btn.sizeHint()) self.btn.move(50, 50) self.btn.clicked.connect(self.on_click) self.box_layout.addWidget(self.btn) # btn.move(50, 50) self.qbtn = QPushButton('Quit', self) self.qbtn.clicked.connect(QCoreApplication.instance().quit) self.qbtn.resize(self.qbtn.sizeHint()) self.qbtn.move(300, 150) self.show() """创建鼠标点击事件""" def on_click(self): print("PyQt5 button click") def closeEvent(self, event): reply = QMessageBox.question(self, 'Message', "Are you sure to quit?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No) # 第一个字符串的内容被显示在标题栏上。第二个字符串是对话框上显示的文本。第三个参数指定了显示在对话框上的按钮集合。最后一个参数是默认选中的按钮。 if reply == QMessageBox.Yes: event.accept() else: event.ignore()
class MyTime(QWidget): """ 面向对象的特点:封装、继承、多态---(类、方法、数据) __init__是python语言里面的构造方法 """ #构造方法 def __init__(self): # 用于解决多重继承的问题 super().__init__() self.initUI() self.init_timer() #设置 更新时间 def update_time(self): #通过时间无组 获取本地系统时间,作为显示时间 x:03 23 19j 是日期, 大写X 表示时钟09:46:54 #print(strftime('%Y-%m-%d %H:%M:%S', localtime())) self.lcd.display(time.strftime('%X', time.localtime())) #设置定时器 def init_timer(self): #初始化定时器 self.timer = QTimer() #设置发送信号的间隔时间 self.timer.setInterval(1000) self.timer.start() #发送信号 self.timer.timeout.connect(self.update_time) #绘制UI界面 def initUI(self): #设置窗口显示组件大小 self.resize(260, 150) #设置标题 self.setWindowTitle("创意个性的LCD电子时钟") #设置图标 self.setWindowIcon(QIcon('logo.png')) #初始化 调色板 self.plt = QPalette() #设置背景颜色 self.plt.setColor(QPalette.Background, Qt.darkYellow) #设置窗体自动填充背景颜色 self.setAutoFillBackground(True) #设置给顶层布局 self.setPalette(self.plt) self.show() #初始化LCD组件 self.lcd = QLCDNumber() #设置显示的个数 self.lcd.setDigitCount(10) #设置显示的模式为十进制 self.lcd.setMode(QLCDNumber.Dec) # 设置当前显示的样式为平面模式 self.lcd.setSegmentStyle(QLCDNumber.Flat) #初始化盒子布局 self.box = QVBoxLayout() #将显示的组件添加到盒子布局里面 self.box.addWidget(self.lcd) self.box.setAlignment(Qt.AlignCenter) #设置窗口背景透明 self.setWindowOpacity(1) #self.setAttribute(QtCore.Qt.WA_TransIucentBackground) # 设置给顶层布局 self.setLayout(self.box) #设置布局内部件的间隙来把哪条缝隙去除掉 self.box.setSpacing(0)
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 RecordUI(QWidget): def __init__(self): super().__init__() self._running = False self.drivers = get_drivers() # ui self.input_lb = QLabel("Input", self) self.output_lb = QLabel("Output", self) self.input_driver_lb = QLabel('Driver', self) self.output_driver_lb = QLabel('Driver', self) self.input_device_lb = QLabel('Device', self) self.output_device_lb = QLabel('Device', self) self.signal_lb = QLabel('Signal', self) self.customized_signal_file = MyLineEdit(self) self.save_dir = MyLineEdit(self) self.dir1 = QLineEdit(self) self.dir2 = QLineEdit(self) self.filename = QLineEdit(self) self.input_driver = QComboBox() self.output_driver = QComboBox() self.input_device = QComboBox() self.output_device = QComboBox() self.signal = QComboBox() self.start = QPushButton('Start', self) self.stop = QPushButton('Stop', self) self.time = QLCDNumber() self.time.setMinimumHeight(100) self.time.setDigitCount(5) self.time.setMode(QLCDNumber.Dec) self.time.setSegmentStyle(QLCDNumber.Flat) self.time.display("00.00") self.record_thread = recordtool.Record(self.time) self.initUI() def initUI(self): # 全局vbox vbox = QVBoxLayout() # 输入输出设备选择初始化 input_box, output_box = self.init_audio_io() vbox.addWidget(self.input_lb) vbox.addLayout(input_box) vbox.addWidget(self.output_lb) vbox.addLayout(output_box) # 信号选择初始化 singal_box = self.init_signal() vbox.addLayout(singal_box) # 存储路径初始化 sf_box = self.init_save_file() vbox.addLayout(sf_box) # 开始结束按键初始化 ss_box = self.init_button() vbox.addLayout(ss_box) vbox.addWidget(self.time) self.setLayout(vbox) self.resize(800, 320) self.center() self.setWindowTitle('Gesture Recorder') self.show() def center(self): # 获得窗口 qr = self.frameGeometry() # 获得屏幕中心点 cp = QDesktopWidget().availableGeometry().center() # 显示到屏幕中心 qr.moveCenter(cp) self.move(qr.topLeft()) def init_audio_io(self): input_box = QHBoxLayout() input_box.addWidget(self.input_driver_lb) input_box.addWidget(self.input_driver) input_box.addWidget(self.input_device_lb) input_box.addWidget(self.input_device) input_box.setStretch(0, 1) input_box.setStretch(1, 1) input_box.setStretch(2, 1) input_box.setStretch(3, 6) self.input_driver.addItems([driver['name'] for driver in self.drivers]) self.input_driver.activated[str].connect(self.on_input_drive_selected) output_box = QHBoxLayout() output_box.addWidget(self.output_driver_lb) output_box.addWidget(self.output_driver) output_box.addWidget(self.output_device_lb) output_box.addWidget(self.output_device) output_box.setStretch(0, 1) output_box.setStretch(1, 1) output_box.setStretch(2, 1) output_box.setStretch(3, 6) self.output_driver.addItems( [driver['name'] for driver in self.drivers]) self.output_driver.activated[str].connect( self.on_output_drive_selected) return input_box, output_box def on_input_drive_selected(self, driver): input_devices = get_devices(self.drivers, kind='Input', driver=driver) self.input_device.clear() self.input_device.addItems( [f"{device['id']}:{device['name']}" for device in input_devices]) def on_output_drive_selected(self, driver): output_devices = get_devices(self.drivers, kind='Output', driver=driver) self.output_device.clear() self.output_device.addItems( [f"{device['id']}:{device['name']}" for device in output_devices]) def init_signal(self): signal_box = QHBoxLayout() signal_box.addWidget(self.signal_lb) signal_box.setStretchFactor(self.signal_lb, 1) signal_box.addWidget(self.signal) self.signal.activated[str].connect(self.on_customized_selected) signal_box.setStretchFactor(self.signal, 1) signal_box.addWidget(self.customized_signal_file) self.customized_signal_file.setPlaceholderText("选择wav音频文件...") self.customized_signal_file.setFocusPolicy(Qt.NoFocus) self.customized_signal_file.setDisabled(True) self.customized_signal_file.clicked.connect( self.show_wav_file_dialogue) signal_box.setStretchFactor(self.customized_signal_file, 4) self.signal.addItems(get_all_types()) return signal_box def on_customized_selected(self, text): if text == 'customized': self.customized_signal_file.setDisabled(False) else: self.customized_signal_file.setDisabled(True) def show_wav_file_dialogue(self): file_name, file_type = QFileDialog.getOpenFileName( self, directory=os.getcwd(), filter='WAV Files (*.wav)') self.customized_signal_file.setText(file_name) def init_save_file(self): file_box = QHBoxLayout() file_box.addWidget(self.save_dir) self.save_dir.setFocusPolicy(Qt.NoFocus) self.save_dir.setText(os.getcwd()) self.save_dir.clicked.connect(self.show_dir_dialogue) file_box.setStretchFactor(self.save_dir, 4) file_box.addWidget(QLabel('/')) file_box.addWidget(self.dir1) self.dir1.setText('0') file_box.setStretchFactor(self.dir1, 1) file_box.addWidget(QLabel('/')) file_box.addWidget(self.dir2) self.dir2.setText('0') file_box.setStretchFactor(self.dir2, 1) file_box.addWidget(QLabel('/')) file_box.addWidget(self.filename) self.filename.setText('0') file_box.setStretchFactor(self.filename, 1) file_box.addWidget(QLabel('.wav')) return file_box def show_dir_dialogue(self): dir_name = QFileDialog.getExistingDirectory(self, directory=os.getcwd()) self.save_dir.setText(dir_name) def init_button(self): ss_box = QHBoxLayout() self.start.setStyleSheet("background-color:lightgreen") self.start.clicked.connect(self.start_playrec) ss_box.addWidget(self.start) self.stop.setStyleSheet("background-color:#CD2626") self.stop.clicked.connect(self.stop_playrec) ss_box.addWidget(self.stop) return ss_box def start_playrec(self): if not self._running: input_id = get_device_id(self.input_device.currentText()) output_id = get_device_id(self.output_device.currentText()) if input_id == -1 or output_id == -1: self.setWindowTitle("请选择输入/输出设备") return # signal_pattern可能是一个wav文件名称或者是一串信号 signal_pattern = get_signal_by_type( self.signal.currentText(), customized_signal_file=self.customized_signal_file.text()) if type(signal_pattern) == str and signal_pattern == '': self.setWindowTitle("请选择wav音频文件") return rec_path = self.create_save_path() in_d = p.get_device_info_by_index(input_id) self.record_thread.set_param(input_id, output_id, in_d['maxInputChannels'], rec_path) try: self.record_thread.play_and_record(signal_pattern) except: self.setWindowTitle("Unexpected error:" + sys.exc_info()[0]) self._running = True self.setWindowTitle("正在录制中...") else: self.setWindowTitle("已经开始录制") def stop_playrec(self): if self._running: try: self.record_thread.stop() self.setWindowTitle("停止录制") except: self.setWindowTitle("Unexpected error:" + sys.exc_info()[0]) finally: self._running = False try: num = int(self.filename.text()) num = num + 1 self.filename.setText(str(num)) except: pass else: self.setWindowTitle("还没开始录制") def create_save_path(self): path1 = os.path.join(self.save_dir.text(), self.dir1.text()) if not os.path.exists(path1): os.mkdir(path1) path2 = os.path.join(path1, self.dir2.text()) if not os.path.exists(path2): os.mkdir(path2) return os.path.join(path2, f'{self.filename.text()}.wav') # 按键录制 esc def keyPressEvent(self, e): if e.key() == Qt.Key_Escape: if self._running: self.stop_playrec() else: self.start_playrec()
class WindowGraphShow(QWidget): def __init__(self): super(WindowGraphShow, self).__init__() self.initUI() def initUI(self): self.setWindowTitle('Graph') self.setFixedSize(1000, 800) layout_main = QHBoxLayout(self) layout_control = QVBoxLayout() pg.setConfigOption('background', 'w') pg.setConfigOption('foreground', 'k') """# layout_scroll""" layout_scroll = QHBoxLayout() self.scroll_area_widget = QWidget() self.scroll_area = QScrollArea(self) self.scroll_area.setWidget(self.scroll_area_widget) layout_scroll_area = QHBoxLayout() self.graph_show = PlotWidgetCol() layout_scroll_area.addWidget(self.graph_show) self.scroll_area_widget.setLayout(layout_scroll_area) layout_scroll.addWidget(self.scroll_area) """# layout_control""" self.lcdnumber_countdown = QLCDNumber() self.lcdnumber_countdown.setDigitCount(4) self.lcdnumber_countdown.setMode(QLCDNumber.Dec) self.lcdnumber_countdown.setSegmentStyle(QLCDNumber.Flat) self.lcdnumber_countdown.setStyleSheet(""" QLCDNumber{ min-width: 150px; max-width: 150px; min-height: 80px; max-height: 80px; } """) self.lcdnumber_countdown_num = QLCDNumber() self.lcdnumber_countdown_num.setDigitCount(4) self.lcdnumber_countdown_num.setMode(QLCDNumber.Dec) self.lcdnumber_countdown_num.setSegmentStyle(QLCDNumber.Flat) self.lcdnumber_countdown_num.setStyleSheet(""" QLCDNumber{ min-width: 150px; max-width: 150px; min-height: 80px; max-height: 80px; } """) self.pushbutton_graph_save = QPushButton("Save Picture") self.pushbutton_graph_save.setStyleSheet(""" QPushButton{ min-width: 150px; min-height: 60px; } """) self.pushbutton_data_save = QPushButton("Save Data") self.pushbutton_data_save.setStyleSheet(""" QPushButton{ min-width: 150px; min-height: 60px; } """) widget = QWidget() widget.setMinimumSize(20, 300) layout_control.addWidget(widget) layout_control.addWidget(self.lcdnumber_countdown) layout_control.addWidget(self.lcdnumber_countdown_num) layout_control.addWidget(widget) layout_control.addWidget(self.pushbutton_data_save) layout_control.addWidget(self.pushbutton_graph_save) layout_main.addLayout(layout_scroll) layout_main.addLayout(layout_control)
class PaintPanel(QWidget): def __init__(self, signals, Parent=None): ''' Constructor ''' super().__init__(Parent) self.InitData(signals) # 先初始化数据,再初始化界面 self.InitView() def InitData(self, signals): ''' 初始化成员变量 ''' self.PaintBoard = PaintBoard(signals, Parent=self) # 获取颜色列表(字符串类型) self.colorList = QColor.colorNames() def InitView(self): ''' 初始化界面 ''' self.setFixedSize(*panel_resolution) self.setWindowTitle("PaintBoard Example PyQt5") # 新建一个水平布局作为本窗体的主布局 main_layout = QVBoxLayout(self) # 设置主布局内边距以及控件间距为10px main_layout.setSpacing(10) # 新建垂直子布局用于放置按键 sub_layout = QHBoxLayout() sub_layout.setContentsMargins(100, 0, 100, 0) # 设置此子布局和内部控件的间距为10px # sub_layout.setContentsMargins(10, 10, 10, 10) # ---------------------通知栏和时钟-------------------------- self.InformLayout = QHBoxLayout() self.InformWidget = QLabel('') self.InformWidget.setStyleSheet( get_qlabel_font_stylesheet(color=INFORM_MSG_COLOR, size=25)) # 设置通告栏的字体格式 self.InformLayout.addWidget(self.InformWidget) self.InformClock = QLCDNumber(self) self.InformClock.setDigitCount(3) self.InformClock.setMode(QLCDNumber.Dec) self.InformClock.setSegmentStyle(QLCDNumber.Flat) self.InformLayout.addWidget(self.InformClock) main_layout.addLayout(self.InformLayout) # --------------------------------------------------- # 在主界面左上侧放置画板 main_layout.addWidget(self.PaintBoard) # ---------------------橡皮擦-------------------------- self.EraserCheckbox = QCheckBox("使用橡皮擦") self.EraserCheckbox.setParent(self) sub_layout.addWidget(self.EraserCheckbox) # --------------------------------------------------- # splitter = QSplitter(self) # 占位符 # sub_layout.addWidget(splitter) # ------------------------笔画粗细----------------------- self.pen_thick_child_panel = QHBoxLayout() self.label_penThickness = QLabel(self) self.label_penThickness.setText("画笔粗细") self.label_penThickness.setAlignment(core.Qt.AlignRight | core.Qt.AlignVCenter) self.pen_thick_child_panel.addWidget(self.label_penThickness) self.spinBox_penThickness = QSpinBox(self) self.spinBox_penThickness.setMaximum(20) self.spinBox_penThickness.setMinimum(2) self.spinBox_penThickness.setValue( config.paint.DefaultThickness) # 默认粗细为10 self.spinBox_penThickness.setSingleStep(2) # 最小变化值为2 self.pen_thick_child_panel.addWidget(self.spinBox_penThickness) sub_layout.addLayout(self.pen_thick_child_panel) # --------------------------------------------------- # -----------------------笔划颜色------------------------- self.pen_color_child_panel = QHBoxLayout() self.label_penColor = QLabel(self) self.label_penColor.setAlignment(core.Qt.AlignRight | core.Qt.AlignVCenter) self.label_penColor.setText("画笔颜色") self.pen_color_child_panel.addWidget(self.label_penColor) self.comboBox_penColor = QComboBox(self) self.fill_color_list(self.comboBox_penColor, self.colorList, default_color) # 用各种颜色填充下拉列表 # --------------------------------------------------- # -------------------------清空画板按钮---------------------- self.pen_color_child_panel.addWidget(self.comboBox_penColor) sub_layout.addLayout(self.pen_color_child_panel) self.ctrl_child_panel = QHBoxLayout() self.btn_Clear = QPushButton("清空画板") self.btn_Clear.setParent(self) # 设置父对象为本界面 self.ctrl_child_panel.addWidget(self.btn_Clear) sub_layout.addLayout(self.ctrl_child_panel) # --------------------------------------------------- # -----------------------退出按钮----------------------- # self.btn_Quit = QPushButton("退出") # self.btn_Quit.setParent(self) # 设置父对象为本界面 # self.ctrl_child_panel.addWidget(self.btn_Quit) # --------------------------------------------------- self.InitLogic() main_layout.addLayout(sub_layout) # 将子布局加入主布局 def InitLogic(self): ''' 初始化所有组件的事件处理逻辑 ''' # 橡皮擦点击事件处理 self.EraserCheckbox.clicked.connect(self.on_eraser_checkbox_clicked) # 笔划粗细改变事件处理 self.spinBox_penThickness.valueChanged.connect( self.on_pen_thickness_change ) # 关联spinBox值变化信号和函数on_PenThicknessChange # 笔划颜色改变事件处理 self.comboBox_penColor.currentIndexChanged.connect( self.on_pen_color_change) # 关联下拉列表的当前索引变更信号与函数on_PenColorChange # 清空画板按钮事件处理 self.btn_Clear.clicked.connect(self.PaintBoard.clear) # 退出事件处理 # self.btn_Quit.clicked.connect(self.Quit) def update_inform(self, inform): self.InformWidget.setText(inform) def fill_color_list(self, comboBox, valList, defVal): ''' 填充下拉菜单中的菜单项,使用colorList填充 ''' index_default = self.colorList.index(config.paint.DefaultColor) index = 0 for color in valList: if color == defVal: index_default = index index += 1 pix = QPixmap(70, 20) pix.fill(QColor(color)) comboBox.addItem(QIcon(pix), None) comboBox.setIconSize(QSize(70, 20)) comboBox.setSizeAdjustPolicy(QComboBox.AdjustToContents) assert default_color != -1, '默认颜色在颜色列表中不存在!' comboBox.setCurrentIndex(index_default) def set_painting(self, painting): self.PaintBoard.set_paint.emit(painting) def set_clock_digit(self, number): self.InformClock.display(str(number)) def set_pen_color(self, color): self.PaintBoard.set_pen_color(color) self.comboBox_penColor.setCurrentIndex(self.colorList.index(color)) def set_pen_thickness(self, thickness): self.PaintBoard.set_pen_thickness(thickness) self.spinBox_penThickness.setValue(int(thickness)) def set_eraser(self, e): self.EraserCheckbox.setChecked(bool(e)) self.PaintBoard.set_eraser(bool(e)) def set_setting_visible(self, v): self.spinBox_penThickness.setEnabled(v) #.setVisible(v) self.comboBox_penColor.setEnabled(v) self.EraserCheckbox.setEnabled(v) self.btn_Clear.setEnabled(v) def extern_click(self, x, y): self.PaintBoard.extern_click(x, y) def extern_paint(self, ps): self.PaintBoard.extern_paint(ps) # self.update() def extern_clear(self, *args, **kwargs): self.PaintBoard.clear() def resetLastPoint(self, x, y): self.PaintBoard.reset_last_point(x, y) def on_pen_color_change(self): color_index = self.comboBox_penColor.currentIndex() color_str = self.colorList[color_index] self.PaintBoard.change_pen_color(color_str) def on_pen_thickness_change(self): penThickness = self.spinBox_penThickness.value() # print('thick change to ', penThickness) self.PaintBoard.change_pen_thickness(penThickness) def on_eraser_checkbox_clicked(self): e = self.EraserCheckbox.isChecked() self.PaintBoard.set_eraser(e) def Quit(self): self.close()