Ejemplo n.º 1
0
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"))
Ejemplo n.º 2
0
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)
Ejemplo n.º 3
0
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)
Ejemplo n.º 4
0
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()
Ejemplo n.º 5
0
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()
Ejemplo n.º 6
0
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()
Ejemplo n.º 7
0
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)
Ejemplo n.º 8
0
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)
Ejemplo n.º 9
0
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)
Ejemplo n.º 10
0
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()))
Ejemplo n.º 11
0
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()  # 窗体全屏
Ejemplo n.º 12
0
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())
Ejemplo n.º 13
0
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)
Ejemplo n.º 14
0
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")
Ejemplo n.º 15
0
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)
Ejemplo n.º 16
0
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
Ejemplo n.º 17
0
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))
Ejemplo n.º 18
0
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)
Ejemplo n.º 19
0
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())
Ejemplo n.º 20
0
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()
Ejemplo n.º 21
0
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)
Ejemplo n.º 22
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()
Ejemplo n.º 23
0
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()
Ejemplo n.º 24
0
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)
Ejemplo n.º 25
0
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()