Exemplo n.º 1
0
 def makeLCD(self,s):
     lcd = QLCDNumber()
     lcd.setSegmentStyle(2)
     lcd.setFrameStyle(QFrame.Plain)
     lcd.setSmallDecimalPoint(False)
     lcd.setStyleSheet("QLCDNumber { color: %s; background-color: %s;}"%(self.aw.lcdpaletteF[s],self.aw.lcdpaletteB[s]))
     return lcd
Exemplo n.º 2
0
class DigitalClock(QMainWindow):
    def __init__(self):
        super().__init__()
 
        self.setWindowTitle('Digital Clock - by ganesh')
        self.setGeometry(400,300,550,150)
        self.setWindowIcon(QtGui.QIcon('clock.png'))
 
        self.initUI()
        self.timer = QtCore.QTimer(self)
        self.timer.timeout.connect(self.current_time)
        self.timer.start(1000)
 
 
    def initUI(self):
        self.clock_screen = QLCDNumber(self)
        self.clock_screen.setStyleSheet("color: black; background-color: white")
        self.clock_screen.setDigitCount(8)
        self.clock_screen.setGeometry(QtCore.QRect(0, 0, 550, 150))
        self.current_time()
 
 
    def current_time(self):
        current = time.strftime("%I:%M:%S")
        self.clock_screen.display(current)
Exemplo n.º 3
0
class MyView(QWidget):
    def __init__(self, windowTitle, posX, posY, sizeX, sizeY):
        self.app = QApplication(sys.argv)
        super().__init__()
        print("MyView::__init__(windowTitle, posX, posY, sizeX, sizeY)")
        self.setGeometry(posX, posY, sizeX, sizeY)
        self.setWindowTitle(windowTitle)
	#setting up the Vertical Layout
        self.control_layout = QVBoxLayout()
        self.setLayout(self.control_layout)
	#setting up the button widget
        self.button = QPushButton()
        self.button.setFixedSize(40, 40)
        self.button.setText("+")
        self.button.clicked.connect(self.buttonClicked)
	#setting up the Counter widget 
        self.timer = QLCDNumber()
        self.timer.setNumDigits(4)
        self.timer.setStyleSheet("QLCDNumber {color: pink;}")
        self.timer.setFixedWidth(400)
        #self.timer.display(self.getVal())
        self.control_layout.addWidget(self.timer)
        self.control_layout.addWidget(self.button)
        self.show()
    def getVal(self,val):
        self.timer.display(val)
    def keyPressEvent(self, e):
        if e.key():
            print("Key +1")
            return "a"
    def buttonClicked(self):
        print("Button +1")
        return True
    def run(self):
        sys.exit(self.app.exec_())
Exemplo n.º 4
0
class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.title = "PyQt5 QLCD Number"
        self.top = 200
        self.left = 500
        self.width = 400
        self.height = 300
        self.setWindowIcon(QtGui.QIcon("icon.png"))
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)
        self.InitUi()
        self.show()

    def InitUi(self):
        vbox = QVBoxLayout()
        self.lcd = QLCDNumber()
        self.lcd.display(60)
        vbox.addWidget(self.lcd)
        self.lcd.setStyleSheet('background-color:green')
        self.button = QPushButton("Radom Number Gererator")
        self.button.setStyleSheet('background-color:yellow')
        self.button.clicked.connect(self.lcdHanlder)
        vbox.addWidget(self.button)
        self.setLayout(vbox)

    def lcdHanlder(self):
        random = randint(1, 200)
        self.lcd.display(random)
Exemplo n.º 5
0
class Window(QWidget):

    def __init__(self):
        super().__init__()

        self.title = "PyQt LCDNumber"
        self.top = 100
        self.left = 100
        self.width = 400
        self.height = 300

        self.vbox = QVBoxLayout()
        self.lcd = QLCDNumber()
        self.button = QPushButton("Random Number Generator")

        self.InitUI()

    def InitUI(self):
        self.setWindowIcon(QtGui.QIcon("home.png"))
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)

        self.button.clicked.connect(self.LCDHandler)
        self.lcd.setStyleSheet("background-color: green")
        self.button.setStyleSheet("background-color: cyan")

        self.vbox.addWidget(self.lcd)
        self.vbox.addWidget(self.button)
        self.setLayout(self.vbox)

        self.show()

    def LCDHandler(self):
        random = randint(0, 500)
        self.lcd.display(random)
Exemplo n.º 6
0
class Window(QWidget):
    def __init__(self):
        super().__init__()

        self.title = "PyQt5 - QLCD_Number"
        self.left = 500
        self.top = 200
        self.width = 200
        self.height = 200
        self.iconName = "_imagens/mouse.ico"

        self.setWindowTitle(self.title)
        self.setWindowIcon(QtGui.QIcon(self.iconName))
        self.setGeometry(self.left, self.top, self.width, self.height)
        self.InitUI()
        self.show()

    def InitUI(self):
        vbox = QVBoxLayout()
        self.lcd = QLCDNumber()
        self.lcd.setStyleSheet('background-color: lightblue')
        # self.lcd.display(23)
        vbox.addWidget(self.lcd)

        self.button = QPushButton("Gerador de número aleatório")
        self.button.clicked.connect(self.LCDHandler)
        vbox.addWidget(self.button)

        self.setLayout(vbox)

    def LCDHandler(self):
        random = randint(1, 200)
        self.lcd.display(random)
Exemplo n.º 7
0
class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setGeometry(200, 200, 400, 300)
        self.setWindowTitle("I love AJ")
        self.setWindowIcon(QIcon("src\\fruit.ico"))

        vbox = QVBoxLayout()

        self.lcd = QLCDNumber()

        # self.lcd.setStyleSheet("background-color:pink")
        self.lcd.setStyleSheet("color:pink")

        vbox.addWidget(self.lcd)

        btn = QPushButton("Create Random Number?")
        btn.setStyleSheet("background-color:yellow")
        btn.setFont(QFont("Sanserif", 14))
        btn.clicked.connect(self.rand_generator)
        vbox.addWidget(btn)

        self.setLayout(vbox)

    def rand_generator(self):
        ran = randint(1, 500)
        self.lcd.display(ran)
Exemplo n.º 8
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"))
Exemplo n.º 9
0
class Window(QWidget):
    def __init__(self):
        super().__init__()

        self.title = "PyQt5 QLCDNumber"
        self.left = 500
        self.top = 200
        self.width = 300
        self.height = 250

        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)

        self.init_ui()
        self.show()

    def init_ui(self):
        vbox = QVBoxLayout()
        self.lcd = QLCDNumber()
        self.lcd.display(60)
        self.lcd.setStyleSheet("background-color:green")
        vbox.addWidget(self.lcd)

        self.button = QPushButton("Random Number Generator")
        self.button.setStyleSheet("background-color:yellow")
        self.button.clicked.connect(self.lcd_handler)
        vbox.addWidget(self.button)

        self.setLayout(vbox)

    def lcd_handler(self):
        random = randint(1, 200)
        self.lcd.display(random)
Exemplo n.º 10
0
class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.title = "Pyqt5 QLCDnumber"
        self.top = 500
        self.left = 500
        self.width = 600
        self.height = 200
        self.iconName = "transistor.jpg"
        self.setWindowIcon(QtGui.QIcon(self.iconName))
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)
        self.InitUI()
        self.show()

    def InitUI(self):
        vbox = QVBoxLayout()
        self.lcd = QLCDNumber()
        self.lcd.setStyleSheet("background-color:green")

        vbox.addWidget(self.lcd)
        self.setLayout(vbox)

        self.button = QPushButton("Random Number Generator")
        self.button.setStyleSheet("background-color:blue")
        self.button.clicked.connect(self.LCDHandler)
        vbox.addWidget(self.button)

    def LCDHandler(self):
        random = randint(1, 200)
        self.lcd.display(random)
class Digital_clock(QMainWindow):
    def __init__(self):
        super().__init__()
        title = "Digital Clock -by Anirudh"
        top = 400
        left = 300
        width = 550
        height = 150

        icon = "clock.png"

        self.setWindowTitle(title)
        self.setGeometry(top, left, width, height)
        self.setWindowIcon((QIcon(icon)))

        self.initUI()
        self.timer = QtCore.QTimer(self)
        self.timer.timeout.connect(self.showTime)
        self.timer.start(1000)

    def initUI(self):
        self.clock_screen = QLCDNumber(self)
        self.clock_screen.setStyleSheet(
            "color : black ; background-color: white")
        self.clock_screen.setDigitCount(8)
        self.clock_screen.setGeometry(QtCore.QRect(0, 0, 550, 150))
        self.showTime()

    def showTime(self):
        showTime = time.strftime("%I:%M:%S")
        self.clock_screen.display(showTime)
Exemplo n.º 12
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)
Exemplo n.º 13
0
    def LCD(self):
        vbox = QVBoxLayout()

        lcd = QLCDNumber()
        lcd.setStyleSheet("background-color:gray")
        vbox.addWidget(lcd)

        time = QTime.currentTime()
        text = time.toString("hh:mm")
        # convert time to a string

        lcd.display(text)

        self.setLayout(vbox)
Exemplo n.º 14
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)
Exemplo n.º 15
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)
Exemplo n.º 16
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()  # 窗体全屏
Exemplo n.º 17
0
class Window(QWidget):
    def __init__(self):
        super().__init__()

        self.title = "This is first thing"
        self.height = 700
        self.width = 1100
        self.top = 100
        self.left = 200
        self.iconName = "plioky.ico"
        self.lcd = QLCDNumber()
        self.vbox = QVBoxLayout()

        self.init_window()

    def init_window(self):

        self.setWindowIcon(QtGui.QIcon(self.iconName))
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)

        self.vbox.addWidget(self.lcd)

        self.lcd.setStyleSheet("background-color:orange")
        self.setStyleSheet("background-color:#212f3d")

        button = QPushButton("Generate random number")
        button.clicked.connect(self.generate)
        button.setStyleSheet("background-color:white")
        self.vbox.addWidget(button)

        self.setLayout(self.vbox)

        self.show()

    def generate(self):
        rand = random.randint(0, 100)
        self.lcd.display(rand)
Exemplo n.º 18
0
class Window(QWidget):
    def __init__(self):
        super().__init__()

        self.title = "QDial"
        self.left = 300
        self.top = 100
        self.width = 500
        self.height = 500
        self.IconName = "Icon/python.png"
        self.color = 'red'

        self.InitWindow()

    def InitWindow(self):
        self.setWindowIcon(QtGui.QIcon(self.IconName))
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)
        #self.setStyleSheet('background-color:green')

        vbox = QVBoxLayout()
        self.lcd = QLCDNumber()
        self.lcd.setStyleSheet('background-color:green')
        #self.lcd.setStyleSheet('color:black')

        self.button = QPushButton("Random Number")
        self.button.clicked.connect(self.RandomGen)
        self.button.setStyleSheet('background-color:red')

        vbox.addWidget(self.lcd)
        vbox.addWidget(self.button)

        self.setLayout(vbox)

        self.show()

    def RandomGen(self):
        self.lcd.display(randint(10, 100))
Exemplo n.º 19
0
class TimeSettingWidget(QWidget):
    def __init__(self, parent=None):
        super(TimeSettingWidget, self).__init__(parent)
        self.initUI()

    def initUI(self):
        self.lcd = QLCDNumber(self)
        self.lcd.setNumDigits(2)
        self.lcd.setMinimumHeight(80)
        self.lcd.setStyleSheet("QLCDNumber{ color: black;}")
        self.sld = QSlider(Qt.Horizontal, self)
        self.sld.setMinimum(1)
        self.sld.setMaximum(90)

        self.vbox = QVBoxLayout()
        self.vbox.addWidget(self.lcd)
        self.vbox.addWidget(self.sld)

        self.setLayout(self.vbox)
        self.sld.valueChanged.connect(self.lcd.display)

    def setTime(self, t):
        self.sld.setValue(t)

    def setDisplayTime(self, t):
        self.lcd.display(t)

    def setActiveStyle(self):
        self.lcd.setStyleSheet("QLCDNumber{ color: green;}")

    def setInactiveStyle(self):
        self.lcd.setStyleSheet("QLCDNumber{ color: black;}")

    def setSliderEnable(self, bool):
        self.sld.setEnabled(bool)

    def freshDisplayTime(self):
        self.lcd.display(self.sld.value())

    def getTime(self):
        return self.sld.value()
Exemplo n.º 20
0
class Placar(QMainWindow):
    def __init__(self):
        super().__init__()

        self.title = 'Placar para gincanas'
        self.top = 0
        self.left = 0
        self.width = 1366
        self.height = 768

        self.valorPlacarA = 0
        self.valorPlacarB = 0

        self.initWindow()
        self.cronoWindow = Cronometro()

    def initWindow(self):

        #espaço em branco
        espaco = QWidget()
        espaco.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)

        #Titulo do programa
        self.labelTituloJanela = QLabel(' PLACAR GINCANA', self)
        self.labelTituloJanela.setGeometry(450, 10, 430, 100)
        self.labelTituloJanela.setStyleSheet(
            'QLabel {font: 45px; color: white; font: bold; background-color: #19B5FE; border-radius: 10px}'
        )

        #Seção dos LCDS
        self.lcdPlacar1 = QLCDNumber(self)
        self.lcdPlacar2 = QLCDNumber(self)
        self.lcdPlacar1.setGeometry(50, 120, 300, 250)
        self.lcdPlacar2.setGeometry(940, 120, 300, 250)
        self.lcdPlacar1.setStyleSheet(
            'QLCDNumber {background-color: #000000; color: red; font: bold}')
        self.lcdPlacar1.setSegmentStyle(2)  # QLCDNumber::SegmentStyle
        self.lcdPlacar2.setStyleSheet(
            'QLCDNumber {background-color: #000000; color: red; font: bold}')
        self.lcdPlacar2.setSegmentStyle(2)

        #Label dos nomes dos grupos
        self.labelGrupA = QLabel('Grupo A', self)
        self.labelGrupB = QLabel('Grupo B', self)
        self.labelGrupA.setGeometry(125, 20, 200, 100)
        self.labelGrupA.setStyleSheet('QLabel {font: 40px; font: bold;}')
        self.labelGrupB.setStyleSheet('QLabel {font: 40px; font: bold}')
        self.labelGrupB.setGeometry(1010, 20, 200, 100)

        #Label do cronometro
        self.labelCrono = QLabel(' 00:00 ', self)
        self.labelCrono.setGeometry(130, 490, 170, 100)
        self.labelCrono.setStyleSheet(
            'QLabel {background-color: #336E7B; color: white; font: 50px; border: None; border-radius: 20px}'
        )

        #Label contendo a imagem central do programa
        self.imagemLabel = QLabel(self)
        pixmap = QPixmap('imagens/competir.png')
        self.imagemLabel.setPixmap(pixmap)
        self.imagemLabel.setGeometry(490, 120, 330, 348)

        #Botões de pontuar os grupos
        self.bntGrupA = QPushButton('Pontuar Grupo A', self)
        self.bntGrupB = QPushButton('Pontuar Grupo B', self)
        self.bntGrupA.setGeometry(370, 520, 200, 60)
        self.bntGrupB.setGeometry(690, 520, 200, 60)
        self.bntGrupA.setStyleSheet(
            'QPushButton {font: 23px; font: bold; background-color: #0AEB7E}')
        self.bntGrupB.setStyleSheet(
            'QPushButton {font: 23px; font: bold; background-color: #0AEB7E}')

        #Spin para definir a pontução (Está entre os dois botões)
        self.spinBox = QSpinBox(self)
        self.spinBox.setMaximum(100)
        self.spinBox.setGeometry(592, 520, 90, 60)
        self.spinBox.setStyleSheet('QSpinBox {font: 50px}')

        #Actions Buttons pontuação
        self.bntGrupA.clicked.connect(lambda: self.setValorLcd(1))
        self.bntGrupB.clicked.connect(lambda: self.setValorLcd(2))

        #Seção do cronômetro
        self.labelCronometro = QLabel('Cronometro', self)
        #self.labelCronometro.setIcon(QtGui.QIcon('crono'))
        self.labelCronometro.setStyleSheet(
            'QLabel {font: 25px; color: black; font: bold; background-color: #ECF0F1;}'
        )
        self.labelCronometro.setGeometry(145, 440, 150, 50)

        self.bntIniciarCrono = QPushButton('INICIAR', self)
        self.bntIniciarCrono.setGeometry(130, 590, 185, 50)
        self.bntIniciarCrono.setStyleSheet(
            'QPushButton {font: 20px; color: black; font: bold; background-color: #ECF0F1; border-radius: 10px}'
        )
        self.bntIniciarCrono.setIcon(QtGui.QIcon('imagens/play'))
        self.bntIniciarCrono.setCheckable(True)
        self.bntIniciarCrono.clicked.connect(self.threadCrono)

        #Botão configurar cronometro
        self.bntConfingCronometro = QPushButton('Configurar', self)
        self.bntConfingCronometro.setGeometry(180, 650, 100, 50)
        self.bntConfingCronometro.setStyleSheet(
            'QPushButton {font: 18px; color: black; font: bold; background-color: #ECF0F1; border-radius: 10px}'
        )
        self.bntConfingCronometro.clicked.connect(self.configCronometro)

        #Seção Sortear Número
        self.labelSorteio = QLabel('Sortear Número', self)
        self.labelSorteio.setStyleSheet(
            'QLabel {font: 25px; color: black; font: bold; background-color: #ECF0F1;}'
        )
        self.labelSorteio.setGeometry(970, 450, 200, 50)
        self.labelAte = QLabel('ATÉ', self)
        self.labelAte.setStyleSheet(
            'QLabel {font: 25px; color: black; font: bold; background-color: #ECF0F1;}'
        )
        self.labelAte.setGeometry(1040, 520, 50, 50)
        self.spinBoxNumb1 = QSpinBox(self)
        self.spinBoxNumb2 = QSpinBox(self)
        self.spinBoxNumb1.setGeometry(940, 520, 90, 50)
        self.spinBoxNumb2.setGeometry(1100, 520, 90, 50)
        self.spinBoxNumb1.setStyleSheet('QSpinBox {font: 50px}')
        self.spinBoxNumb2.setStyleSheet('QSpinBox {font: 50px}')
        self.bntSortear = QPushButton('Sortear', self)
        self.bntSortear.setGeometry(1020, 590, 90, 50)
        self.bntSortear.setStyleSheet(
            'QPushButton {font: 25px; color: black; font: bold; background-color: #F9690E; border-radius: 10px}'
        )
        self.bntSortear.clicked.connect(self.sortearNumero)

        #Seção da janela principal
        self.setWindowTitle(self.title)
        self.setGeometry(self.top, self.left, self.width, self.height)
        self.setWindowIcon(QtGui.QIcon("user.png"))
        self.show()

    def setValorLcd(self, n):

        if (n == 1):
            self.lcdPlacar1.display(self.spinBox.value())
            self.valorPlacarA = self.spinBox.value()

        if (n == 2):
            self.lcdPlacar2.display(self.spinBox.value())
            self.valorPlacarB = self.spinBox.value()

        def placarColor(valorPlacarA, valorPlacarB):
            if (valorPlacarA > valorPlacarB):
                self.lcdPlacar1.setStyleSheet(
                    'QLCDNumber {background-color: #3FC380; color: white; font: bold}'
                )

            if (valorPlacarB > valorPlacarA):
                self.lcdPlacar2.setStyleSheet(
                    'QLCDNumber {background-color: #3FC380; color: white; font: bold}'
                )

            if (valorPlacarA < valorPlacarB):
                self.lcdPlacar1.setStyleSheet(
                    'QLCDNumber {background-color: #F22613; color: white; font: bold}'
                )

            if (valorPlacarB < valorPlacarA):
                self.lcdPlacar2.setStyleSheet(
                    'QLCDNumber {background-color: #F22613; color: white; font: bold}'
                )

            if (valorPlacarA == valorPlacarB):
                self.lcdPlacar1.setStyleSheet(
                    'QLCDNumber {background-color: #22A7F0; color: white; font: bold}'
                )
                self.lcdPlacar2.setStyleSheet(
                    'QLCDNumber {background-color: #22A7F0; color: white; font: bold}'
                )

        placarColor(self.valorPlacarA, self.valorPlacarB)

    def bntIniciarCronoState(self):
        i = 0
        if (self.bntIniciarCrono.isChecked()):
            i += 1
            return i
        return i

    def threadCrono(self):
        global stop
        stop = 0
        bntCronoStatus = self.bntIniciarCronoState()

        if (bntCronoStatus == 1):
            self.t = threading.Thread(target=self.iniciarCrono)
            self.bntIniciarCrono.setText('PARAR')
            self.t.start()

        if (bntCronoStatus == 0):
            self.bntIniciarCrono.setText('Iniciar novamente')
            stop = -1

    def iniciarCrono(self):

        self.seg = self.cronoWindow.getValueSpinSeg()
        self.min = self.cronoWindow.getValueSpinMin()

        self.count = 0
        self.i = self.seg + (self.min * 60)

        while (self.i != 0):
            self.min = self.count / 60
            self.seg = self.count % 60 + 1
            time.sleep(1)
            self.labelCrono.setText('%02d:%02d' % (self.min, self.seg))
            self.count += 1
            self.i -= 1

            if stop == -1:
                self.bntIniciarCrono.setText('Iniciar novamente')
                self.i = 0

    def sortearNumero(self):
        try:
            a = self.spinBoxNumb1.value()
            b = self.spinBoxNumb2.value()
            self.resultado = randint(a, b)
            self.msgResultado = QMessageBox()
            self.msgResultado.setStyleSheet(
                'QMessageBox, QMessageBox QLabel {font: 35px; color: white; background-color:#34495E}'
            )
            self.msgResultado.information(
                self.msgResultado, 'INFORMAÇÃO ',
                'Número sorteado:  \n-->{:>7}        <--'.format(
                    self.resultado))
        except ValueError:
            self.warningValue = QMessageBox()
            self.warningValue.setStyleSheet(
                'QMessageBox, QMessageBox QLabel {font: bold; color: white; font: 25px; background-color: #D91E18;}'
            )
            self.warningValue.warning(
                self.warningValue, 'Aviso',
                'Entrada incorreta! \n 1 até 0 é inválido')

    def configCronometro(self):
        print('Inciando cronometro')
        self.cronoWindow = Cronometro()
        self.cronoWindow.show()
Exemplo n.º 21
0
class The_Main_Window(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setGeometry(550, 150, 650, 350)
        self.setWindowTitle("World of Words")
        self.setStyleSheet(
            "background-color: #EEE8AA; color: #191970; font-family: Times;")

        self.table = QLCDNumber(self)
        self.table.setStyleSheet(
            'QLCDNumber {background-color: #FFB6C1; color: #191970;}')
        self.table.display('')
        self.table.move(10, 20)
        self.table.resize(380, 50)

        # Когда пользователь будет нажимать на эту кнопку, будет происходить транслитерация
        self.the_main_btn = QPushButton("Нажмите, когда введёте слово", self)
        self.the_main_btn.setStyleSheet(
            'QPushButton {background-color: #8FBC8F; color: #191970;}')
        self.the_main_btn.resize(self.the_main_btn.sizeHint())
        self.the_main_btn.move(10, 120)
        self.the_main_btn.clicked.connect(self.coding)

        self.label = QLabel(self)
        self.label.setText("Здесь отобразится готовый текст")
        self.label.setStyleSheet(
            'QLabel {background-color: #FFB6C1; color: #191970;}')
        self.label.move(20, 30)
        font = QFont('CyrillicOld', 10)
        self.label.setFont(font)

        self.word_label = QLabel(self)
        self.word_label.setText("Введите слово: ")
        self.word_label.move(10, 90)

        self.word_input = QLineEdit(self)
        self.word_input.move(100, 90)
        self.word_input.resize(290, 20)

        self.table2 = QLabel(self)
        self.table2.move(20, 200)
        self.table2.resize(480, 20)

        self.table3 = QLabel(self)
        self.table3.move(20, 230)
        self.table3.resize(480, 20)

        self.table4 = QLabel(self)
        self.table4.move(20, 260)
        self.table4.resize(480, 20)

        self.table5 = QLabel(self)
        self.table5.move(20, 290)
        self.table5.resize(480, 20)

        self.ad_area = QLabel(self)
        self.ad_area.setText(
            "Здесь Вы можете увидеть некоторую информацию о слове:")
        self.ad_area.move(10, 180)
        font = QFont('CyrillicOld', 9)
        self.ad_area.setFont(font)

        self.btn_for_info = QPushButton(
            "Нажмите, чтобы увидеть данные об этом слове", self)
        self.btn_for_info.setStyleSheet(
            'QPushButton {background-color: #8FBC8F; color: #191970;}')
        self.btn_for_info.resize(self.btn_for_info.sizeHint())
        self.btn_for_info.move(10, 150)
        self.btn_for_info.clicked.connect(self.give_info)

        self.pixmap = QPixmap()
        self.image = QLabel(self)
        self.image.move(405, 17)
        self.image.resize(230, 200)
        self.image.setPixmap(self.pixmap)

    def coding(self):
        self.d = {
            'А': 'A',
            'Б': 'B',
            'В': 'V',
            'Г': 'G',
            'Д': 'D',
            'Е': 'E',
            'Ё': 'E',
            'Ж': 'Zh',
            'З': 'Z',
            'И': 'I',
            'Й': 'I',
            'К': 'K',
            'Л': 'L',
            'М': 'M',
            'Н': 'N',
            'О': 'O',
            'П': 'P',
            'Р': 'R',
            'С': 'S',
            'Т': 'T',
            'У': 'U',
            'Ф': 'F',
            'Х': 'Kh',
            'Ц': 'Tc',
            'Ч': 'Ch',
            'Ш': 'Sh',
            'Щ': 'Shch',
            'Ы': 'Y',
            'Э': 'E',
            'Ю': 'Iu',
            'Я': 'Ia',
            'а': 'a',
            'б': 'b',
            'в': 'v',
            'г': 'g',
            'д': 'd',
            'е': 'e',
            'ё': 'e',
            'ж': 'zh',
            'з': 'z',
            'и': 'i',
            'й': 'i',
            'к': 'k',
            'л': 'l',
            'м': 'm',
            'н': 'n',
            'о': 'o',
            'п': 'p',
            'р': 'r',
            'с': 's',
            'т': 't',
            'у': 'u',
            'ф': 'f',
            'х': 'kh',
            'ц': 'tc',
            'ч': 'ch',
            'ш': 'sh',
            'щ': 'shch',
            'ы': 'y',
            'э': 'e',
            'ю': 'iu',
            'я': 'ia'
        }

        origin = self.word_input.text().lower()
        if not all(symbol in 'йцукенгшщзхъфывапролджэячсмитьбюё'
                   or symbol in '1234567890-_=+*&^%$#@!~№;,<.>":?\/ |'
                   for symbol in origin):
            self.label.setText('Ой!!!')
            self.translit = origin
        else:
            answ = self.word_input.text()
            ans = ''
            for i in answ:
                if i in self.d:
                    ans += self.d[i]
                elif i != 'ь' and i != 'Ь' and i != 'ъ' and i != 'Ъ':
                    ans += i
            self.label.setText("{}".format(ans))
            self.translit = ans

    def give_info(self):
        # В этом методе мы будем сравнивать оригинал и транлитерацию по некоторым параметрам
        word_in_translit = self.translit.lower()
        word_in_Russian = self.word_input.text().lower()

        # Если пользователь ввел неподходящее слово или фразу, то мы не транслитерируем и уведомляем его об этом (было в т.ч. до этого)
        if word_in_translit == word_in_Russian:
            self.table2.setText("Ой, что-то пошло не так, поробуйте снова...")
            self.table3.setText("Возможно, Вы не поменяли раскладку...")
        else:
            self.table2.setText("Оригинал: {};  транслитерация: {}".format(
                word_in_Russian, word_in_translit))
            self.table3.setText(
                "Количество символов в оригинале: {};  в транслитерации: {}".
                format(len(word_in_Russian), len(word_in_translit)))

        # Списки букв, гласных и согласных в русском и английском алфавитах
        letters_engl = [chr(i) for i in range(ord('a'), ord('z') + 1)]
        letters_rus = [chr(i) for i in range(ord('а'), ord('я') + 1)]
        vowels_engl = ['a', 'u', 'e', 'o', 'y', 'i']
        vowels_rus = ['а', 'у', 'о', 'е', 'и', 'я', 'ю', 'ё', 'э', 'ы']
        cons_engl = list(
            filter(lambda letter: letter not in vowels_engl, letters_engl))
        cons_rus = list(
            filter(lambda letter: letter not in vowels_rus, letters_rus))

        # Защита от дурака, который ввел слово не на русском или с отличными от русских букв и приведенных ниже символов
        if not all(symbol in letters_rus
                   or symbol in '1234567890-_=+*&^%$#@!~№;,<.>":?\/ |'
                   for symbol in word_in_Russian):
            # Похоже на одно сообщение в несколько строк
            self.table4.setText("Или ввели недопустимые символы..")
            self.table5.setText("Будьте внимательней :))))")
            self.pixmap.load("картинка для ошибки.jpg")
            self.image.setPixmap(self.pixmap)

        else:
            # Она сделана под цвет фона, и её не видно
            self.pixmap.load("картинка на случай не ошибки.jpg")
            self.image.setPixmap(self.pixmap)
            # self.image.resize(1, 1)
            # Непосредственно нахождение количества тех или иных букв в словах
            # Сначала создали список со всеми нужными буквами, чтобы не потерять их
            vow_engl_in_word = list(
                filter(lambda letter: letter in vowels_engl, word_in_translit))
            num_of_vow_engl_in_word = len(vow_engl_in_word)
            vow_rus_in_word = list(
                filter(lambda letter: letter in vowels_rus, word_in_Russian))
            num_of_vow_rus_in_word = len(vow_rus_in_word)
            cons_engl_in_word = list(
                filter(lambda letter: letter in cons_engl, word_in_translit))
            num_of_cons_engl_in_word = len(cons_engl_in_word)
            cons_rus_in_word = list(
                filter(lambda letter: letter in cons_rus, word_in_Russian))
            num_of_cons_rus_in_word = len(cons_rus_in_word)

            self.table4.setText(
                "Количество гласных звуков в русской версии: {};  в транслитерированной версии: {}"
                .format(num_of_vow_rus_in_word, num_of_vow_engl_in_word))
            self.table5.setText(
                "Количество согласных звуков в русской версии: {};  в транслитерированной версии: {}"
                .format(num_of_cons_rus_in_word, num_of_cons_engl_in_word))
Exemplo n.º 22
0
class RmsDriver(QObject):
    def __init__(self, driverNum):
        super().__init__()
        self.CtrlNum = driverNum
        self.name = 'Driver ' + str(driverNum)
        self.lapcount = 0
        self.bestLapTime = None
        self.lapTime = None
        self.time = None
        self.fuellevel = 15
        self.pitcount = 0
        self.pit = False
        self.buildDriver()

    def buildDriver(self):
        self.nameFont = QFont()
        self.nameFont.setPointSize(20)
        self.nameFont.setBold(True)
        self.nameBtn = QPushButton(self.name + '\n' + 'Ctrl: ' +
                                   str(self.CtrlNum))
        self.nameBtn.setToolTip('Click to change driver name')
        self.nameBtn.setFont(self.nameFont)
        self.nameBtn.setStyleSheet(
            "QPushButton { border: 5px solid black; border-radius: 10px; background-color: white}"
        )

        self.lapCountLCD = QLCDNumber(3)
        self.lapCountLCD.setStyleSheet(
            "QLCDNumber{ border-radius: 10px; background-color: black}")
        lcdPalette = self.lapCountLCD.palette()
        lcdPalette.setColor(lcdPalette.WindowText, QColor(255, 255, 0))
        self.lapCountLCD.setPalette(lcdPalette)
        self.lapCountLCD.display(self.lapcount)

        self.bestLapLCD = QLCDNumber()
        self.bestLapLCD.setStyleSheet(
            "QLCDNumber{ border-radius: 10px; background-color: black}")
        lcdPalette = self.bestLapLCD.palette()
        lcdPalette.setColor(lcdPalette.WindowText, QColor(255, 255, 0))
        self.bestLapLCD.setPalette(lcdPalette)
        self.bestLapLCD.display(self.bestLapTime)

        self.lapLCD = QLCDNumber()
        self.lapLCD.setStyleSheet(
            "QLCDNumber{ border-radius: 10px; background-color: black}")
        lcdPalette = self.lapLCD.palette()
        lcdPalette.setColor(lcdPalette.WindowText, QColor(255, 255, 0))
        self.lapLCD.setPalette(lcdPalette)
        self.lapLCD.display(self.lapTime)

        self.fuelbar = QProgressBar()
        self.fuelbar.setOrientation(Qt.Horizontal)
        self.fuelbar.setStyleSheet(
            "QProgressBar{ color: white; background-color: black; border: 5px solid black; border-radius: 10px; text-align: center}\
                                    QProgressBar::chunk { background: qlineargradient(x1: 1, y1: 0.5, x2: 0, y2: 0.5, stop: 0 #00AA00, stop: "
            + str(0.92 - (1 / (self.fuellevel))) + " #22FF22, stop: " +
            str(0.921 - (1 / (self.fuellevel))) + " #22FF22, stop: " +
            str(1.001 - (1 / (self.fuellevel))) + " red, stop: 1 #550000); }")
        self.fuelbar.setMinimum(0)
        self.fuelbar.setMaximum(15)
        self.fuelbar.setValue(self.fuellevel)

        self.pitCountLCD = QLCDNumber(2)
        self.pitCountLCD.setStyleSheet(
            "QLCDNumber{ border-radius: 10px; background-color: black}")
        lcdPalette = self.pitCountLCD.palette()
        lcdPalette.setColor(lcdPalette.WindowText, QColor(255, 0, 0))
        self.pitCountLCD.setPalette(lcdPalette)
        self.pitCountLCD.display(self.pitcount)

    def getName(self):
        return self.name

    def getNameBtn(self):
        return self.nameBtn

    def getLapCountLCD(self):
        return self.lapCountLCD

    def getBestLapLCD(self):
        return self.bestLapLCD

    def getLapLCD(self):
        return self.lapLCD

    def getFuelBar(self):
        return self.fuelbar

    def setCtrlNum(self, num):
        self.CtrlNum = num
        self.nameBtn.setText(self.name + '\n' + 'Ctrl: ' + str(self.CtrlNum))

    def getPits(self):
        return self.pitCountLCD

    def newlap(self, timer):
        if self.time is not None:
            self.lapTime = timer.timestamp - self.time
            if self.bestLapTime is None or self.lapTime < self.bestLapTime:
                self.bestLapTime = self.lapTime
            self.lapcount += 1
        self.time = timer.timestamp
Exemplo n.º 23
0
class PlayScene(QWidget):
    def __init__(self, st):
        super().__init__()
        self.stw = st
        self.timer = QTimer()
        self.timer.setInterval(100)
        self.remainTime = 30
        self.score = 0
        self.maxScore = db.getScores()[0]
        self.timer.timeout.connect(self.changeTime)
        self.threadclass = ThreadClass(lambda: self.addScore(10))
        self.score = self.threadclass.point

        self.initUI()

    def changeTime(self):
        self.remainTime -= 1
        if (self.remainTime < 0):
            db.addScore(self.threadclass.point)
            print(db.getScores())
            self.timer.stop()
            self.stw.setCurrentIndex(2)
            self.stw.currentWidget().renewScores()
        if self.remainTime > 50:
            self.lcd.setStyleSheet('color:black;background-color:white')
        else:
            self.lcd.setStyleSheet('color:red;background-color:white')

        self.lcd.display(self.remainTime)

    def addScore(self, score):
        self.score += score
        if (self.maxScore < self.threadclass.point):
            self.maxScore = self.threadclass.point
            self.maxScoreLcd.display(self.maxScore)
        self.scoreLcd.display(self.threadclass.point)

    def initUI(self):
        self.scoreLcd = QLCDNumber()
        self.scoreLcd.setStyleSheet('background-color: white')
        self.lcd = QLCDNumber()
        self.lcd.setStyleSheet('background-color: white')
        self.maxScoreLcd = QLCDNumber()
        self.maxScoreLcd.setStyleSheet('background-color: white')

        self.lcd.display(self.remainTime)
        layout = QGridLayout()
        layout.addWidget(QLabel("MAX SCORE"), 0, 0)
        layout.addWidget(QLabel("SCORE"), 0, 1)
        layout.addWidget(QLabel("TIME"), 0, 2)

        layout.addWidget(self.maxScoreLcd, 1, 0)
        layout.addWidget(self.scoreLcd, 1, 1)
        layout.addWidget(self.lcd, 1, 2)
        self.setLayout(layout)
        #self.show()
        pass

    def initGame(self):
        self.game_start = False
        self.threadclass.point = 0
        self.maxScore = db.getScores()[0]
        self.remainTime = 300

        self.maxScoreLcd.display(self.maxScore)
        self.scoreLcd.display(self.threadclass.point)
        self.lcd.display(self.remainTime)
        self.timer.stop()
        self.timer.start()
        self.threadclass.start()

    def keyPressEvent(self, e):
        if (e.key() == Qt.Key_A):
            self.addScore(10)
Exemplo n.º 24
0
class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        self.newDetectionAvailable = False
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(820, 620)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")

        self.dropdown_menu = QComboBox(self.centralwidget)
        font = QtGui.QFont()
        font.setPointSize(20)
        self.dropdown_menu.setFont(font)
        self.dropdown_menu.setGeometry(QtCore.QRect(540, 540, 240, 50))
        self.robot_index = 0
        for name_ip in NAME_IP_LIST:
            text = name_ip[0] + ': ' + name_ip[1]
            self.dropdown_menu.addItem(text)
        self.ip_addr = NAME_IP_LIST[0][1]

        self.server_running = True
        self.server_thread = threading.Thread(target=self.server)
        self.server_thread.start()

        font = QtGui.QFont()
        font.setPointSize(20)
        self.graphicsView = QtWidgets.QGraphicsView(self.centralwidget)
        self.graphicsView.setGeometry(QtCore.QRect(10, 10, 800, 431))
        self.graphicsView.setObjectName("graphicsView")
        self.StandardButton = QtWidgets.QPushButton(self.centralwidget)
        self.StandardButton.setGeometry(QtCore.QRect(60, 470, 170, 60))
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum,
                                           QtWidgets.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.StandardButton.sizePolicy().hasHeightForWidth())
        self.StandardButton.setSizePolicy(sizePolicy)
        font = QtGui.QFont()
        font.setPointSize(20)
        self.StandardButton.setFont(font)
        self.StandardButton.setObjectName("StandardButton")
        self.AdvancedButton = QtWidgets.QPushButton(self.centralwidget)
        self.AdvancedButton.setGeometry(QtCore.QRect(570, 470, 170, 60))
        font = QtGui.QFont()
        font.setPointSize(20)
        self.AdvancedButton.setFont(font)
        self.AdvancedButton.setObjectName("AdvancedButton")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 22))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
        self.LCD = QLCDNumber(self.centralwidget)
        self.LCD.setGeometry(QtCore.QRect(350, 480, 100, 40))
        self.LCD.display(0)
        self.LCD.setStyleSheet(
            'QLCDNumber {background-color: green; color: red;}')

        self.clockLCD = QLCDNumber(self.centralwidget)
        self.clockLCD.setGeometry(QtCore.QRect(350, 540, 100, 40))
        self.clockLCD.display('3:00')
        self.clockLCD.setStyleSheet(
            'QLCDNumber {background-color: yellow; color: red;}')

        self.scene = QGraphicsScene()
        self.graphicsView.setScene(self.scene)
        greenBrush = QBrush(Qt.green)  #2 single healthy
        yellowBrush = QBrush(Qt.yellow)  #1 single stressed
        whiteBrush = QBrush(Qt.white)  #0 empty
        blueBrush = QBrush(Qt.blue)  #3 double
        pinkBrush = QBrush(Qt.magenta)  #4 tiller
        self.blackPen = QPen(Qt.black)
        self.BrushList = [
            whiteBrush, yellowBrush, greenBrush, blueBrush, pinkBrush,
            QBrush(Qt.black)
        ]
        self.colorNames = [
            'Empty', 'Stressed', 'Healthy', 'Double', 'Tiller', 'Detection'
        ]

        self.level = 0  #standard
        self.newDetectionAvailable = False
        self.detectedFieldConfig = 5 * np.ones((4, 16), dtype=np.int8)
        self.fieldConfig = self.randFieldConfig()

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)
        self.AdvancedButton.clicked.connect(self.AdvBtnClickedSlot)
        self.StandardButton.clicked.connect(self.StdBtnClickedSlot)
        self.StdBtnClickedSlot()
        self.drawPlants()

        self.drawing_timer = QTimer()
        self.drawing_timer.setInterval(50)
        self.drawing_timer.timeout.connect(self.updateDetectionResult)
        self.drawing_timer.start()

        self.clock_seconds = 0
        self.timestamp = '0:00'
        self.clock_timer = QTimer()
        self.clock_timer.setInterval(1000)
        self.clock_timer.timeout.connect(self.updateClock)
        self.clock_timer.start()
        self.time_is_up = False
        app.aboutToQuit.connect(self.closeEvent)

    def updateClock(self):
        if self.clock_seconds >= 300:
            if self.clock_seconds % 2 == 0:
                self.clockLCD.setStyleSheet(
                    'QLCDNumber {background-color: yellow; color: red;}')
            else:
                self.clockLCD.setStyleSheet(
                    'QLCDNumber {background-color: white; color: red;}')
            self.clockLCD.display('5:00')
            self.time_is_up = True
        else:
            self.timestamp = str(self.clock_seconds // 60) + ':'
            sec = self.clock_seconds % 60
            self.timestamp += '0' + str(sec) if sec < 10 else str(sec)
            self.clockLCD.display(self.timestamp)
        self.clock_seconds += 1

    def updateDetectionResult(self):
        if self.newDetectionAvailable:
            self.drawPlants()
            self.newDetectionAvailable = False

    def closeEvent(self):
        self.server_running = False
        self.server_thread.join()

    def server(self):
        with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
            s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
            s.bind(('', PORT))
            while self.server_running:
                try:
                    s.settimeout(1)
                    s.listen(1)
                    c, addr = s.accept()
                    if addr[0] != self.ip_addr:
                        c.close()
                        continue
                    with c:
                        while self.server_running:
                            try:
                                c.settimeout(5)
                                msg = c.recv(1024)
                                if len(msg) != 64:
                                    c.close()
                                    print('invalid msg')
                                    break
                                if not self.time_is_up:
                                    text = msg.decode('utf-8')
                                    self.detectedFieldConfig = np.reshape(
                                        np.array(list(text), dtype=np.int8),
                                        (4, 16))
                                    upper_limit = 3 if self.level == 0 else 5
                                    self.detectedFieldConfig[
                                        (self.detectedFieldConfig < 0) |
                                        (self.detectedFieldConfig >=
                                         upper_limit)] = 5
                                    self.newDetectionAvailable = True
                                    #f = open("log.txt", "a")
                                    #f.write(self.ip_addr+','+self.timestamp+','+msg)
                                    #f.close()
                            except socket.timeout:
                                print('client stopped sending updates')
                                c.close()
                                break
                            except socket.error as exc:
                                print(exc)
                                c.close()
                                break
                except socket.timeout:
                    pass
            s.close()

    def drawPlants(self):
        size = 20
        hor_space = 40
        ver_space = 100
        self.scene.clear()
        for y in range(4):
            for x in range(16):
                plant_type = self.fieldConfig.item((y, x))
                r = QtCore.QRectF(QtCore.QPointF(x * hor_space, y * ver_space),
                                  QtCore.QSizeF(size, size))
                self.scene.addRect(r, self.blackPen,
                                   self.BrushList[plant_type])
                detected_plant_type = self.detectedFieldConfig.item((y, x))
                self.scene.addEllipse(x * hor_space, y * ver_space + 30, size,
                                      size, self.blackPen,
                                      self.BrushList[detected_plant_type])

        # separation line
        self.scene.addLine(
            QtCore.QLineF(16.4 * hor_space, 0, 16.4 * hor_space, 350))
        # draw a legend
        for i in range(3 if self.level == 0 else 5):
            r = QtCore.QRectF(
                QtCore.QPointF(17 * hor_space, i * ver_space / 2),
                QtCore.QSizeF(size, size))
            self.scene.addRect(r, self.blackPen, self.BrushList[i])
            t = self.scene.addText(self.colorNames[i], QFont("Helvetica"))
            t.setPos(18 * hor_space, i * ver_space / 2)
        i = 3 if self.level == 0 else 5
        self.scene.addEllipse(17 * hor_space, i * ver_space / 2, size, size,
                              self.blackPen, self.BrushList[5])
        t = self.scene.addText(self.colorNames[5], QFont("Helvetica"))
        t.setPos(18 * hor_space, i * ver_space / 2)

        #calculate the score
        true_count_per_row = np.count_nonzero(
            np.logical_and(self.fieldConfig > 0, self.fieldConfig < 5),
            axis=1) + np.count_nonzero(self.fieldConfig == 3, axis=1)
        robot_count_per_row = np.count_nonzero(
            np.logical_and(self.detectedFieldConfig > 0,
                           self.detectedFieldConfig < 5),
            axis=1) + np.count_nonzero(self.detectedFieldConfig == 3, axis=1)
        # plant density score
        error_per_row = np.abs(true_count_per_row - robot_count_per_row)
        density_score = np.zeros(4, dtype=np.int32)
        density_score[error_per_row == 0] = 5
        density_score[error_per_row == 1] = 3
        density_score[error_per_row == 2] = 1
        correct_detections = self.fieldConfig[np.equal(
            self.fieldConfig, self.detectedFieldConfig)]
        points_for_empty_or_stress = 3 if self.level == 0 else 2
        detection_score = points_for_empty_or_stress * len(
            correct_detections[(correct_detections == 0) |
                               (correct_detections == 1)])

        if self.level == 1:
            detection_score += 4 * len(
                correct_detections[(correct_detections == 3) |
                                   (correct_detections == 4)])

        print(detection_score, density_score.sum())
        score = detection_score + density_score.sum()
        self.LCD.display(score)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(
            _translate("MainWindow", "2020 ASABE Robotics Competition"))
        self.StandardButton.setText(_translate("MainWindow", "Standard"))
        self.AdvancedButton.setText(_translate("MainWindow", "Advanced"))

    def initialize(self):
        self.fieldConfig = self.randFieldConfig()
        self.drawPlants()
        self.server_running = False
        self.server_thread.join()
        self.ip_addr = NAME_IP_LIST[self.dropdown_menu.currentIndex()][1]
        self.server_thread = threading.Thread(target=self.server)
        self.server_running = True
        self.server_thread.start()
        self.time_is_up = False
        self.clock_seconds = 0
        self.clockLCD.setStyleSheet(
            'QLCDNumber {background-color: yellow; color: red;}')

    def StdBtnClickedSlot(self):
        self.StandardButton.setStyleSheet("background-color: red")
        self.AdvancedButton.setStyleSheet("background-color: gray")
        self.level = 0
        self.initialize()

    def AdvBtnClickedSlot(self):
        self.AdvancedButton.setStyleSheet("background-color: red")
        self.StandardButton.setStyleSheet("background-color: gray")
        self.level = 1
        self.initialize()

    def randFieldConfig(self):
        #reset robot detection result
        self.detectedFieldConfig = 5 * np.ones((4, 16), dtype=np.int8)
        # standard
        # 0: empty, 12
        # 1: single stressed, 8
        # 2: single healthy, 44

        # advanced
        # 0: empty, 12
        # 1: single stressed, 8
        # 2: single healthuy, 36
        # 3: double, 4
        # 4: tiller, 4
        num_single_healthy_plants_per_row = 11 if self.level == 0 else 9
        single_healthy_block = 2 * np.ones(
            (4, num_single_healthy_plants_per_row), dtype=np.int8)
        num_abnormal_spots = 20 if self.level == 0 else 28
        abnormal_spots_array = np.zeros((1, num_abnormal_spots), dtype=np.int8)
        abnormal_spots_array[0, 12:20] = 1
        if self.level == 1:
            abnormal_spots_array[0, 20:24] = 3
            abnormal_spots_array[0, 24:28] = 4
        shuffle_by_row = np.vectorize(np.random.permutation,
                                      signature='(n)->(n)')
        abnormal_spots_array = shuffle_by_row(abnormal_spots_array)
        abnormal_block = np.reshape(abnormal_spots_array, (4, -1))
        fieldConfig = np.concatenate((single_healthy_block, abnormal_block),
                                     axis=1)
        fieldConfig = shuffle_by_row(fieldConfig)
        return fieldConfig
Exemplo n.º 25
0
class MyWidget(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.btn_1.clicked.connect(self.one)
        self.btn_2.clicked.connect(self.two)
        self.btn_3.clicked.connect(self.three)
        self.btn_4.clicked.connect(self.four)
        self.btn_5.clicked.connect(self.five)
        self.btn_6.clicked.connect(self.six)
        self.btn_7.clicked.connect(self.seven)
        self.btn_8.clicked.connect(self.eight)
        self.btn_9.clicked.connect(self.nine)
        self.btn_0.clicked.connect(self.zero)
        self.btn_00.clicked.connect(self.zerozero)
        self.btn_floating.clicked.connect(self.floating)
        
        self.btn_m_plus.clicked.connect(self.m_plus)
        self.btn_m_minus.clicked.connect(self.m_minus)
        self.btn_mr.clicked.connect(self.mr)
        self.btn_mc.clicked.connect(self.mc)
        
        self.btn_sin.clicked.connect(self.sin)
        self.btn_cos.clicked.connect(self.cos)
        self.btn_tg.clicked.connect(self.tg)
        self.btn_ctg.clicked.connect(self.ctg)
        
        self.btn_plus.clicked.connect(self.plus)
        self.btn_minus.clicked.connect(self.minus)
        self.btn_ymn.clicked.connect(self.ymn)
        self.btn_step.clicked.connect(self.step)
        self.btn_delen.clicked.connect(self.delen)
        self.btn_pr.clicked.connect(self.pr)
        
        
        self.btn_delet.clicked.connect(self.delet)
        self.btn_ac.clicked.connect(self.ac)
        self.btn_result.clicked.connect(self.result)
        
        
    def one(self):
        global operator, operation
        if operation:
            operator.append('1')
            operation = False
        else:
            operator[-1] += '1'
        self.window.display(operator[-1])
        self.sprav.setText(''.join(operator))
    def two(self):
        global operator, operation
        if operation:
            operator.append('2')
            operation = False
        else:
            operator[-1] += '2'
        self.window.display(operator[-1])
        self.sprav.setText(''.join(operator))
    def three(self):
        global operator, operation
        if operation:
            operator.append('3')
            operation = False
        else:
            operator[-1] += '3'
        self.window.display(operator[-1])
        self.sprav.setText(''.join(operator))
    def four(self):
        global operator, operation
        if operation:
            operator.append('4')
            operation = False
        else:
            operator[-1] += '4'
        self.window.display(operator[-1])
        self.sprav.setText(''.join(operator))
    def five(self):
        global operator, operation
        if operation:
            operator.append('5')
            operation = False
        else:
            operator[-1] += '5'
        self.window.display(operator[-1])
        self.sprav.setText(''.join(operator))
    def six(self):
        global operator, operation
        if operation:
            operator.append('6')
            operation = False
        else:
            operator[-1] += '6'
        self.window.display(operator[-1])
        self.sprav.setText(''.join(operator))
    def seven(self):
        global operator, operation
        if operation:
            operator.append('7')
            operation = False
        else:
            operator[-1] += '7'
        self.window.display(operator[-1])
        self.sprav.setText(''.join(operator))
    def eight(self):
        global operator, operation
        if operation:
            operator.append('8')
            operation = False
        else:
            operator[-1] += '8'
        self.window.display(operator[-1])
        self.sprav.setText(''.join(operator))
    def nine(self):
        global operator, operation
        if operation:
            operator.append('9')
            operation = False
        else:
            operator[-1] += '9'
        self.window.display(operator[-1])
        self.sprav.setText(''.join(operator))
    def zero(self):
        global operator, operation
        if operation:
            operator.append('0')
            operation = False
        else:
            operator[-1] += '0'
        self.window.display(operator[-1])
        self.sprav.setText(''.join(operator))
    def zerozero(self):
        global operator, operation
        if operation:
            operator.append('00')
            operation = False
        else:
            operator[-1] += '00'
        self.window.display(operator[-1])
        self.sprav.setText(''.join(operator))
    def floating(self):
        global operator, operation
        if operation:
            operator.append('.')
            operation = False
        else:
            operator[-1] += '.'
        self.window.display(operator[-1])
        self.sprav.setText(''.join(operator))
    
    def m_plus(self):
        global memory, operator
        if operator[-1].isdigit():
            memory = float(memory) + float(operator[-1])
            self.m.setText("M+")
    def m_minus(self):
        global memory, operator
        if operator[-1].isdigit():
            memory = float(memory) - float(operator[-1])
            self.m.setText("M-")
    def mr(self):
        global operator, memory
        if memory != 0:
            operator.append('mr')
            self.window.display(memory)
            self.sprav.setText(''.join(operator))
    def mc(self):
        global memory
        memory = 0
        self.m.setText("")
        
    def sin(self):
        global operator, operation
        operation = True
        operator.append('sin')
        self.sprav.setText(''.join(operator))
    def cos(self):
        global operator, operation
        operation = True
        operator.append('cos')
        self.sprav.setText(''.join(operator))
    def tg(self):
        global operator, operation
        operation = True
        operator.append('tg')
        self.sprav.setText(''.join(operator))
    def ctg(self):
        global operator, operation
        operation = True
        operator.append('ctg')
        self.sprav.setText(''.join(operator))
        
    def plus(self):
        global operator, operation
        operation = True
        operator.append('+')
        self.sprav.setText(''.join(operator))
    def minus(self):
        global operator, operation
        operation = True
        operator.append('-')
        self.sprav.setText(''.join(operator))
    def ymn(self):
        global operator, operation
        operation = True
        operator.append('*')
        self.sprav.setText(''.join(operator))
    def step(self):
        global operator, operation
        operation = True
        operator.append('^')
        self.sprav.setText(''.join(operator))
    def delen(self):
        global operator, operation
        operation = True
        operator.append('/')
        self.sprav.setText(''.join(operator))
    def pr(self):
        global operator, operation
        operation = True
        operator.append('%')
        self.sprav.setText(''.join(operator))
            
    def delet(self):
        global operator, operation
        if len(operator) != 0:
            last = operator[-1]
            if last == 'sin' or last == 'cos' or last == 'tg' or last == 'ctg' or last == 'mr':
                del operator[-1]
            else:
                operator[-1] = operator[-1][:-1:]
            if operator[-1] == '':
                del operator[-1]
            if len(operator) != 0:
                self.window.display(operator[-1])
            else:
                operator = ['']
                self.window.display(0)
            self.sprav.setText(''.join(operator))
    def ac(self):
        global operator, operation, k
        k += 1
        if k == 7:
            self.resize(912, 689)
        operator = []
        operation = True
        self.window.display(0)
        self.sprav.setText(''.join(operator))
    
    def result(self):
        global operator, memory, operation
        try:
            while 'mr' in operator:
                index = operator.index('mr')
                operator[index] = memory
            while 'sin' in operator:
                index = operator.index('sin')
                rad = math.radians(float(operator[index + 1]))
                sin = math.sin(rad)
                del operator[index + 1]
                operator[index] = str(sin)
            while 'cos' in operator:
                index = operator.index('cos')
                rad = math.radians(float(operator[index + 1]))
                cos = math.cos(rad)
                del operator[index + 1]
                operator[index] = str(cos)
            while 'tg' in operator:
                index = operator.index('tg')
                rad = math.radians(float(operator[index + 1]))
                tg = math.tan(rad)
                del operator[index + 1]
                operator[index] = str(tg)
            while 'ctg' in operator:
                index = operator.index('ctg')
                rad = math.radians(float(operator[index + 1]))
                ctg = 1 / math.tan(rad)
                del operator[index + 1]
                operator[index] = str(ctg)
            while '^' in operator:
                index = operator.index('^')
                count = float(operator[index - 1]) ** float(operator[index + 1])
                del operator[index + 1]
                operator[index] = str(float(round(count, 15)))
                del operator[index - 1]
            while ('*' in operator) or ("/" in operator) or ("%" in operator):
                if '*' in operator:
                    index_1 = operator.index('*')
                else:
                    index_1 = 1000
                if '/' in operator:
                    index_2 = operator.index('/')
                else:
                    index_2 = 1000
                if '%' in operator:
                    index_3 = operator.index('%')
                else:
                    index_3 = 1000
                spisok = [index_1, index_2, index_3]
                if min(spisok) == index_2:
                    count = float(operator[index_2 - 1]) / float(operator[index_2 + 1])
                    del operator[index_2 + 1]
                    operator[index_2] = str(count)
                    del operator[index_2 - 1]
                elif min(spisok) == index_1:
                    count = float(operator[index_1 - 1]) * float(operator[index_1 + 1])
                    del operator[index_1 + 1]
                    operator[index_1] = str(float(round(count, 15)))
                    del operator[index_1 - 1]
                elif min(spisok) == index_3:
                    count = float(operator[index_3 - 1]) % float(operator[index_3 + 1])
                    del operator[index_3 + 1]
                    operator[index_3] = str(float(round(count, 15)))
                    del operator[index_3 - 1]
            while ('+' in operator) or ("-" in operator):
                if '+' in operator:
                    index_1 = operator.index('+')
                else:
                    index_1 = 1000
                if '-' in operator:
                    index_2 = operator.index('-')
                else:
                    index_2 = 1000
                if (index_1 > index_2) and (index_2 != -1):
                    count = float(operator[index_2 - 1]) - float(operator[index_2 + 1])
                    del operator[index_2 + 1]
                    operator[index_2] = str(count)
                    del operator[index_2 - 1]
                elif (index_1 < index_2) and (index_1 != -1):
                    count = float(operator[index_1 - 1]) + float(operator[index_1 + 1])
                    del operator[index_1 + 1]
                    operator[index_1] = str(count)
                    del operator[index_1 - 1]
            self.sprav.setText(''.join(operator))
            self.window.display(operator[0])
        except Exception:
            self.window.display('Error')
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        #MainWindow.resize(912, 689)
        MainWindow.resize(490, 440)
        font = QFont()
        font.setFamily("MS Gothic")
        MainWindow.setFont(font)
        MainWindow.setStyleSheet("background-color: rgb(0, 0, 0);")
        self.centralwidget = QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.window = QLCDNumber(self.centralwidget)
        self.window.setGeometry(QRect(10, 10, 461, 60))
        self.window.setStyleSheet("background-color: qradialgradient(spread:pad, cx:0.5, cy:0.5, radius:2, fx:0.5, fy:0.5, stop:1 rgba(249, 187, 0, 255));")
        self.window.setDigitCount(20)
        self.window.setObjectName("window")
        self.btn_ac = QPushButton(self.centralwidget)
        self.btn_ac.setGeometry(QRect(410, 320, 61, 50))
        font = QFont()
        font.setFamily("Segoe Script")
        font.setPointSize(20)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(9)
        self.btn_ac.setFont(font)
        self.btn_ac.setStyleSheet("font: 75 20pt \"Segoe Script\";color: rgb(255, 0, 0);\n"
"background-color: rgb(29, 29, 29);")
        self.btn_ac.setIconSize(QSize(16, 16))
        self.btn_ac.setObjectName("btn_ac")
        self.btn_mr = QPushButton(self.centralwidget)
        self.btn_mr.setGeometry(QRect(170, 80, 61, 50))
        font = QFont()
        font.setFamily("Segoe Script")
        font.setPointSize(15)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(9)
        self.btn_mr.setFont(font)
        self.btn_mr.setStyleSheet("background-color: rgb(29, 29, 29);color: rgb(0, 239, 239);font: 75 15pt \"Segoe Script\";")
        self.btn_mr.setIconSize(QSize(16, 16))
        self.btn_mr.setObjectName("btn_mr")
        self.btn_mc = QPushButton(self.centralwidget)
        self.btn_mc.setGeometry(QRect(250, 80, 61, 50))
        font = QFont()
        font.setFamily("Segoe Script")
        font.setPointSize(15)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(9)
        self.btn_mc.setFont(font)
        self.btn_mc.setStyleSheet("background-color: rgb(29, 29, 29);color: rgb(0, 239, 239);font: 75 15pt \"Segoe Script\";")
        self.btn_mc.setIconSize(QSize(16, 16))
        self.btn_mc.setObjectName("btn_mc")
        self.btn_m_plus = QPushButton(self.centralwidget)
        self.btn_m_plus.setEnabled(True)
        self.btn_m_plus.setGeometry(QRect(10, 80, 61, 50))
        self.btn_m_plus.setMaximumSize(QSize(61, 50))
        font = QFont()
        font.setFamily("Segoe Script")
        font.setPointSize(15)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(9)
        self.btn_m_plus.setFont(font)
        self.btn_m_plus.setCursor(QCursor(Qt.ArrowCursor))
        self.btn_m_plus.setMouseTracking(True)
        self.btn_m_plus.setStyleSheet("background-color: rgb(29, 29, 29);color: rgb(0, 239, 239);font: 75 15pt \"Segoe Script\";")
        self.btn_m_plus.setIconSize(QSize(16, 16))
        self.btn_m_plus.setCheckable(False)
        self.btn_m_plus.setChecked(False)
        self.btn_m_plus.setObjectName("btn_m_plus")
        self.btn_m_minus = QPushButton(self.centralwidget)
        self.btn_m_minus.setGeometry(QRect(90, 80, 61, 50))
        font = QFont()
        font.setFamily("Segoe Script")
        font.setPointSize(15)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(9)
        self.btn_m_minus.setFont(font)
        self.btn_m_minus.setStyleSheet("background-color: rgb(29, 29, 29);color: rgb(0, 239, 239);font: 75 15pt \"Segoe Script\";")
        self.btn_m_minus.setIconSize(QSize(16, 16))
        self.btn_m_minus.setObjectName("btn_m_minus")
        self.btn_cos = QPushButton(self.centralwidget)
        self.btn_cos.setGeometry(QRect(410, 80, 61, 50))
        font = QFont()
        font.setFamily("Segoe Script")
        font.setPointSize(20)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(9)
        self.btn_cos.setFont(font)
        self.btn_cos.setStyleSheet("background-color: rgb(29, 29, 29);color: rgb(255, 169, 254);font: 75 20pt \"Segoe Script\";")
        self.btn_cos.setIconSize(QSize(16, 16))
        self.btn_cos.setObjectName("btn_cos")
        self.btn_sin = QPushButton(self.centralwidget)
        self.btn_sin.setGeometry(QRect(330, 80, 61, 50))
        font = QFont()
        font.setFamily("Segoe Script")
        font.setPointSize(20)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(9)
        self.btn_sin.setFont(font)
        self.btn_sin.setStyleSheet("background-color: rgb(29, 29, 29);color: rgb(255, 169, 254);font: 75 20pt \"Segoe Script\";")
        self.btn_sin.setIconSize(QSize(16, 16))
        self.btn_sin.setObjectName("btn_sin")
        self.btn_tg = QPushButton(self.centralwidget)
        self.btn_tg.setGeometry(QRect(330, 140, 61, 50))
        font = QFont()
        font.setFamily("Segoe Script")
        font.setPointSize(20)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(9)
        self.btn_tg.setFont(font)
        self.btn_tg.setStyleSheet("background-color: rgb(29, 29, 29);color: rgb(255, 169, 254);font: 75 20pt \"Segoe Script\";")
        self.btn_tg.setIconSize(QSize(16, 16))
        self.btn_tg.setObjectName("btn_tg")
        self.btn_minus = QPushButton(self.centralwidget)
        self.btn_minus.setGeometry(QRect(250, 200, 61, 50))
        font = QFont()
        font.setFamily("Segoe Script")
        font.setPointSize(30)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(9)
        self.btn_minus.setFont(font)
        self.btn_minus.setStyleSheet("background-color: rgb(29, 29, 29);font: 75 30pt \"Segoe Script\";color: rgb(27, 147, 0);")
        self.btn_minus.setIconSize(QSize(16, 16))
        self.btn_minus.setObjectName("btn_minus")
        self.btn_plus = QPushButton(self.centralwidget)
        self.btn_plus.setGeometry(QRect(250, 140, 61, 50))
        font = QFont()
        font.setFamily("Segoe Script")
        font.setPointSize(30)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(9)
        self.btn_plus.setFont(font)
        self.btn_plus.setStyleSheet("background-color: rgb(29, 29, 29);font: 75 30pt \"Segoe Script\";color: rgb(27, 147, 0);")
        self.btn_plus.setIconSize(QSize(16, 16))
        self.btn_plus.setObjectName("btn_plus")
        self.btn_ymn = QPushButton(self.centralwidget)
        self.btn_ymn.setGeometry(QRect(250, 260, 61, 50))
        font = QFont()
        font.setFamily("Segoe Script")
        font.setPointSize(30)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(9)
        self.btn_ymn.setFont(font)
        self.btn_ymn.setStyleSheet("background-color: rgb(29, 29, 29);font: 75 30pt \"Segoe Script\";color: rgb(27, 147, 0);")
        self.btn_ymn.setIconSize(QSize(16, 16))
        self.btn_ymn.setObjectName("btn_ymn")
        self.btn_result = QPushButton(self.centralwidget)
        self.btn_result.setGeometry(QRect(330, 320, 61, 50))
        font = QFont()
        font.setFamily("Segoe Script")
        font.setPointSize(40)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(9)
        self.btn_result.setFont(font)
        self.btn_result.setStyleSheet("background-color: rgb(29, 29, 29);font: 75 40pt \"Segoe Script\";color: rgb(255, 140, 0);")
        self.btn_result.setIconSize(QSize(16, 16))
        self.btn_result.setObjectName("btn_result")
        self.btn_step = QPushButton(self.centralwidget)
        self.btn_step.setGeometry(QRect(330, 200, 61, 50))
        font = QFont()
        font.setFamily("Segoe Script")
        font.setPointSize(30)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(9)
        self.btn_step.setFont(font)
        self.btn_step.setStyleSheet("background-color: rgb(29, 29, 29);font: 75 30pt \"Segoe Script\";color: rgb(27, 147, 0);")
        self.btn_step.setIconSize(QSize(16, 16))
        self.btn_step.setObjectName("btn_step")
        self.btn_1 = QPushButton(self.centralwidget)
        self.btn_1.setGeometry(QRect(10, 140, 61, 50))
        font = QFont()
        font.setFamily("Segoe Script")
        font.setPointSize(30)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(9)
        self.btn_1.setFont(font)
        self.btn_1.setMouseTracking(False)
        self.btn_1.setStyleSheet("background-color: rgb(29, 29, 29);color: rgb(0, 85, 255);font: 75 30pt \"Segoe Script\";")
        self.btn_1.setIconSize(QSize(16, 16))
        self.btn_1.setCheckable(False)
        self.btn_1.setChecked(False)
        self.btn_1.setObjectName("btn_1")
        self.btn_2 = QPushButton(self.centralwidget)
        self.btn_2.setGeometry(QRect(90, 140, 61, 50))
        font = QFont()
        font.setFamily("Segoe Script")
        font.setPointSize(30)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(9)
        self.btn_2.setFont(font)
        self.btn_2.setStyleSheet("background-color: rgb(29, 29, 29);color: rgb(0, 85, 255);font: 75 30pt \"Segoe Script\";")
        self.btn_2.setIconSize(QSize(16, 16))
        self.btn_2.setObjectName("btn_2")
        self.btn_3 = QPushButton(self.centralwidget)
        self.btn_3.setGeometry(QRect(170, 140, 61, 50))
        font = QFont()
        font.setFamily("Segoe Script")
        font.setPointSize(30)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(9)
        self.btn_3.setFont(font)
        self.btn_3.setStyleSheet("background-color: rgb(29, 29, 29);color: rgb(0, 85, 255);font: 75 30pt \"Segoe Script\";")
        self.btn_3.setIconSize(QSize(16, 16))
        self.btn_3.setObjectName("btn_3")
        self.btn_4 = QPushButton(self.centralwidget)
        self.btn_4.setGeometry(QRect(10, 200, 61, 50))
        font = QFont()
        font.setFamily("Segoe Script")
        font.setPointSize(30)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(9)
        self.btn_4.setFont(font)
        self.btn_4.setStyleSheet("background-color: rgb(29, 29, 29);color: rgb(0, 85, 255);font: 75 30pt \"Segoe Script\";")
        self.btn_4.setIconSize(QSize(16, 16))
        self.btn_4.setObjectName("btn_4")
        self.btn_5 = QPushButton(self.centralwidget)
        self.btn_5.setGeometry(QRect(90, 200, 61, 50))
        font = QFont()
        font.setFamily("Segoe Script")
        font.setPointSize(30)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(9)
        self.btn_5.setFont(font)
        self.btn_5.setStyleSheet("background-color: rgb(29, 29, 29);color: rgb(0, 85, 255);font: 75 30pt \"Segoe Script\";")
        self.btn_5.setIconSize(QSize(16, 16))
        self.btn_5.setObjectName("btn_5")
        self.btn_6 = QPushButton(self.centralwidget)
        self.btn_6.setGeometry(QRect(170, 200, 61, 50))
        font = QFont()
        font.setFamily("Segoe Script")
        font.setPointSize(30)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(9)
        self.btn_6.setFont(font)
        self.btn_6.setStyleSheet("background-color: rgb(29, 29, 29);font: 75 30pt \"Segoe Script\";color: rgb(0, 85, 255);")
        self.btn_6.setIconSize(QSize(16, 16))
        self.btn_6.setObjectName("btn_6")
        self.btn_7 = QPushButton(self.centralwidget)
        self.btn_7.setGeometry(QRect(10, 260, 61, 50))
        font = QFont()
        font.setFamily("Segoe Script")
        font.setPointSize(30)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(9)
        self.btn_7.setFont(font)
        self.btn_7.setStyleSheet("background-color: rgb(29, 29, 29);font: 75 30pt \"Segoe Script\";color: rgb(0, 85, 255);")
        self.btn_7.setIconSize(QSize(16, 16))
        self.btn_7.setObjectName("btn_7")
        self.btn_8 = QPushButton(self.centralwidget)
        self.btn_8.setGeometry(QRect(90, 260, 61, 50))
        font = QFont()
        font.setFamily("Segoe Script")
        font.setPointSize(30)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(9)
        self.btn_8.setFont(font)
        self.btn_8.setStyleSheet("background-color: rgb(29, 29, 29);font: 75 30pt \"Segoe Script\";color: rgb(0, 85, 255);")
        self.btn_8.setIconSize(QSize(16, 16))
        self.btn_8.setObjectName("btn_8")
        self.btn_9 = QPushButton(self.centralwidget)
        self.btn_9.setGeometry(QRect(170, 260, 61, 50))
        font = QFont()
        font.setFamily("Segoe Script")
        font.setPointSize(30)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(9)
        self.btn_9.setFont(font)
        self.btn_9.setStyleSheet("background-color: rgb(29, 29, 29);font: 75 30pt \"Segoe Script\";color: rgb(0, 85, 255);")
        self.btn_9.setIconSize(QSize(16, 16))
        self.btn_9.setObjectName("btn_9")
        self.btn_0 = QPushButton(self.centralwidget)
        self.btn_0.setGeometry(QRect(10, 320, 61, 50))
        font = QFont()
        font.setFamily("Segoe Script")
        font.setPointSize(30)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(9)
        self.btn_0.setFont(font)
        self.btn_0.setStyleSheet("background-color: rgb(29, 29, 29);font: 75 30pt \"Segoe Script\";color: rgb(0, 85, 255);")
        self.btn_0.setIconSize(QSize(16, 16))
        self.btn_0.setObjectName("btn_0")
        self.btn_ctg = QPushButton(self.centralwidget)
        self.btn_ctg.setGeometry(QRect(410, 140, 61, 50))
        font = QFont()
        font.setFamily("Segoe Script")
        font.setPointSize(20)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(9)
        self.btn_ctg.setFont(font)
        self.btn_ctg.setStyleSheet("background-color: rgb(29, 29, 29);color: rgb(255, 169, 254);font: 75 20pt \"Segoe Script\";")
        self.btn_ctg.setIconSize(QSize(16, 16))
        self.btn_ctg.setObjectName("btn_ctg")
        self.btn_delen = QPushButton(self.centralwidget)
        self.btn_delen.setGeometry(QRect(330, 260, 61, 50))
        font = QFont()
        font.setFamily("Segoe Script")
        font.setPointSize(30)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(9)
        self.btn_delen.setFont(font)
        self.btn_delen.setStyleSheet("background-color: rgb(29, 29, 29);font: 75 30pt \"Segoe Script\";color: rgb(27, 147, 0);")
        self.btn_delen.setIconSize(QSize(16, 16))
        self.btn_delen.setObjectName("btn_delen")
        self.Sprav = QLabel(self.centralwidget)
        self.Sprav.setGeometry(QRect(500, 10, 401, 50))
        font = QFont()
        font.setFamily("Segoe Script")
        font.setPointSize(20)
        self.Sprav.setFont(font)
        self.Sprav.setStyleSheet("color: rgb(255, 255, 255);\n"
"color: rgb(255, 255, 0);")
        self.Sprav.setObjectName("Sprav")
        self.Text_sprav = QTextBrowser(self.centralwidget)
        self.Text_sprav.setGeometry(QRect(490, 69, 411, 351))
        font = QFont()
        font.setFamily("Segoe Script")
        font.setPointSize(12)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(50)
        self.Text_sprav.setFont(font)
        self.Text_sprav.setStyleSheet("color: rgb(255, 255, 0);\n"
"font: 12pt \"Segoe Script\";")
        self.Text_sprav.setObjectName("Text_sprav")
        self.textEdit = QTextEdit(self.centralwidget)
        self.textEdit.setGeometry(QRect(10, 480, 391, 160))
        font = QFont()
        font.setPointSize(14)
        self.textEdit.setFont(font)
        self.textEdit.setStyleSheet("color: rgb(255, 170, 0);")
        self.textEdit.setObjectName("textEdit")
        self.Sprav_2 = QLabel(self.centralwidget)
        self.Sprav_2.setGeometry(QRect(10, 430, 391, 41))
        font = QFont()
        font.setFamily("Segoe Script")
        font.setPointSize(20)
        self.Sprav_2.setFont(font)
        self.Sprav_2.setStyleSheet("color: rgb(255, 255, 255);\n"
"color: rgb(255, 255, 0);")
        self.Sprav_2.setObjectName("Sprav_2")
        self.Text_sprav_2 = QTextBrowser(self.centralwidget)
        self.Text_sprav_2.setGeometry(QRect(410, 480, 491, 161))
        font = QFont()
        font.setFamily("Segoe Script")
        font.setPointSize(12)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(50)
        self.Text_sprav_2.setFont(font)
        self.Text_sprav_2.setStyleSheet("color: rgb(255, 255, 0);\n"
"font: 12pt \"Segoe Script\";")
        self.Text_sprav_2.setObjectName("Text_sprav_2")
        self.m = QLabel(self.centralwidget)
        self.m.setGeometry(QRect(13, 13, 20, 10))
        font = QFont()
        font.setFamily("Segoe Script")
        font.setPointSize(9)
        self.m.setFont(font)
        self.m.setStyleSheet("background-color: qradialgradient(spread:pad, cx:0.5, cy:0.5, radius:2, fx:0.5, fy:0.5, stop:1 rgba(249, 187, 0, 255));")
        self.m.setText("")
        self.m.setObjectName("m")
        self.btn_floating = QPushButton(self.centralwidget)
        self.btn_floating.setGeometry(QRect(250, 320, 61, 50))
        font = QFont()
        font.setFamily("Segoe Script")
        font.setPointSize(40)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(9)
        self.btn_floating.setFont(font)
        self.btn_floating.setStyleSheet("background-color: rgb(29, 29, 29);font: 75 40pt \"Segoe Script\";\n"
"color: rgb(20, 24, 255);")
        self.btn_floating.setIconSize(QSize(16, 16))
        self.btn_floating.setObjectName("btn_floating")
        self.btn_00 = QPushButton(self.centralwidget)
        self.btn_00.setGeometry(QRect(90, 320, 141, 50))
        font = QFont()
        font.setFamily("Segoe Script")
        font.setPointSize(30)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(9)
        self.btn_00.setFont(font)
        self.btn_00.setStyleSheet("background-color: rgb(29, 29, 29);color: rgb(0, 85, 255);font: 75 30pt \"Segoe Script\";")
        self.btn_00.setIconSize(QSize(16, 16))
        self.btn_00.setObjectName("btn_00")
        self.btn_delet = QPushButton(self.centralwidget)
        self.btn_delet.setGeometry(QRect(410, 260, 61, 50))
        font = QFont()
        font.setFamily("Segoe Script")
        font.setPointSize(20)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(9)
        self.btn_delet.setFont(font)
        self.btn_delet.setStyleSheet("background-color: rgb(29, 29, 29);color: rgb(255, 0, 0);font: 75 20pt \"Segoe Script\";")
        self.btn_delet.setIconSize(QSize(16, 16))
        self.btn_delet.setObjectName("btn_delet")
        self.btn_pr = QPushButton(self.centralwidget)
        self.btn_pr.setGeometry(QRect(410, 200, 61, 50))
        font = QFont()
        font.setFamily("Segoe Script")
        font.setPointSize(30)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(9)
        self.btn_pr.setFont(font)
        self.btn_pr.setStyleSheet("background-color: rgb(29, 29, 29);color: rgb(27, 147, 0);font: 75 30pt \"Segoe Script\";")
        self.btn_pr.setIconSize(QSize(16, 16))
        self.btn_pr.setObjectName("btn_pr")
        self.sprav = QLabel(self.centralwidget)
        self.sprav.setGeometry(QRect(40, 380, 441, 41))
        font = QFont()
        font.setFamily("Segoe Script")
        font.setPointSize(15)
        self.sprav.setFont(font)
        self.sprav.setStyleSheet("color: rgb(255, 255, 255);")
        self.sprav.setText("")
        self.sprav.setObjectName("sprav")
        self.Sprav_4 = QLabel(self.centralwidget)
        self.Sprav_4.setGeometry(QRect(410, 430, 491, 41))
        font = QFont()
        font.setFamily("Segoe Script")
        font.setPointSize(20)
        self.Sprav_4.setFont(font)
        self.Sprav_4.setStyleSheet("color: rgb(255, 255, 255);\n"
"color: rgb(255, 255, 0);")
        self.Sprav_4.setObjectName("Sprav_4")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QMenuBar(MainWindow)
        self.menubar.setGeometry(QRect(0, 0, 912, 21))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.btn_ac.setText(_translate("MainWindow", "AC"))
        self.btn_mr.setText(_translate("MainWindow", "MR"))
        self.btn_mc.setText(_translate("MainWindow", "MC"))
        self.btn_m_plus.setText(_translate("MainWindow", "M+"))
        self.btn_m_minus.setText(_translate("MainWindow", "M-"))
        self.btn_cos.setText(_translate("MainWindow", "cos"))
        self.btn_sin.setText(_translate("MainWindow", "sin"))
        self.btn_tg.setText(_translate("MainWindow", "tg"))
        self.btn_minus.setText(_translate("MainWindow", "-"))
        self.btn_plus.setText(_translate("MainWindow", "+"))
        self.btn_ymn.setText(_translate("MainWindow", "x"))
        self.btn_result.setText(_translate("MainWindow", "="))
        self.btn_step.setText(_translate("MainWindow", "^"))
        self.btn_1.setText(_translate("MainWindow", "1"))
        self.btn_2.setText(_translate("MainWindow", "2"))
        self.btn_3.setText(_translate("MainWindow", "3"))
        self.btn_4.setText(_translate("MainWindow", "4"))
        self.btn_5.setText(_translate("MainWindow", "5"))
        self.btn_6.setText(_translate("MainWindow", "6"))
        self.btn_7.setText(_translate("MainWindow", "7"))
        self.btn_8.setText(_translate("MainWindow", "8"))
        self.btn_9.setText(_translate("MainWindow", "9"))
        self.btn_0.setText(_translate("MainWindow", "0"))
        self.btn_ctg.setText(_translate("MainWindow", "ctg"))
        self.btn_delen.setText(_translate("MainWindow", "/"))
        self.Sprav.setText(_translate("MainWindow", "         Справочник"))
        self.Text_sprav.setHtml(_translate("MainWindow", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
"p, li { white-space: pre-wrap; }\n"
"</style></head><body style=\" font-family:\'Segoe Script\'; font-size:12pt; font-weight:400; font-style:normal;\">\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:36px; margin-right:36px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Lato-Regular,Arial,sans-serif\'; color:#0febff;\">[M+] – прибавление числа в память</span></p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:36px; margin-right:36px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Lato-Regular,Arial,sans-serif\'; color:#0febff;\">[M-] – вычитание числа из памяти</span></p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:36px; margin-right:36px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Lato-Regular,Arial,sans-serif\'; color:#0febff;\">[^] – возведение в выбранную степень</span></p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:36px; margin-right:36px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Lato-Regular,Arial,sans-serif\'; color:#0febff;\">[+][-][x][</span><span style=\" font-family:\'Symbol\'; color:#0febff;\">¸</span><span style=\" font-family:\'Lato-Regular,Arial,sans-serif\'; color:#0febff;\">] – арифметические операции</span></p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:36px; margin-right:36px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Lato-Regular,Arial,sans-serif\'; color:#0febff;\">[MR] – вывести содержимое памяти на дисплей</span></p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:36px; margin-right:36px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Lato-Regular,Arial,sans-serif\'; color:#0febff;\">[MC] – очистить содержимое памяти</span></p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:36px; margin-right:36px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Lato-Regular,Arial,sans-serif\'; color:#0febff;\">[AC] – общий сброс</span></p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:36px; margin-right:36px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Lato-Regular,Arial,sans-serif\'; color:#0febff;\">[sin][cos][tg][ctg] – формулы произведения тригонометрических функций, при работе с этими функциями сначала записывается sin, cos, tg, ctg потом число(Например sin 45)</span></p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:36px; margin-right:36px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'MS Shell Dlg 2\'; color:#0febff;\">[Del]</span><span style=\" font-family:\'Lato-Regular,Arial,sans-serif\'; color:#0febff;\"> – удаляет последнюю введенную цифру или знак действия</span></p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:36px; margin-right:36px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'MS Shell Dlg 2\'; color:#0febff;\">[%]</span><span style=\" font-family:\'Lato-Regular,Arial,sans-serif\'; color:#0febff;\"> – вычисляет остаток от деления</span><span style=\" font-family:\'MS Shell Dlg 2\'; font-size:8pt; color:#0febff;\"><br /></span><span style=\" font-family:\'MS Shell Dlg 2\'; color:#0febff;\">[.]</span><span style=\" font-family:\'Lato-Regular,Arial,sans-serif\'; color:#0febff;\"> – используется для записи дробной части</span></p></body></html>"))
        self.Sprav_2.setText(_translate("MainWindow", "        Для заметок"))
        self.Text_sprav_2.setHtml(_translate("MainWindow", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
"p, li { white-space: pre-wrap; }\n"
"</style></head><body style=\" font-family:\'Segoe Script\'; font-size:12pt; font-weight:400; font-style:normal;\">\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'MS Shell Dlg 2\'; font-size:10pt; color:#00ff7f;\">    </span><span style=\" font-family:\'MS Shell Dlg 2\'; font-size:10pt; color:#11ff00;\">  - Если указанный порядок действий невозможно вычислить</span></p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'MS Shell Dlg 2\'; font-size:10pt; color:#11ff00;\">      - Если мы накасячили</span></p>\n"
"<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:\'MS Shell Dlg 2\'; font-size:10pt; color:#11ff00;\"><br /></p>\n"
"<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:\'MS Shell Dlg 2\'; font-size:10pt; color:#11ff00;\"><br /></p>\n"
"<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:\'MS Shell Dlg 2\'; font-size:10pt; color:#11ff00;\"><br /></p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'MS Shell Dlg 2\'; font-size:10pt; color:#11ff00;\">                   По всем вопросам обращайтесь  https://vk.com/vasily.shishkin</span></p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'MS Shell Dlg 2\'; font-size:10pt; color:#11ff00;\">                                                                    https://vk.com/andrey.krivosheev</span></p></body></html>"))
        self.btn_floating.setText(_translate("MainWindow", "."))
        self.btn_00.setText(_translate("MainWindow", "00"))
        self.btn_delet.setText(_translate("MainWindow", "Del"))
        self.btn_pr.setText(_translate("MainWindow", "%"))
        self.Sprav_4.setText(_translate("MainWindow", "  Почему появляется ошибка?"))       
Exemplo n.º 26
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")
Exemplo n.º 27
0
class Run_gui(QMainWindow):
    def __init__(self):
        super().__init__()

        self.cwd = os.getcwd()
        self.load_()

        # Enable antialiasing for prettier plots
        self.initUI()

    def initUI(self):

        ################### MENU BARS START ##################
        MyBar = QMenuBar(self)

        fileMenu = MyBar.addMenu("File")

        self.fileSave = fileMenu.addAction("Save thinfilm config")
        self.fileSave.triggered.connect(self.save_)
        self.fileSave.setShortcut('Ctrl+S')

        self.fileLoadAs = fileMenu.addAction("Load config section")
        self.fileLoadAs.triggered.connect(self.load_config_dialog)

        fileClose = fileMenu.addAction("Close")
        fileClose.triggered.connect(self.close)  # triggers closeEvent()
        fileClose.setShortcut('Ctrl+X')

        self.loadMenu = MyBar.addMenu("Load data")
        loadSubOlis = self.loadMenu.addAction("OLIS sub")
        loadSubFilmOlis = self.loadMenu.addAction("OLIS sub + thin film")
        loadSubFTIR = self.loadMenu.addAction("FTIR sub")
        loadSubFilmFTIR = self.loadMenu.addAction("FTIR sub + thin film")

        loadSubOlis.triggered.connect(self.loadSubOlisDialog)
        loadSubFilmOlis.triggered.connect(self.loadSubFilmOlisDialog)
        loadSubFTIR.triggered.connect(self.loadSubFTIRDialog)
        loadSubFilmFTIR.triggered.connect(self.loadSubFilmFTIRDialog)

        self.emailMenu = MyBar.addMenu("E-mail")
        self.emailSettings = self.emailMenu.addAction("E-mail settings")
        self.emailSettings.triggered.connect(self.email_set_dialog)
        self.emailData = self.emailMenu.addAction("E-mail data")
        self.emailData.triggered.connect(self.email_data_dialog)

        helpMenu = MyBar.addMenu("Help")
        helpParam = helpMenu.addAction("Instructions")
        helpParam.triggered.connect(self.helpParamDialog)
        contact = helpMenu.addAction("Contact")
        contact.triggered.connect(self.contactDialog)

        ################### MENU BARS END ##################

        # status info which button has been pressed
        Start_lbl = QLabel("PLOTS and analysis steps", self)
        Start_lbl.setStyleSheet("color: blue")

        self.Step0_Button = QPushButton("Raw data", self)
        self.Step0_Button.setToolTip("STEP 0. Plot raw data for OLIS and FTIR")
        self.button_style(self.Step0_Button, 'black')

        self.Step1_Button = QPushButton("Tmin and Tmax", self)
        self.Step1_Button.setToolTip(
            "STEP 1. Find all the minima and maxima positions using Gaussian filter"
        )
        self.button_style(self.Step1_Button, 'black')

        self.Step2_Button = QPushButton("Std.Dev. in d", self)
        self.Step2_Button.setToolTip(
            "STEP 2. Minimize standard deviation in the film thickness d")
        self.button_style(self.Step2_Button, 'black')

        self.Step3_Button = QPushButton("Index n", self)
        self.Step3_Button.setToolTip(
            "STEP 3. Plot refractive indicies n1 and n2")
        self.button_style(self.Step3_Button, 'black')

        self.Step4_Button = QPushButton("Absorption alpha", self)
        self.Step4_Button.setToolTip(
            "STEP 4. Plot abosorption alpha based on n2")
        self.button_style(self.Step4_Button, 'black')

        self.Step5_Button = QPushButton("Wavenumber k", self)
        self.Step5_Button.setToolTip("STEP 5. Plot wavenumber k based on n2")
        self.button_style(self.Step5_Button, 'black')

        ####################################################

        # status info which button has been pressed
        self.NewFiles = QLabel('No files created yet!', self)
        self.NewFiles.setStyleSheet("color: blue")

        newfont = QFont("Times", 10, QFont.Normal)
        self.NewFiles.setFont(newfont)
        '''
		self.NewFiles = numpy.zeros(5,dtype=object)
		for i in range(4):
			self.NewFiles[i] = QLabel(''.join([str(i+1),': ']), self)
			self.NewFiles[i].setStyleSheet("color: magenta")
		'''

        ####################################################
        loads_lbl = QLabel("RAW data files", self)
        loads_lbl.setStyleSheet("color: blue")

        configFile_lbl = QLabel("Current thinfilm", self)
        self.config_file_lbl = QLabel("", self)
        self.config_file_lbl.setStyleSheet("color: green")

        loadSubOlis_lbl = QLabel("OLIS sub", self)
        self.loadSubOlisFile_lbl = QLabel("", self)
        self.loadSubOlisFile_lbl.setStyleSheet("color: magenta")

        loadSubFilmOlis_lbl = QLabel("OLIS sub + thin film", self)
        self.loadSubFilmOlisFile_lbl = QLabel("", self)
        self.loadSubFilmOlisFile_lbl.setStyleSheet("color: magenta")

        loadSubFTIR_lbl = QLabel("FTIR sub", self)
        self.loadSubFTIRFile_lbl = QLabel("", self)
        self.loadSubFTIRFile_lbl.setStyleSheet("color: magenta")

        loadSubFilmFTIR_lbl = QLabel("FTIR sub + thin film", self)
        self.loadSubFilmFTIRFile_lbl = QLabel("", self)
        self.loadSubFilmFTIRFile_lbl.setStyleSheet("color: magenta")

        self.cb_sub_olis = QCheckBox('', self)
        self.cb_sub_olis.toggle()
        self.cb_subfilm_olis = QCheckBox('', self)
        self.cb_subfilm_olis.toggle()
        self.cb_sub_ftir = QCheckBox('', self)
        self.cb_sub_ftir.toggle()
        self.cb_subfilm_ftir = QCheckBox('', self)
        self.cb_subfilm_ftir.toggle()

        plot_X_lbl = QLabel("Plot X axis in", self)
        self.combo2 = QComboBox(self)
        self.mylist2 = ["eV", "nm"]
        self.combo2.addItems(self.mylist2)
        self.combo2.setFixedWidth(70)

        ####################################################

        lbl1 = QLabel("GAUSSIAN filter settings", self)
        lbl1.setStyleSheet("color: blue")

        interpol_lbl = QLabel("Interpolation method", self)
        self.combo4 = QComboBox(self)
        self.mylist4 = ["spline", "linear"]
        self.combo4.setToolTip(
            "Interpolation method for local minima Tmin and local maxima Tmax can only be linear or spline."
        )
        self.combo4.addItems(self.mylist4)
        self.combo4.setFixedWidth(70)

        factors_lbl = QLabel("Gaussian factors", self)
        self.factorsEdit = QLineEdit("", self)
        self.factorsEdit.setToolTip(
            "HIGH gaussian factor = broadband noise filtering.\nLOW gaussian factor = narrowband noise filtering.\nHigh gauissian factors (>2) will result in relatively large deviation from the raw data.\nGauissian factors of zero or near zero (<0.5) will closely follow trend of the raw data."
        )
        self.factorsEdit.setFixedWidth(200)

        borders_lbl = QLabel("Gaussian borders [eV]", self)
        self.bordersEdit = QLineEdit("", self)
        self.bordersEdit.setToolTip(
            "Gaussian borders should be typed in ascending order and the number of\nborders is always one more compared with the number of Gaussian factors."
        )
        self.bordersEdit.setFixedWidth(200)

        ##############################################

        lbl2 = QLabel("ABSORPTION alpha and n1 and n2", self)
        lbl2.setStyleSheet("color: blue")

        poly_lbl = QLabel("Polyfit order", self)
        self.combo1 = QComboBox(self)
        self.mylist1 = ["1", "2", "3", "4", "5"]
        self.combo1.addItems(self.mylist1)
        self.combo1.setFixedWidth(70)

        polybord_lbl = QLabel("Polyfit range(s) [eV]", self)
        self.poly_bordersEdit = QLineEdit("", self)
        self.poly_bordersEdit.setFixedWidth(140)

        self.cb_polybord = QCheckBox('', self)
        self.cb_polybord.toggle()

        ignore_data_lbl = QLabel("No. of ignored points", self)
        self.ignore_data_ptsEdit = QLineEdit("", self)
        self.ignore_data_ptsEdit.setFixedWidth(140)

        corr_slit_lbl = QLabel("Correction slit width [nm]", self)
        self.corr_slitEdit = QLineEdit("", self)
        self.corr_slitEdit.setToolTip(
            "Finite spectrometer bandwidth (slit width) in the transmission spectrum."
        )
        self.corr_slitEdit.setFixedWidth(140)

        ##############################################

        lbl4 = QLabel("STORAGE location (folder/file)", self)
        lbl4.setStyleSheet("color: blue")
        self.filenameEdit = QLineEdit("", self)
        #self.filenameEdit.setFixedWidth(180)

        self.cb_save_figs = QCheckBox('Save figs', self)
        self.cb_save_figs.toggle()

        ##############################################

        self.lcd = QLCDNumber(self)
        self.lcd.setStyleSheet("color: red")
        self.lcd.setFixedHeight(60)
        self.lcd.setSegmentStyle(QLCDNumber.Flat)
        self.lcd.setToolTip("Timetrace for saving files")
        self.lcd.setNumDigits(11)

        ##############################################

        self.initUI_()

        ##############################################

        # Add all widgets
        g1_0 = QGridLayout()
        g1_0.addWidget(MyBar, 0, 0)
        g1_1 = QGridLayout()
        g1_1.addWidget(loads_lbl, 0, 0)
        g1_1.addWidget(configFile_lbl, 1, 0)
        g1_1.addWidget(self.config_file_lbl, 1, 1)
        g1_1.addWidget(loadSubOlis_lbl, 2, 0)
        g1_1.addWidget(self.loadSubOlisFile_lbl, 2, 1)
        g1_1.addWidget(self.cb_sub_olis, 2, 2)
        g1_1.addWidget(loadSubFilmOlis_lbl, 3, 0)
        g1_1.addWidget(self.loadSubFilmOlisFile_lbl, 3, 1)
        g1_1.addWidget(self.cb_subfilm_olis, 3, 2)
        g1_1.addWidget(loadSubFTIR_lbl, 4, 0)
        g1_1.addWidget(self.loadSubFTIRFile_lbl, 4, 1)
        g1_1.addWidget(self.cb_sub_ftir, 4, 2)
        g1_1.addWidget(loadSubFilmFTIR_lbl, 5, 0)
        g1_1.addWidget(self.loadSubFilmFTIRFile_lbl, 5, 1)
        g1_1.addWidget(self.cb_subfilm_ftir, 5, 2)
        g1_1.addWidget(plot_X_lbl, 6, 0)
        g1_1.addWidget(self.combo2, 6, 1)

        g1_2 = QGridLayout()
        g1_2.addWidget(lbl1, 0, 0)
        g1_3 = QGridLayout()
        g1_3.addWidget(interpol_lbl, 0, 0)
        g1_3.addWidget(self.combo4, 0, 1)
        g1_3.addWidget(factors_lbl, 1, 0)
        g1_3.addWidget(self.factorsEdit, 1, 1)
        g1_3.addWidget(borders_lbl, 2, 0)
        g1_3.addWidget(self.bordersEdit, 2, 1)

        g1_4 = QGridLayout()
        g1_4.addWidget(lbl2, 0, 0)
        g1_5 = QGridLayout()
        g1_5.addWidget(poly_lbl, 0, 0)
        g1_5.addWidget(self.combo1, 0, 1)
        g1_5.addWidget(polybord_lbl, 1, 0)
        g1_5.addWidget(self.poly_bordersEdit, 1, 1)
        g1_5.addWidget(self.cb_polybord, 1, 2)
        g1_5.addWidget(ignore_data_lbl, 2, 0)
        g1_5.addWidget(self.ignore_data_ptsEdit, 2, 1)
        g1_5.addWidget(corr_slit_lbl, 3, 0)
        g1_5.addWidget(self.corr_slitEdit, 3, 1)

        g4_0 = QGridLayout()
        g4_0.addWidget(lbl4, 0, 0)
        g4_0.addWidget(self.cb_save_figs, 0, 1)
        g4_1 = QGridLayout()
        g4_1.addWidget(self.filenameEdit, 0, 0)

        v1 = QVBoxLayout()
        v1.addLayout(g1_0)
        v1.addLayout(g1_1)
        v1.addLayout(g1_2)
        v1.addLayout(g1_3)
        v1.addLayout(g1_4)
        v1.addLayout(g1_5)
        v1.addLayout(g4_0)
        v1.addLayout(g4_1)

        ###################################################

        g1_6 = QGridLayout()
        g1_6.addWidget(Start_lbl, 0, 0)
        g1_7 = QGridLayout()
        g1_7.addWidget(self.Step0_Button, 0, 0)
        g1_7.addWidget(self.Step1_Button, 1, 0)
        g1_7.addWidget(self.Step2_Button, 2, 0)
        g1_7.addWidget(self.Step3_Button, 3, 0)
        g1_7.addWidget(self.Step4_Button, 4, 0)
        g1_7.addWidget(self.Step5_Button, 5, 0)

        g1_8 = QGridLayout()
        g1_8.addWidget(self.NewFiles, 0, 0)
        g1_8.addWidget(self.lcd, 1, 0)

        v0 = QVBoxLayout()
        v0.addLayout(g1_6)
        v0.addLayout(g1_7)
        v0.addLayout(g1_8)

        # SET ALL VERTICAL COLUMNS TOGETHER
        hbox = QHBoxLayout()
        hbox.addLayout(v1)
        hbox.addLayout(v0)

        ###############################################################################

        # reacts to choises picked in the menu
        self.combo1.activated[str].connect(self.onActivated1)
        self.combo2.activated[str].connect(self.onActivated2)
        self.combo4.activated[str].connect(self.onActivated4)

        # reacts to choises picked in the menu
        self.Step0_Button.clicked.connect(self.set_run)
        self.Step1_Button.clicked.connect(self.set_run)
        self.Step2_Button.clicked.connect(self.set_run)
        self.Step3_Button.clicked.connect(self.set_run)
        self.Step4_Button.clicked.connect(self.set_run)
        self.Step5_Button.clicked.connect(self.set_run)

        # reacts to choises picked in the checkbox
        self.cb_sub_olis.stateChanged.connect(self.sub_olis_check)
        self.cb_subfilm_olis.stateChanged.connect(self.subfilm_olis_check)
        self.cb_sub_ftir.stateChanged.connect(self.sub_ftir_check)
        self.cb_subfilm_ftir.stateChanged.connect(self.subfilm_ftir_check)
        self.cb_save_figs.stateChanged.connect(self.save_figs_check)
        self.cb_polybord.stateChanged.connect(self.polybord_check)

        self.threadpool = QThreadPool()
        print("Multithreading in TEST_gui_v1 with maximum %d threads" %
              self.threadpool.maxThreadCount())
        self.isRunning = False

        self.move(0, 0)
        #self.setGeometry(50, 50, 800, 500)
        hbox.setSizeConstraint(hbox.SetFixedSize)
        self.setWindowTitle("Swanepoel method for thin film analysis")

        w = QWidget()
        w.setLayout(hbox)
        self.setCentralWidget(w)
        self.show()

    def bool_(self, txt):

        if txt == "True":
            return True
        elif txt == "False":
            return False

    def initUI_(self):

        self.config_file_lbl.setText(self.last_used_scan)

        self.loadSubOlisFile_lbl.setText(self.loadSubOlis_str)

        self.loadSubFilmOlisFile_lbl.setText(self.loadSubFilmOlis_str)

        self.loadSubFTIRFile_lbl.setText(self.loadSubFTIR_str)

        self.loadSubFilmFTIRFile_lbl.setText(self.loadSubFilmFTIR_str)

        ##############################################

        self.sub_olis_check(self.loadSubOlis_check)
        self.cb_sub_olis.setChecked(self.loadSubOlis_check)

        self.subfilm_olis_check(self.loadSubFilmOlis_check)
        self.cb_subfilm_olis.setChecked(self.loadSubFilmOlis_check)

        self.sub_ftir_check(self.loadSubFTIR_check)
        self.cb_sub_ftir.setChecked(self.loadSubFTIR_check)

        self.subfilm_ftir_check(self.loadSubFilmFTIR_check)
        self.cb_subfilm_ftir.setChecked(self.loadSubFilmFTIR_check)

        self.save_figs_check(self.save_figs)
        self.cb_save_figs.setChecked(self.save_figs)
        self.filenameEdit.setText(self.filename_str)

        ##############################################

        if len(self.fit_poly_ranges) == 0:
            self.fit_poly_ranges_check = False
            self.polybord_check(self.fit_poly_ranges_check)
            self.cb_polybord.setChecked(self.fit_poly_ranges_check)
        else:
            self.polybord_check(self.fit_poly_ranges_check)
            self.cb_polybord.setChecked(self.fit_poly_ranges_check)

        ##############################################

        self.factorsEdit.setText(self.gaussian_factors)
        self.bordersEdit.setText(self.gaussian_borders)

        ##############################################

        self.combo1.setCurrentIndex(self.mylist1.index(self.fit_poly_order))
        self.combo2.setCurrentIndex(self.mylist2.index(self.plot_X))
        self.combo4.setCurrentIndex(self.mylist4.index(self.fit_linear_spline))

        ##############################################

        self.poly_bordersEdit.setText(self.fit_poly_ranges)
        self.ignore_data_ptsEdit.setText(self.ignore_data_pts)
        self.corr_slitEdit.setText(self.corr_slit)

        ##############################################

        self.NewFiles.setToolTip(''.join([
            "Display newly created and saved files in ", os.sep,
            self.filename_str, os.sep
        ]))
        self.lcd.display(self.timetrace)

    def button_style(self, button, color):

        button.setStyleSheet(''.join([
            'QPushButton {background-color: lightblue; font-size: 18pt; color: ',
            color, '}'
        ]))
        button.setFixedWidth(260)
        button.setFixedHeight(65)

    def loadSubOlisDialog(self):

        options = QFileDialog.Options()
        options |= QFileDialog.DontUseNativeDialog
        files, _ = QFileDialog.getOpenFileNames(
            self,
            "Open files",
            ''.join(['data', os.sep]),
            "All Files (*);;Dat Files (*.dat);;Text Files (*.txt)",
            options=options)
        for afile in files:
            head, tail = os.path.split(str(afile))
            self.loadSubOlis_str = tail
            self.loadSubOlisFile_lbl.setText(tail)
            self.cb_sub_olis.setEnabled(True)

            self.loadSubOlis_check = True
            self.cb_sub_olis(self.loadSubOlis_check)

    def loadSubFilmOlisDialog(self):

        options = QFileDialog.Options()
        options |= QFileDialog.DontUseNativeDialog
        files, _ = QFileDialog.getOpenFileNames(
            self,
            "Open files",
            ''.join(['data', os.sep]),
            "All Files (*);;Dat Files (*.dat);;Text Files (*.txt)",
            options=options)
        for afile in files:
            head, tail = os.path.split(str(afile))
            self.loadSubFilmOlis_str = tail
            self.loadSubFilmOlisFile_lbl.setText(tail)
            self.cb_subfilm_olis.setEnabled(True)

            self.loadSubFilmOlis_check = True
            self.cb_subfilm_olis(self.loadSubFilmOlis_check)

    def loadSubFTIRDialog(self):

        options = QFileDialog.Options()
        options |= QFileDialog.DontUseNativeDialog
        files, _ = QFileDialog.getOpenFileNames(
            self,
            "Open files",
            ''.join(['data', os.sep]),
            "All Files (*);;Dat Files (*.dat);;Text Files (*.txt)",
            options=options)
        for afile in files:
            head, tail = os.path.split(str(afile))
            self.loadSubFTIR_str = tail
            self.loadSubFTIRFile_lbl.setText(tail)
            self.cb_sub_ftir.setEnabled(True)

            self.loadSubFTIR_check = True
            self.cb_sub_ftir(self.loadSubFTIR_check)

    def loadSubFilmFTIRDialog(self):

        options = QFileDialog.Options()
        options |= QFileDialog.DontUseNativeDialog
        files, _ = QFileDialog.getOpenFileNames(
            self,
            "Open files",
            ''.join(['data', os.sep]),
            "All Files (*);;Dat Files (*.dat);;Text Files (*.txt)",
            options=options)
        for afile in files:
            head, tail = os.path.split(str(afile))
            self.loadSubFilmFTIR_str = tail
            self.loadSubFilmFTIRFile_lbl.setText(tail)
            self.cb_subfilm_ftir.setEnabled(True)

            self.loadSubFilmFTIR_check = True
            self.cb_subfilm_ftir.setChecked(self.loadSubFilmFTIR_check)

    def load_config_dialog(self):

        self.Load_config_dialog = Load_config_dialog.Load_config_dialog(
            self, self.config, self.load_, self.initUI_, self.cwd)
        self.Load_config_dialog.exec()

    def email_data_dialog(self):

        self.Send_email_dialog = Send_email_dialog.Send_email_dialog(
            self, self.cwd)
        self.Send_email_dialog.exec()

    def email_set_dialog(self):

        self.Email_dialog = Email_settings_dialog.Email_dialog(
            self, self.lcd, self.cwd)
        self.Email_dialog.exec()

    def helpParamDialog(self):

        helpfile = ''
        with open('config_Swanepoel_forklaringer.py', 'r') as f:
            for line in f:
                helpfile = helpfile + line

        msg = QMessageBox()
        msg.setIcon(QMessageBox.Information)
        msg.setText(
            "Apply the Swanepoel method using the following analysis steps:")
        msg.setInformativeText(helpfile)
        msg.setWindowTitle("Help")
        #msg.setDetailedText(helpfile)
        msg.setStandardButtons(QMessageBox.Ok)
        #msg.setGeometry(1000, 0, 1000+250, 350)

        msg.exec_()

    def contactDialog(self):

        QMessageBox.information(
            self, "Contact information",
            "Suggestions, comments or bugs can be reported to [email protected]"
        )

    def onActivated1(self, text):

        self.fit_poly_order = int(text)

    def onActivated2(self, text):

        self.plot_X = str(text)

    def onActivated4(self, text):

        self.fit_linear_spline = str(text)

    def save_figs_check(self, state):

        if state in [Qt.Checked, True]:
            self.save_figs = True
        else:
            self.save_figs = False

    def sub_olis_check(self, state):

        if state in [Qt.Checked, True]:
            self.loadSubOlis_check = True
            self.loadSubOlisFile_lbl.setStyleSheet("color: magenta")
            self.cb_sub_olis.setText('incl')
        else:
            self.loadSubOlis_check = False
            self.loadSubOlisFile_lbl.setStyleSheet("color: grey")
            self.cb_sub_olis.setText('exc')

    def subfilm_olis_check(self, state):

        if state in [Qt.Checked, True]:
            self.loadSubFilmOlis_check = True
            self.loadSubFilmOlisFile_lbl.setStyleSheet("color: magenta")
            self.cb_subfilm_olis.setText('incl')
        else:
            self.loadSubFilmOlis_check = False
            self.loadSubFilmOlisFile_lbl.setStyleSheet("color: grey")
            self.cb_subfilm_olis.setText('exc')

    def sub_ftir_check(self, state):

        if state in [Qt.Checked, True]:
            self.loadSubFTIR_check = True
            self.loadSubFTIRFile_lbl.setStyleSheet("color: magenta")
            self.cb_sub_ftir.setText('incl')
        else:
            self.loadSubFTIR_check = False
            self.loadSubFTIRFile_lbl.setStyleSheet("color: grey")
            self.cb_sub_ftir.setText('exc')

    def subfilm_ftir_check(self, state):

        if state in [Qt.Checked, True]:
            self.loadSubFilmFTIR_check = True
            self.loadSubFilmFTIRFile_lbl.setStyleSheet("color: magenta")
            self.cb_subfilm_ftir.setText('incl')
        else:
            self.loadSubFilmFTIR_check = False
            self.loadSubFilmFTIRFile_lbl.setStyleSheet("color: grey")
            self.cb_subfilm_ftir.setText('exc')

    def polybord_check(self, state):

        if state in [Qt.Checked, True]:
            self.fit_poly_ranges_check = True
            self.poly_bordersEdit.setEnabled(True)
            self.cb_polybord.setText('incl')
        else:
            self.fit_poly_ranges_check = False
            self.poly_bordersEdit.setEnabled(False)
            self.cb_polybord.setText('exc')

    ############################################################

    # Check input if a number, ie. digits or fractions such as 3.141
    # Source: http://www.pythoncentral.io/how-to-check-if-a-string-is-a-number-in-python-including-unicode/
    def is_int(self, s):
        try:
            int(s)
            return True
        except ValueError:
            return False

    def is_number(self, s):
        try:
            float(s)
            return True
        except ValueError:
            pass

        try:
            import unicodedata
            unicodedata.numeric(s)
            return True
        except (TypeError, ValueError):
            pass

        return False

    def create_file(self, mystr):

        head, ext = os.path.splitext(mystr)

        totalpath = ''.join([self.cwd, os.sep, head, '_', self.timetrace])

        my_dir = os.path.dirname(totalpath)
        if not os.path.isdir(my_dir):
            QMessageBox.warning(
                self, "Message",
                "".join(["Folder(s) named ", my_dir, " will be created!"]))

        try:
            os.makedirs(my_dir, exist_ok=True)
        except Exception as e:
            QMessageBox.critical(
                self, "Message",
                "".join(["Folder named ", head, " not valid!\n\n",
                         str(e)]))
            return ""

        return totalpath

    def set_run(self):

        # Save all the currently changed varaibles
        self.save_()
        # Register the sender of the command (a button or similar)
        sender = self.sender()

        ## gaussian_borders and gaussian_factors warnings and errors
        gaus_bord = str(self.bordersEdit.text()).split(',')
        for tal in gaus_bord:
            if not self.is_number(tal):
                QMessageBox.critical(self, 'Message',
                                     "Gaussian borders must be real numbers!")
                return
            elif float(tal) < 0.0:
                QMessageBox.critical(
                    self, 'Message',
                    "Gaussian borders must be positive or zero!")
                return

        if len(gaus_bord) < 2:
            QMessageBox.critical(
                self, 'Message', "You must enter at least 2 gaussian borders!")
            return

        if not numpy.array_equal([numpy.float(i) for i in gaus_bord],
                                 numpy.sort(
                                     [numpy.float(i) for i in gaus_bord])):
            QMessageBox.critical(
                self, 'Message',
                "The gaussian borders must be entered in the ascending order!")
            return

        gaus_fact = str(self.factorsEdit.text()).split(',')
        for tal in gaus_fact:
            if not self.is_number(tal):
                QMessageBox.critical(self, 'Message',
                                     "Gaussian factors must be real numbers!")
                return
            elif float(tal) < 0.0:
                QMessageBox.critical(
                    self, 'Message',
                    "Gaussian factors must be positive or zero!")
                return

        if len(gaus_fact) < 1:
            QMessageBox.critical(self, 'Message',
                                 "You must enter at least 1 gaussian factor!")
            return

        if len(gaus_bord) != len(gaus_fact) + 1:
            QMessageBox.critical(
                self, 'Message',
                "The number of gaussian factors is exactly one less than the number of gaussian borders!"
            )
            return

        ## ignored data points warnings and errors
        ign_pts = str(self.ignore_data_ptsEdit.text())
        if not self.is_int(ign_pts):
            QMessageBox.critical(
                self, 'Message', "The number of ignored points is an integer!")
            return
        elif int(ign_pts) < 0:
            QMessageBox.critical(
                self, 'Message',
                "The number of ignored points is a positive integer!")
            return

        ## correction slit width warnings and errors
        corr_pts = str(self.corr_slitEdit.text())
        if not self.is_number(corr_pts):
            QMessageBox.critical(
                self, 'Message', "The correction slit width is a real number!")
            return
        elif float(corr_pts) < 0:
            QMessageBox.critical(
                self, 'Message',
                "The correction slit width is a positive number!")
            return

        ## fit_poly_ranges warnings and errors
        if self.fit_poly_ranges_check == True:
            polyfit_bord = str(self.poly_bordersEdit.text()).split(',')
            for tal in polyfit_bord:
                if not self.is_number(tal):
                    QMessageBox.critical(
                        self, 'Message',
                        "The polyfit range enteries must be real numbers!")
                    return
                elif float(tal) < 0.0:
                    QMessageBox.critical(
                        self, 'Message',
                        "The polyfit range enteries must be positive or zero!")
                    return

            if len(polyfit_bord) < 2 or len(polyfit_bord) % 2 != 0:
                QMessageBox.critical(
                    self, 'Message',
                    "The polyfit range list accepts minimum 2 or even number of enteries!"
                )
                return

            if not numpy.array_equal(
                [numpy.float(i) for i in polyfit_bord],
                    numpy.sort([numpy.float(i) for i in polyfit_bord])):
                QMessageBox.critical(
                    self, 'Message',
                    "The polyfit range list must be entered in ascending order!"
                )
                return

        # When all user defined enteries are approved save the data
        self.create_file(str(self.filenameEdit.text()))

        if sender.text() != 'Raw data':

            ## raw data files warnings and errors
            if not self.loadSubOlis_check and not self.loadSubFilmOlis_check:
                pass
            elif self.loadSubOlis_check and self.loadSubFilmOlis_check:
                pass
            else:
                QMessageBox.critical(
                    self, 'Message',
                    "Select both OLIS data files subfilmRAW and subRAW!")
                return

            if not self.loadSubFTIR_check and not self.loadSubFilmFTIR_check:
                pass
            elif self.loadSubFTIR_check and self.loadSubFilmFTIR_check:
                pass
            else:
                QMessageBox.critical(
                    self, 'Message',
                    "Select both FTIR data files subfilmRAW and subRAW!")
                return

            if not self.loadSubOlis_check and not self.loadSubFilmOlis_check and not self.loadSubFTIR_check and not self.loadSubFilmFTIR_check:
                QMessageBox.critical(self, 'Message',
                                     "No data files selected!")
                return

        if sender.text() == 'Raw data':

            if not self.loadSubOlis_check and not self.loadSubFilmOlis_check and not self.loadSubFTIR_check and not self.loadSubFilmFTIR_check:
                QMessageBox.critical(self, 'Message',
                                     "No raw data files selected!")
                return

            self.button_style(self.Step0_Button, 'red')
            self.button_style(self.Step1_Button, 'grey')
            self.button_style(self.Step2_Button, 'grey')
            self.button_style(self.Step3_Button, 'grey')
            self.button_style(self.Step4_Button, 'grey')
            self.button_style(self.Step5_Button, 'grey')

        elif sender.text() == 'Tmin and Tmax':

            self.button_style(self.Step1_Button, 'red')
            self.button_style(self.Step0_Button, 'grey')
            self.button_style(self.Step2_Button, 'grey')
            self.button_style(self.Step3_Button, 'grey')
            self.button_style(self.Step4_Button, 'grey')
            self.button_style(self.Step5_Button, 'grey')

        elif sender.text() == 'Std.Dev. in d':

            self.button_style(self.Step2_Button, 'red')
            self.button_style(self.Step0_Button, 'grey')
            self.button_style(self.Step1_Button, 'grey')
            self.button_style(self.Step3_Button, 'grey')
            self.button_style(self.Step4_Button, 'grey')
            self.button_style(self.Step5_Button, 'grey')

        elif sender.text() == 'Index n':

            self.button_style(self.Step3_Button, 'red')
            self.button_style(self.Step0_Button, 'grey')
            self.button_style(self.Step1_Button, 'grey')
            self.button_style(self.Step2_Button, 'grey')
            self.button_style(self.Step4_Button, 'grey')
            self.button_style(self.Step5_Button, 'grey')

        elif sender.text() == 'Absorption alpha':

            self.button_style(self.Step4_Button, 'red')
            self.button_style(self.Step0_Button, 'grey')
            self.button_style(self.Step1_Button, 'grey')
            self.button_style(self.Step2_Button, 'grey')
            self.button_style(self.Step3_Button, 'grey')
            self.button_style(self.Step5_Button, 'grey')

        elif sender.text() == 'Wavenumber k':

            self.button_style(self.Step5_Button, 'red')
            self.button_style(self.Step0_Button, 'grey')
            self.button_style(self.Step1_Button, 'grey')
            self.button_style(self.Step2_Button, 'grey')
            self.button_style(self.Step3_Button, 'grey')
            self.button_style(self.Step4_Button, 'grey')

        else:
            return

        worker = Worker(sender.text(), self.cwd)

        worker.signals.pass_plots.connect(self.pass_plots)
        worker.signals.critical.connect(self.critical)
        worker.signals.finished.connect(self.finished)

        # Execute
        self.threadpool.start(worker)
        self.isRunning = True

    def pass_plots(self, obj):

        self.my_plots, sender = obj

        my_str = 'Data files:\n'
        try:
            self.datafiles = self.my_plots.make_plots()
            for i, ii in zip(self.datafiles, range(len(self.datafiles))):
                head, tail = os.path.split(i)
                my_str += ''.join([str(ii + 1), ': ', tail, '\n'])

            self.NewFiles.setText(my_str)
            self.my_plots.show_plots()

        except Exception as inst:
            QMessageBox.critical(self, 'Message', str(inst))

    def load_(self):

        # Initial read of the config file
        self.config = configparser.ConfigParser()

        try:
            self.config.read(''.join([self.cwd, os.sep, "config.ini"]))
            self.last_used_scan = self.config.get('LastScan', 'last_used_scan')

            self.loadSubOlis_str = self.config.get(
                self.last_used_scan, "loadsubolis").strip().split(':')[0]
            self.loadSubOlis_check = self.bool_(
                self.config.get(self.last_used_scan,
                                'loadsubolis').strip().split(':')[1])
            self.loadSubFilmOlis_str = self.config.get(
                self.last_used_scan, 'loadsubfilmolis').strip().split(':')[0]
            self.loadSubFilmOlis_check = self.bool_(
                self.config.get(self.last_used_scan,
                                'loadsubfilmolis').strip().split(':')[1])
            self.loadSubFTIR_str = self.config.get(
                self.last_used_scan, 'loadsubftir').strip().split(':')[0]
            self.loadSubFTIR_check = self.bool_(
                self.config.get(self.last_used_scan,
                                'loadsubftir').strip().split(':')[1])
            self.loadSubFilmFTIR_str = self.config.get(
                self.last_used_scan, 'loadsubfilmftir').strip().split(':')[0]
            self.loadSubFilmFTIR_check = self.bool_(
                self.config.get(self.last_used_scan,
                                'loadsubfilmftir').strip().split(':')[1])
            self.fit_linear_spline = self.config.get(self.last_used_scan,
                                                     'fit_linear_spline')
            self.gaussian_factors = self.config.get(self.last_used_scan,
                                                    'gaussian_factors')
            self.gaussian_borders = self.config.get(self.last_used_scan,
                                                    'gaussian_borders')
            self.ignore_data_pts = self.config.get(self.last_used_scan,
                                                   'ignore_data_pts')
            self.corr_slit = self.config.get(self.last_used_scan, 'corr_slit')
            self.fit_poly_order = self.config.get(self.last_used_scan,
                                                  'fit_poly_order')
            self.fit_poly_ranges = self.config.get(
                self.last_used_scan, 'fit_poly_ranges').strip().split(':')[0]
            self.fit_poly_ranges_check = self.bool_(
                self.config.get(self.last_used_scan,
                                'fit_poly_ranges').strip().split(':')[1])
            self.filename_str = self.config.get(self.last_used_scan,
                                                'filename')
            self.timetrace = self.config.get(self.last_used_scan, 'timetrace')
            self.save_figs = self.bool_(
                self.config.get(self.last_used_scan, 'save_figs'))
            self.plot_X = self.config.get(self.last_used_scan, 'plot_x')
            self.emailset_str = self.config.get(self.last_used_scan,
                                                'emailset').strip().split(',')
            self.emailrec_str = self.config.get(self.last_used_scan,
                                                'emailrec').strip().split(',')

        except configparser.NoOptionError as nov:
            QMessageBox.critical(
                self, 'Message', ''.join([
                    "Main FAULT while reading the config.ini file\n",
                    str(nov)
                ]))
            raise

    def save_(self):

        self.timetrace = time.strftime("%y%m%d-%H%M")
        self.lcd.display(self.timetrace)

        self.config.read(''.join([self.cwd, os.sep, "config.ini"]))
        self.config.set('LastScan', "last_used_scan", self.last_used_scan)
        self.config.set(
            self.last_used_scan, "loadSubOlis",
            ':'.join([self.loadSubOlis_str,
                      str(self.loadSubOlis_check)]))
        self.config.set(
            self.last_used_scan, "loadSubFilmOlis", ':'.join(
                [self.loadSubFilmOlis_str,
                 str(self.loadSubFilmOlis_check)]))
        self.config.set(
            self.last_used_scan, "loadSubFTIR",
            ':'.join([self.loadSubFTIR_str,
                      str(self.loadSubFTIR_check)]))
        self.config.set(
            self.last_used_scan, "loadSubFilmFTIR", ':'.join(
                [self.loadSubFilmFTIR_str,
                 str(self.loadSubFilmFTIR_check)]))
        self.config.set(self.last_used_scan, "fit_linear_spline",
                        self.fit_linear_spline)
        self.config.set(self.last_used_scan, "gaussian_factors",
                        str(self.factorsEdit.text()))
        self.config.set(self.last_used_scan, "gaussian_borders",
                        str(self.bordersEdit.text()))
        self.config.set(self.last_used_scan, "ignore_data_pts",
                        str(self.ignore_data_ptsEdit.text()))
        self.config.set(self.last_used_scan, "corr_slit",
                        str(self.corr_slitEdit.text()))
        self.config.set(self.last_used_scan, "fit_poly_order",
                        str(self.fit_poly_order))
        self.config.set(
            self.last_used_scan, "fit_poly_ranges", ':'.join([
                str(self.poly_bordersEdit.text()),
                str(self.fit_poly_ranges_check)
            ]))
        self.config.set(self.last_used_scan, "filename",
                        str(self.filenameEdit.text()))
        self.config.set(self.last_used_scan, "timetrace", self.timetrace)
        self.config.set(self.last_used_scan, "save_figs", str(self.save_figs))
        self.config.set(self.last_used_scan, "plot_x", self.plot_X)

        with open(''.join([self.cwd, os.sep, "config.ini"]),
                  "w") as configfile:
            self.config.write(configfile)

    def finished(self):

        self.my_plots.close_plots()

        self.load_()

        if self.emailset_str[1] == "yes":
            self.send_notif()
        if self.emailset_str[2] == "yes":
            self.send_data()

        self.button_style(self.Step0_Button, 'black')
        self.button_style(self.Step1_Button, 'black')
        self.button_style(self.Step2_Button, 'black')
        self.button_style(self.Step3_Button, 'black')
        self.button_style(self.Step4_Button, 'black')
        self.button_style(self.Step5_Button, 'black')

        self.isRunning = False

    def allButtons_torf(self, trueorfalse, *argv):

        if argv[0] == 'allfalse':
            self.cb_sub_olis.setEnabled(False)
            self.cb_subfilm_olis.setEnabled(False)
            self.cb_sub_ftir.setEnabled(False)
            self.cb_subfilm_ftir.setEnabled(False)

            self.poly_bordersEdit.setEnabled(False)

        self.fileSave.setEnabled(trueorfalse)
        self.loadMenu.setEnabled(trueorfalse)
        self.emailMenu.setEnabled(trueorfalse)

        self.cb_save_figs.setEnabled(trueorfalse)
        self.cb_polybord.setEnabled(trueorfalse)

        self.Step0_Button.setEnabled(trueorfalse)
        self.Step1_Button.setEnabled(trueorfalse)
        self.Step2_Button.setEnabled(trueorfalse)
        self.Step3_Button.setEnabled(trueorfalse)
        self.Step4_Button.setEnabled(trueorfalse)
        self.Step5_Button.setEnabled(trueorfalse)

        self.combo1.setEnabled(trueorfalse)
        self.combo2.setEnabled(trueorfalse)
        self.combo4.setEnabled(trueorfalse)

        self.factorsEdit.setEnabled(trueorfalse)
        self.bordersEdit.setEnabled(trueorfalse)
        self.ignore_data_ptsEdit.setEnabled(trueorfalse)
        self.corr_slitEdit.setEnabled(trueorfalse)

        self.filenameEdit.setEnabled(trueorfalse)

    def warning(self, mystr):

        QMessageBox.warning(self, "Message", mystr)

    def send_notif(self):

        contents = [
            "The scan is done. Please visit the experiment site and make sure that all light sources are switched off."
        ]
        subject = "The scan is done"

        obj = type(
            "obj", (object, ), {
                "subject": subject,
                "contents": contents,
                "settings": self.emailset_str,
                "receivers": self.emailrec_str
            })

        worker = Send_Email_Worker(obj)
        worker.signals.critical.connect(self.critical)
        worker.signals.warning.connect(self.warning)
        worker.signals.finished.connect(self.finished1)

        # Execute
        self.md = Indicator_dialog.Indicator_dialog(
            self, "...sending notification...",
            "indicators/ajax-loader-ball.gif")
        self.threadpool.start(worker)
        self.isRunning = True

    def send_data(self):

        contents = [
            "The scan is  done and the logged data is attached to this email. Please visit the experiment site and make sure that all light sources are switched off."
        ]
        contents.extend(self.datafiles)
        subject = "The scan data from the latest scan!"

        obj = type(
            "obj", (object, ), {
                "subject": subject,
                "contents": contents,
                "settings": self.emailset_str,
                "receivers": self.emailrec_str
            })

        worker = Send_Email_Worker(obj)
        worker.signals.critical.connect(self.critical)
        worker.signals.warning.connect(self.warning)
        worker.signals.finished.connect(self.finished1)

        # Execute
        self.md = Indicator_dialog.Indicator_dialog(
            self, "...sending files...", "indicators/ajax-loader-ball.gif")
        self.threadpool.start(worker)
        self.isRunning = True

    def finished1(self):

        self.isRunning = False
        self.md.close_()

    def critical(self, mystr):

        QMessageBox.critical(self, 'Message', mystr)

    def closeEvent(self, event):

        reply = QMessageBox.question(self, 'Message', "Quit now?",
                                     QMessageBox.Yes | QMessageBox.No)
        if reply == QMessageBox.Yes:
            if self.isRunning:
                QMessageBox.warning(
                    self, 'Message',
                    "Analysis in progress. Wait the analysis to finish and then quit!"
                )
                event.ignore()
            else:
                event.accept()
        elif reply == QMessageBox.No:
            event.ignore()
Exemplo n.º 28
0
class Main(QWidget):

    started = False
    speed = 1000
    backWidth = 10
    backHeight = 20
    blockOffset = 35
    blockSize = 30

    background = None
    currentShape = None
    nextShape = None
    factory = sf.ShapeFactory()

    score = 0

    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.resize(560, 700)
        self.center()
        self.setWindowTitle('Teris')

        nextLabel = QLabel('下一个方块:', self)
        nextLabel.setFont(QFont("Roman times", 16, QFont.Bold))
        nextLabel.move((self.backWidth + 3) * self.blockSize, 30)

        scoreLabel = QLabel('当前得分:', self)
        scoreLabel.setFont(QFont("Roman times", 16, QFont.Bold))
        scoreLabel.move((self.backWidth + 3) * self.blockSize, 230)

        self.scoreNumber = QLCDNumber(self)
        self.scoreNumber.move((self.backWidth + 3) * self.blockSize, 260)
        self.scoreNumber.setSegmentStyle(QLCDNumber.Flat)
        self.scoreNumber.setStyleSheet(
            "font-size: 30px; color: red; border: 1px solid black; height: 100px; width: 100px;"
        )

        self.timer = QBasicTimer()
        self.background = bg.Background(self.backWidth, self.backHeight,
                                        self.blockSize, self.blockOffset)
        self.productShape()
        self.startHandler()
        self.show()

    def center(self):
        qr = self.frameGeometry()
        cp = QDesktopWidget().availableGeometry().center()
        qr.moveCenter(cp)
        self.move(qr.topLeft())

    def paintEvent(self, event):
        qp = QPainter()
        qp.begin(self)
        self.background.draw(qp)
        self.currentShape.draw(qp)
        self.nextShape.draw(qp)
        qp.end()

    def reDraw(self):
        self.update()

    def keyPressEvent(self, event):
        key = event.key()
        if key == Qt.Key_Left:
            self.leftHandler()
        elif key == Qt.Key_Right:
            self.rightHandler()
        elif key == Qt.Key_Down:
            self.downHandler()
        elif key == Qt.Key_Up:
            self.upHandler()
        elif key == Qt.Key_P:
            self.startHandler()
        elif key == Qt.Key_Space:
            self.downoverHandler()

    def timerEvent(self, event):
        if event.timerId() == self.timer.timerId():
            self.downHandler()
        else:
            super(QWidget, self).timerEvent(event)

    def upHandler(self):
        if self.background.isRotate(self.currentShape):
            self.currentShape.changeType()
            self.reDraw()

    def leftHandler(self):
        if self.background.isLeft(self.currentShape):
            self.currentShape.changeX(-1)
            self.reDraw()

    def rightHandler(self):
        if self.background.isRight(self.currentShape):
            self.currentShape.changeX(1)
            self.reDraw()

    def downHandler(self):
        if self.background.isDown(self.currentShape):
            self.currentShape.changeY(1)
            self.reDraw()
        else:
            self.scoreShape()
            self.productShape()

    def downoverHandler(self):
        while self.background.isDown(self.currentShape):
            self.currentShape.changeY(1)
        self.scoreShape()
        self.productShape()

    # 计算得分
    def scoreShape(self):
        self.background.copyShapeDate(self.currentShape)
        self.score += self.background.scoreShape()
        self.reDraw()
        self.scoreNumber.display(self.score)
        print('score = %d' % self.score)

    def productShape(self):
        if self.nextShape:
            self.currentShape = self.factory.next(self.nextShape.color,
                                                  self.nextShape.data,
                                                  self.blockSize,
                                                  self.blockOffset)
        else:
            self.currentShape = self.factory.product(self.blockSize,
                                                     self.blockOffset)
        self.nextShape = self.factory.product(self.blockSize, 0)
        self.nextShape.offsetX = (self.backWidth + 3) * self.blockSize
        self.nextShape.offsetY = 2 * self.blockSize
        self.nextShape.border = 0x000000

    def startHandler(self):
        print('pauseHandler %s' % self.started)
        if self.started:
            self.timer.stop()
            self.started = False
        else:
            self.timer.start(self.speed, self)
            self.started = True
        self.update()
Exemplo n.º 29
0
class Phase10PlayerWidget(GamePlayerWidget):

    roundWinnerSet = QtCore.pyqtSignal(str)

    def __init__(self, nick, engine, bgroup=None, parent=None):
        self.engine = engine
        self.current_phase = min(
            self.engine.getRemainingPhasesFromPlayer(nick))
        self.phases_in_order = self.engine.getPhasesInOrderFlag()
        self.bgroup = bgroup
        super(Phase10PlayerWidget, self).__init__(
            nick, PlayerColours[self.engine.getListPlayers().index(nick)],
            parent)

    def initUI(self):
        css = ("QGroupBox {{ font-size: 28px;"
               "font-weight: bold; color:rgb({},{},{});}}")
        self.setStyleSheet(css.format(self.pcolour.red(),
                                      self.pcolour.green(),
                                      self.pcolour.blue()))
        self.setTitle(self.player)
        super(Phase10PlayerWidget, self).initUI()

        trashWidget = QWidget()
        trashWidget.setLayout(self.mainLayout)

        self.mainLayout = QVBoxLayout(self)
        self.mainLayout.addStretch()
        self.upperLayout = QHBoxLayout()
        self.mainLayout.addLayout(self.upperLayout)
        self.upperLayout.addStretch()
        self.phaseNameLabel = QLabel(self)
        self.phaseNameLabel.setStyleSheet(
            "font-weight: bold; font-size: 24px;")
        self.updatePhaseName()
        self.upperLayout.addWidget(self.phaseNameLabel)
        self.upperLayout.addStretch()
        self.lowerLayout = QHBoxLayout()
        self.mainLayout.addLayout(self.lowerLayout)
        self.mainLayout.addStretch()

        self.phaseLabelsLayout = QGridLayout()
        self.phaseLabelsLayout.setSpacing(5)

        self.checkboxLayout = QVBoxLayout()

        self.scoreLCD = QLCDNumber(self)
        self.scoreLCD.setSegmentStyle(QLCDNumber.Flat)
        self.mainLayout.addWidget(self.scoreLCD)
        self.scoreLCD.setNumDigits(3)
        self.scoreLCD.setMinimumWidth(100)
        css = "QLCDNumber {{ color:rgb({},{},{});}}"
        self.scoreLCD.setStyleSheet(css.format(self.pcolour.red(),
                                               self.pcolour.green(),
                                               self.pcolour.blue()))

        # Left part - score
        self.lowerLayout.addWidget(self.iconlabel)
        self.lowerLayout.addWidget(self.scoreLCD)
        self.lowerLayout.addLayout(self.phaseLabelsLayout)
        self.lowerLayout.addLayout(self.checkboxLayout)

        self.iconlabel.setMinimumSize(60, 60)

#         self.scoreLCD.setMinimumWidth(100)
#         self.scoreLCD.setMaximumWidth(200)
#         self.scoreLCD.setMinimumHeight(60)
#         self.scoreLCD.setMaximumHeight(80)

        self.scoreLCD.display(self.engine.getScoreFromPlayer(self.player))

        # Middle part - Phase list
        self.phaseLabels = list()
        for phase in range(1, 11):
            label = Phase10Label(phase, self)
            if phase == self.current_phase:
                label.setCurrent()
            elif self.engine.hasPhaseCompleted(self.player, phase):
                label.setPassed()
            self.phaseLabels.append(label)
            self.phaseLabelsLayout.addWidget(
                label, (phase-1)/5, (phase-1) % 5, 1, 1)

        # Middle part - Inputs
        self.roundWinnerRadioButton = QRadioButton()
        self.bgroup.addButton(self.roundWinnerRadioButton)
        self.checkboxLayout.addWidget(self.roundWinnerRadioButton)

        self.roundPhaseClearedCheckbox = QCheckBox(self)
        self.checkboxLayout.addWidget(self.roundPhaseClearedCheckbox)

        self.roundScore = Phase10ScoreSpinBox(self)
        self.roundScore.setMaximumWidth(90)
        self.roundScore.valueChanged.connect(self.updateRoundPhaseCleared)
        self.lowerLayout.addWidget(self.roundScore)

        self.roundWinnerRadioButton.toggled.connect(
            self.roundScore.setDisabled)
        self.roundWinnerRadioButton.toggled.connect(
            self.roundPhaseClearedCheckbox.setDisabled)
        self.roundWinnerRadioButton.toggled.connect(
            self.roundPhaseClearedCheckbox.setChecked)
        self.roundWinnerRadioButton.toggled.connect(self.roundWinnerSetAction)

        self.retranslateUI()

    def retranslateUI(self):
        self.roundWinnerRadioButton.setText(
            i18n("Phase10PlayerWidget", "Winner"))
        self.roundPhaseClearedCheckbox.setText(
            i18n("Phase10PlayerWidget", "Completed"))
        self.updatePhaseName()

    def updateDisplay(self, points, completed_phases, remaining_phases):
        if len(remaining_phases) == 0:
            self.current_phase = 0
        else:
            self.current_phase = min(remaining_phases)

        self.roundWinnerRadioButton.setDown(True)
        if points >= 1000:
            self.scoreLCD.setNumDigits(4)
        self.scoreLCD.display(points)
        self.roundScore.setValue(5)
        self.roundScore.clear()
        self.roundPhaseClearedCheckbox.setChecked(False)

        for phase, label in enumerate(self.phaseLabels, start=1):
            if phase == self.current_phase and not self.engine.getWinner():
                if not label.isCurrent():
                    label.setCurrent()
            elif phase in completed_phases:
                if not label.isPassed():
                    label.setPassed()
            else:
                if not label.isRemaining():
                    label.setRemaining()
        self.updatePhaseName()

    def getScore(self):
        if self.isRoundWinner():
            return 0
        try:
            return int(self.roundScore.value())
        except Exception:
            return -1

    def switchPhasesInOrder(self, in_order):
        self.phases_in_order = in_order
        if not self.phases_in_order:
            return
        self.phaseLabels[self.current_phase-1].setRemaining()
        for label in self.phaseLabels:
            if label.isRemaining():
                label.setCurrent()
                self.current_phase = label.getNumber()
                break

    def updatePhaseSelected(self, phaselabel):
        if phaselabel.isRemaining():
            self.current_phase = phaselabel.getNumber()
            for label in self.phaseLabels:
                if label.isCurrent():
                    label.setRemaining()
            phaselabel.setCurrent()
        self.updatePhaseName()

    def updatePhaseName(self):
        phasenames = getPhaseNames(self.engine.getPhases())
        self.phaseNameLabel.setText(phasenames[self.current_phase-1])

    def updateRoundPhaseCleared(self, value):
        try:
            score = int(self.roundScore.text())
        except Exception:
            self.roundPhaseClearedCheckbox.setChecked(False)
            return

        if score < 0:
            if not self.roundWinnerRadioButton.isChecked():
                self.roundPhaseClearedCheckbox.setChecked(False)
            return

        if (score % 5 != 0):
            return

        if (score >= 50):
            self.roundWinnerRadioButton.setChecked(False)
            self.roundPhaseClearedCheckbox.setChecked(False)
        elif (score == 0):
            self.roundWinnerRadioButton.setChecked(True)
            self.roundPhaseClearedCheckbox.setChecked(True)
        else:
            self.roundWinnerRadioButton.setChecked(False)
            self.roundPhaseClearedCheckbox.setChecked(True)

    def mousePressEvent(self, event):
        child = self.childAt(event.pos())
        if child is None:
            self.roundScore.setFocus()
        elif type(child) == Phase10Label and not self.phases_in_order:
            self.updatePhaseSelected(child)
        return QGroupBox.mousePressEvent(self, event)
#

    def isRoundWinner(self): return self.roundWinnerRadioButton.isChecked()

    def getRoundPhase(self): return self.current_phase

    def isRoundCleared(self): return self.roundPhaseClearedCheckbox.isChecked()

    def roundWinnerSetAction(self, isset):
        if isset:
            self.roundWinnerSet.emit(self.player)

    def reset(self): pass

    def finish(self):
        self.roundWinnerRadioButton.toggled.disconnect(
            self.roundScore.setDisabled)
        self.roundWinnerRadioButton.toggled.disconnect(
            self.roundPhaseClearedCheckbox.setDisabled)
        self.roundWinnerRadioButton.toggled.disconnect(
            self.roundPhaseClearedCheckbox.setChecked)
        self.roundWinnerRadioButton.toggled.disconnect(
            self.roundWinnerSetAction)
        self.roundWinnerRadioButton.setDisabled(True)
        self.roundPhaseClearedCheckbox.setDisabled(True)
        self.roundScore.setDisabled(True)

    def setColour(self, colour):
        self.pcolour = colour
        css = ("QGroupBox {{ font-size: 28px; font-weight: bold;"
               "color:rgb({},{},{});}}")
        self.setStyleSheet(css.format(self.pcolour.red(),
                                      self.pcolour.green(),
                                      self.pcolour.blue()))
Exemplo n.º 30
0
class GamePlayerWidget(QGroupBox):

    def __init__(self, nick, colour=None, parent=None):
        super(GamePlayerWidget, self).__init__(parent)
        self.player = nick
        self.pcolour = colour
        self.initUI()

    def initUI(self):
        #        self.setMinimumWidth(300)
        self.mainLayout = QHBoxLayout(self)
#         self.mainLayout.addStretch()
        self.scoreLCD = QLCDNumber(self)
        self.scoreLCD.setSegmentStyle(QLCDNumber.Flat)
        self.mainLayout.addWidget(self.scoreLCD)
        self.scoreLCD.setNumDigits(3)
        self.scoreLCD.setFixedSize(100, 60)
        self.scoreLCD.display(0)
        css = "QLCDNumber {{ color:rgb({},{},{});}}"
        self.scoreLCD.setStyleSheet(css.format(self.pcolour.red(),
                                               self.pcolour.green(),
                                               self.pcolour.blue()))

        self.nameLabel = QLabel(self)
        self.nameLabel.setText(self.player)
        sh = ("QLabel {{ font-size: 32px; font-weight: "
              "bold; color:rgb({},{},{});}}")
        self.nameLabel.setStyleSheet(sh.format(self.pcolour.red(),
                                               self.pcolour.green(),
                                               self.pcolour.blue()))
        self.mainLayout.addWidget(self.nameLabel)

        self.dealerPixmap = QtGui.QPixmap('icons/cards.png')
        self.nonDealerPixmap = QtGui.QPixmap()
        self.winnerPixmap = QtGui.QPixmap('icons/winner.png')

        self.iconlabel = IconLabel(self)
        self.iconlabel.setFixedSize(50, 50)
        self.iconlabel.setScaledContents(True)
        self.mainLayout.insertWidget(0, self.iconlabel)
#         self.mainLayout.addStretch()
        self.unsetDealer()

    def updateDisplay(self, points):
        if points >= 1000:
            self.scoreLCD.setNumDigits(4)
        self.scoreLCD.display(points)

    def setDealer(self): self.iconlabel.setPixmap(self.dealerPixmap)

    def unsetDealer(self): self.iconlabel.setPixmap(self.nonDealerPixmap)

    def setWinner(self): self.iconlabel.setPixmap(self.winnerPixmap)

    def setColour(self, colour):
        self.pcolour = colour
        css = "QLCDNumber {{ color:rgb({},{},{});}}"
        self.scoreLCD.setStyleSheet(css.format(self.pcolour.red(),
                                               self.pcolour.green(),
                                               self.pcolour.blue()))
        sh = ("QLabel {{ font-size: 32px; font-weight: bold; "
              "color:rgb({},{},{});}}")
        self.nameLabel.setStyleSheet(sh.format(self.pcolour.red(),
                                               self.pcolour.green(),
                                               self.pcolour.blue()))
Exemplo n.º 31
0
class ControlWindow(QWidget):
    
    #Initialize the class (actually creating a initUI method and calling that, or just put all that code in here)
    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):
        #Primary screen - Control Window Screen (laptop) - Screen0 will always be primary screen (only screen on RPi)
        self.sizeScreen0 = QDesktopWidget().screenGeometry(0)   #use this function to get the screen geometry
        print('  Screen 0 size : ' + str(self.sizeScreen0.height()) + 'x' + str(self.sizeScreen0.width()))
        #Print out the screen size for debugging issues, will display in terminal

        self.setGeometry(0, 0, self.sizeScreen0.width(), self.sizeScreen0.height())  #set window screen dimensions
        self.setWindowTitle('Control Panel')  #name window screen (displayed at top of window)

        #Create a button - same format for any button you want to make
        self.Zero_button = QPushButton(self) #declare the button instance from the QPushbutton class
        # set the button position and size .setgeometry(Qrect(X position, Y position, button width, button height)) position is from upper left of button
        # The button position and dimensions are relative to the screen size. You can type in absolute numbers instead if you want and are sure of screensize
        self.Zero_button.setGeometry(QRect(self.sizeScreen0.width() * 0.015, self.sizeScreen0.height() * 0.02, self.sizeScreen0.width() * 0.165, self.sizeScreen0.height() * 0.12))
        self.Zero_button.setObjectName("Zero_button")  #name the button
        self.Zero_button.setStyleSheet("font: bold 14px; background-color: rgb(5,176,36);")

        self.Weight_button = QPushButton(self)
        self.Weight_button.setGeometry(QRect(self.sizeScreen0.width() * 0.2, self.sizeScreen0.height() * 0.02, self.sizeScreen0.width() * 0.165, self.sizeScreen0.height() * 0.12))
        self.Weight_button.setObjectName("Weight_button")
        self.Weight_button.setStyleSheet("font: bold 14px; background-color: rgb(5,176,36);")
            
        self.Estop_button = QPushButton(self)
        self.Estop_button.setGeometry(QRect(self.sizeScreen0.width() * 0.74, self.sizeScreen0.height() * 0.02, self.sizeScreen0.width() * 0.2, self.sizeScreen0.height() * 0.12))
        self.Estop_button.setObjectName("Estop_button")
        self.Estop_button.setStyleSheet("font: bold 14px; background-color: red;")
        
        self.Start_button = QPushButton(self)
        self.Start_button.setGeometry(QRect(self.sizeScreen0.width() * 0.825, self.sizeScreen0.height() * 0.61, self.sizeScreen0.width() * 0.15, self.sizeScreen0.height() * 0.15))
        self.Start_button.setObjectName("Start_button")
        self.Start_button.setStyleSheet("font: bold 14px; background-color: rgb(5,176,36);")
        
        #Create another button (same process as before)
        self.Close_button = QPushButton(self)
        self.Close_button.setGeometry(QRect(self.sizeScreen0.width() * 0.95, self.sizeScreen0.height() * 0.01, self.sizeScreen0.width() * 0.04, self.sizeScreen0.height() * 0.06))
        self.Close_button.setObjectName("X_button")
        self.Close_button.setStyleSheet("font: bold 18px; background-color: rgb(5,176,36);")

        #Creates GUI user inputs
        self.InitialSampleWeight = QLineEdit(self)
        self.InitialSampleWeight.setGeometry(QRect(self.sizeScreen0.width() * 0.2, self.sizeScreen0.height() * 0.8, self.sizeScreen0.width() * 0.09, self.sizeScreen0.height() * 0.1))
        self.InitialSampleWeight.setStyleSheet("font: bold 20px;")
        self.InitialSampleWeight.setMaxLength(5)
     
        self.DryMatterWeight = QLineEdit(self)
        self.DryMatterWeight.setGeometry(QRect(self.sizeScreen0.width() * 0.5, self.sizeScreen0.height() * 0.8, self.sizeScreen0.width() * 0.09, self.sizeScreen0.height() * 0.1))
        self.DryMatterWeight.setStyleSheet("font: bold 20px;")
        self.DryMatterWeight.setMaxLength(5)
        
        self.TargetWeightPercent = QLineEdit(self)
        self.TargetWeightPercent.setGeometry(QRect(self.sizeScreen0.width() * 0.8, self.sizeScreen0.height() * 0.8, self.sizeScreen0.width() * 0.09, self.sizeScreen0.height() * 0.1))
        self.TargetWeightPercent.setStyleSheet("font: bold 20px;")
        self.TargetWeightPercent.setMaxLength(5)
        
        self.EStopTemp = QLineEdit(self)
        self.EStopTemp.setGeometry(QRect(self.sizeScreen0.width() * 0.86, self.sizeScreen0.height() * 0.3, self.sizeScreen0.width() * 0.09, self.sizeScreen0.height() * 0.1))
        self.EStopTemp.setStyleSheet("font: bold 20px;")
        self.EStopTemp.setMaxLength(5)
        
        self.EStopTemp_label = QLabel(self)
        self.EStopTemp_label.setGeometry(QRect(self.sizeScreen0.width() * 0.815, self.sizeScreen0.height() * 0.20, self.sizeScreen0.width() * 0.3, self.sizeScreen0.height() * 0.1))
        self.EStopTemp_label.setStyleSheet("font: bold 15px;")
        
        self.SampleWeight_label = QLabel(self)
        self.SampleWeight_label.setGeometry(QRect(self.sizeScreen0.width() * 0.05, self.sizeScreen0.height() * 0.8, self.sizeScreen0.width() * 0.15, self.sizeScreen0.height() * 0.1))
        self.SampleWeight_label.setStyleSheet("font: bold 15px;")
        
        self.DryMatter_label = QLabel(self)
        self.DryMatter_label.setGeometry(QRect(self.sizeScreen0.width() * 0.37, self.sizeScreen0.height() * 0.8, self.sizeScreen0.width() * 0.13, self.sizeScreen0.height() * 0.1))
        self.DryMatter_label.setStyleSheet("font: bold 15px;")
        
        self.TargetPercent_label = QLabel(self)
        self.TargetPercent_label.setGeometry(QRect(self.sizeScreen0.width() * 0.63, self.sizeScreen0.height() * 0.8, self.sizeScreen0.width() * 0.165, self.sizeScreen0.height() * 0.1))
        self.TargetPercent_label.setStyleSheet("font: bold 15px;")       

        self.Top_label = QLabel(self)
        self.Top_label.setGeometry(QRect(self.sizeScreen0.width() * 0.1, self.sizeScreen0.height() * 0.125, self.sizeScreen0.width() * 0.3, self.sizeScreen0.height() * 0.3))
        self.Top_label.setStyleSheet("font: bold 20px;")

        self.Middle_label = QLabel(self)
        self.Middle_label.setGeometry(QRect(self.sizeScreen0.width() * 0.1, self.sizeScreen0.height() * 0.325, self.sizeScreen0.width() * 0.3, self.sizeScreen0.height() * 0.3))
        self.Middle_label.setStyleSheet("font: bold 20px;")

        self.Bottom_label = QLabel(self)
        self.Bottom_label.setGeometry(QRect(self.sizeScreen0.width() * 0.1, self.sizeScreen0.height() * 0.525, self.sizeScreen0.width() * 0.3, self.sizeScreen0.height() * 0.3))
        self.Bottom_label.setStyleSheet("font: bold 20px;")

#        self.Progress_label = QLabel(self)
#        self.Progress_label.setGeometry(QRect(self.sizeScreen0.width() * 0.1, self.sizeScreen0.height() * 0.65, self.sizeScreen0.width() * 0.3, self.sizeScreen0.height() * 0.3))
#        self.Progress_label.setStyleSheet("font: bold 15px;")

        self.Weight_label = QLabel(self)
        self.Weight_label.setGeometry(QRect(self.sizeScreen0.width() * 0.34, self.sizeScreen0.height() * 0.05, self.sizeScreen0.width() * 0.3, self.sizeScreen0.height() * 0.3))
        self.Weight_label.setStyleSheet("font: bold 15px;")

        self.Moisture_label = QLabel(self)
        self.Moisture_label.setGeometry(QRect(self.sizeScreen0.width() * 0.59, self.sizeScreen0.height() * 0.125, self.sizeScreen0.width() * 0.23, self.sizeScreen0.height() * 0.15))
        self.Moisture_label.setStyleSheet("font: bold 15px;")

        self.TopTemp_label = QLabel(self)
        self.TopTemp_label.setGeometry(QRect(self.sizeScreen0.width() * 0.41, self.sizeScreen0.height() * 0.03, self.sizeScreen0.width() * 0.22, self.sizeScreen0.height() * 0.05))
        self.TopTemp_label.setStyleSheet("font: bold 15px;")

        self.BottomTemp_label = QLabel(self)
        self.BottomTemp_label.setGeometry(QRect(self.sizeScreen0.width() * 0.41, self.sizeScreen0.height() * 0.105, self.sizeScreen0.width() * 0.25, self.sizeScreen0.height() * 0.05))
        self.BottomTemp_label.setStyleSheet("font: bold 15px;")

        #Create an LCD display widget to show numbers
        self.LCDdisplay = QLCDNumber(self)  #Create the instance from the QLCDNumber class
        #Set the position and dimensions just like was done for the buttons
        self.LCDdisplay.setGeometry(QRect(self.sizeScreen0.width() * 0.935, self.sizeScreen0.height() * 0.8, self.sizeScreen0.width() * 0.06, self.sizeScreen0.height() * 0.12))
        self.LCDdisplay.setObjectName("Counter")  #Name it
        self.LCDdisplay.setStyleSheet("background-color:white;")

        self.TopTempdisplay = QLCDNumber(self)
        self.TopTempdisplay.setGeometry(QRect(self.sizeScreen0.width() * 0.62, self.sizeScreen0.height() * 0.025, self.sizeScreen0.width() * 0.1, self.sizeScreen0.height() * 0.06))
        self.TopTempdisplay.setObjectName("Top Temperature")
        self.TopTempdisplay.setStyleSheet("background-color:white;")

        self.BottomTempdisplay = QLCDNumber(self)
        self.BottomTempdisplay.setGeometry(QRect(self.sizeScreen0.width() * 0.62, self.sizeScreen0.height() * 0.1, self.sizeScreen0.width() * 0.1, self.sizeScreen0.height() * 0.06))
        self.BottomTempdisplay.setObjectName("Bottom Temperature")
        self.BottomTempdisplay.setStyleSheet("background-color:white;")

        self.TopWeightdisplay = QLCDNumber(self)
        self.TopWeightdisplay.setGeometry(QRect(self.sizeScreen0.width() * 0.3, self.sizeScreen0.height() * 0.22, self.sizeScreen0.width() * 0.2, self.sizeScreen0.height() * 0.12))
        self.TopWeightdisplay.setObjectName("Top Weight")
        self.TopWeightdisplay.setStyleSheet("background-color:white;")

        self.TopMoisturedisplay = QLCDNumber(self)
        self.TopMoisturedisplay.setGeometry(QRect(self.sizeScreen0.width() * 0.6, self.sizeScreen0.height() * 0.22, self.sizeScreen0.width() * 0.2, self.sizeScreen0.height() * 0.12))
        self.TopMoisturedisplay.setObjectName("Top Moisture")
        self.TopMoisturedisplay.setStyleSheet("background-color:white;")

        self.MiddleWeightdisplay = QLCDNumber(self)
        self.MiddleWeightdisplay.setGeometry(QRect(self.sizeScreen0.width() * 0.3, self.sizeScreen0.height() * 0.42, self.sizeScreen0.width() * 0.2, self.sizeScreen0.height() * 0.12))
        self.MiddleWeightdisplay.setObjectName("Middle Weight")
        self.MiddleWeightdisplay.setStyleSheet("background-color:white;")

        self.MiddleMoisturedisplay = QLCDNumber(self)
        self.MiddleMoisturedisplay.setGeometry(QRect(self.sizeScreen0.width() * 0.6, self.sizeScreen0.height() * 0.42, self.sizeScreen0.width() * 0.2, self.sizeScreen0.height() * 0.12))
        self.MiddleMoisturedisplay.setObjectName("Middle Moisture")
        self.MiddleMoisturedisplay.setStyleSheet("background-color:white;")

        self.BottomWeightdisplay = QLCDNumber(self)
        self.BottomWeightdisplay.setGeometry(QRect(self.sizeScreen0.width() * 0.3, self.sizeScreen0.height() * 0.62, self.sizeScreen0.width() * 0.2, self.sizeScreen0.height() * 0.12))
        self.BottomWeightdisplay.setObjectName("Bottom Weight")
        self.BottomWeightdisplay.setStyleSheet("background-color:white;")

        self.BottomMoisturedisplay = QLCDNumber(self)
        self.BottomMoisturedisplay.setGeometry(QRect(self.sizeScreen0.width() * 0.6, self.sizeScreen0.height() * 0.62, self.sizeScreen0.width() * 0.2, self.sizeScreen0.height() * 0.12))
        self.BottomMoisturedisplay.setObjectName("Bottom Moisture")
        self.BottomMoisturedisplay.setStyleSheet("background-color:white;")

#        self.Progress_bar = QProgressBar(self)
#        self.Progress_bar.setGeometry(QRect(self.sizeScreen0.width() * 0.1, self.sizeScreen0.height() * 0.83, self.sizeScreen0.width() * 0.7, self.sizeScreen0.height() * 0.04))
#        self.Progress_bar.setRange(0,100)
#        #loop = 60
#        #self.Progress_bar.setValue(loop)
#        self.Progress_bar.setStyleSheet("font: bold 15px; text-align: center; border: 1px solid grey;")

        #Not exactly sure what this does, but it is needed to put a name label on the buttons
        _translate = QCoreApplication.translate

        #Name the Close Button label
        self.Close_button.setText(_translate("ControlWindow", "X"))
        #Name the calibrate button label
        self.Zero_button.setText(_translate("ControlWindow", "Zero All Scales"))

        self.Weight_button.setText(_translate("ControlWindow", "Set Initial"+ "\n" +"Weights"))

        self.Estop_button.setText(_translate("ControlWindow", "Emergency" + "\n" + "Shutoff"))
        
        self.Start_button.setText(_translate("ControlWindow", "Start/Resume"))
        
        self.Top_label.setText(_translate("ControlWindow", "Top Shelf:"))

        self.Middle_label.setText(_translate("ControlWindow", "Middle Shelf:"))

        self.Bottom_label.setText(_translate("ControlWindow", "Bottom Shelf:"))

        #self.Progress_label.setText(_translate("ControlWindow", "Drying Progress:"))

        self.Weight_label.setText(_translate("ControlWindow", "Weight (lbs):"))

        self.Moisture_label.setText(_translate("ControlWindow", "Moisture Percent (%):"))

        self.TopTemp_label.setText(_translate("ControlWindow", "Temperature 1 (F):"))

        self.BottomTemp_label.setText(_translate("ControlWindow", "Temperature 2 (F):"))
        
        self.SampleWeight_label.setText(_translate("ControlWindow", "Initial Sample"+ "\n" +"  Weight (g):"))
        
        self.DryMatter_label.setText(_translate("ControlWindow", "Dry Matter"+ "\n" +"Weight (g):"))
        
        self.TargetPercent_label.setText(_translate("ControlWindow", "Target Moisture"+ "\n" +"   Percent (%):"))
        
        self.EStopTemp_label.setText(_translate("ControlWindow", "         E-Stop"+ "\n" +"Temperature (F):"))

        #This sets the Close button's action when you click on it, in this case it will run the method "CloseUp" which is below
        self.Close_button.clicked.connect(self.CloseUp)
        #self.Close_button.clicked.connect(GPIOcleanup)
        
        #This activates E-stop when E-stop is pressed
        self.Estop_button.clicked.connect(Eshutoff)

        #This activates method "startup" when Start/Resume button is pressed
        self.Start_button.clicked.connect(startup)
        
        #Saves input values when start button pressed
        self.Start_button.clicked.connect(self.getInitialSampleWeight)
        self.Start_button.clicked.connect(self.getDryMatterWeight)
        self.Start_button.clicked.connect(self.getTargetWeightPercent)
        self.Start_button.clicked.connect(self.getEStopTemp)

        #This activates zeroing of the scales when "Zero" butotn is clicked
        self.Zero_button.clicked.connect(self.ZeroAllScales)
        
        #Records initial values when clicked
        self.Weight_button.clicked.connect(self.SetInitialWeights)

        #Show the screen, not sure it is really needed though
        self.show


    #Like before, not exactly sure what it is doing, but needed to create and show the button naming labels
    def retranslateUi(self, TestDisplay):
        _translate = QCoreApplication.translate
        TestDisplay.setWindowTitle(_translate("MainGroWin", "MainWindow"))
        self.Disconnect_button.setText(_translate("MainGroWin", "Disconnect"))

    #The function that will close the window and program when you click on the "Close" button
    def CloseUp(self):  #create method inside the ControlWindow Class (belongs to the ControlWindow class)
        # print('Closed')  #Used for debugging in terminal
        # Maximize the window, you can use the windowstate function to minimize, maximize and manipulate the window
        self.setWindowState(Qt.WindowMaximized)
        # Close up the window and shut it down
        self.close()
        GPIO.cleanup()
        Eshutoff()

    def ZeroAllScales(self): #setting offset of scales to current value so that scales are zeroed
        #REWRITE to create a list that updates every time button is pressed, so that offset is cumulative
        global zeroTop
        global zeroMid
        global zeroBot
        global listTop
        global listMid
        global listBot
        listTop.append(weightTop)
        listMid.append(weightMid)
        listBot.append(weightBot)
        zeroTop = sum(listTop)
        zeroMid = sum(listMid)
        zeroBot = sum(listBot)

    def SetInitialWeights(self): #saving current weights as "initial weights" when button is pressed
        global initialWeightTop

        global initialWeightMid
        global initialWeightBot
        initialWeightTop = weightTop
        initialWeightMid = weightMid
        initialWeightBot = weightBot

    #Function to update the LED value inside the counting display
    def updateLED(self, LEDnum):
        #update the LED value
        self.LEDvalue = LEDnum  #rename the variable for clarity
        self.LCDdisplay.display(self.LEDvalue) #use the display method of the LCDdisplay inhereited class to update the LED
            
#    def updateProgressBar (self, ProgressNum):
#        self.ProgressValue = ProgressNum
#        self.Progress_bar.setValue(self.ProgressValue)

    def updateTopTemp(self, TopTemp):  #method for updating temperature display
        self.TopTempValue = TopTemp
        self.TopTempdisplay.display(self.TopTempValue)
       
    def updateBotTemp(self, BotTemp):  #method for updating temperature display
        self.BotTempValue = BotTemp
        self.BottomTempdisplay.display(self.BotTempValue)

    def updateTopWeight(self, TopWeight):  #method for updating weight display
        self.TopWeightValue = TopWeight
        self.TopWeightdisplay.display(self.TopWeightValue)
                
    def updateMiddleWeight(self, MiddleWeight):  #method for updating weight display
        self.MiddleWeightValue = MiddleWeight
        self.MiddleWeightdisplay.display(self.MiddleWeightValue)
        
    def updateBottomWeight(self, BottomWeight):  #method for updating weight display
        self.BottomWeightValue = BottomWeight
        self.BottomWeightdisplay.display(self.BottomWeightValue)
        
    def updateTopMoistureDisplay(self, TopMoisture):  #method for updating moisture display
        self.TopMoistureValue = TopMoisture
        self.TopMoisturedisplay.display(self.TopMoistureValue)
                        
    def updateMiddleMoistureDisplay(self, MiddleMoisture):  #method for updating moisture display
        self.MiddleMoistureValue = MiddleMoisture
        self.MiddleMoisturedisplay.display(self.MiddleMoistureValue)
        
    def updateBottomMoistureDisplay(self, BottomMoisture):  #method for updating moisture display
        self.BottomMoistureValue = BottomMoisture
        self.BottomMoisturedisplay.display(self.BottomMoistureValue)
        
    def getInitialSampleWeight(self): #method for saving the values input in the boxes - made an attempt to convert to int or float as appropriate
        global initialSampleWeightTemp
        global initialSampleWeight
        if self.InitialSampleWeight.text() != "":
            initialSampleWeightTemp = self.InitialSampleWeight.text()
        try:
            initialSampleWeight = float(initialSampleWeightTemp)
        except:
            initialSampleWeight = int(initialSampleWeightTemp)
    
    def getEStopTemp(self):
        global EStopTemp
        global EStopTempTemp                
        if self.EStopTemp.text() != "":
            EStopTempTemp = self.EStopTemp.text()
        try:
            EStopTemp = float(EStopTempTemp)
        except:
            EStopTemp = int(EStopTempTemp)
        
    def getDryMatterWeight(self):   #method for saving the values input in the boxes - made an attempt to convert to int or float as appropriate
        global dryMatterTemp
        global dryMatter
        if self.DryMatterWeight.text() != "":
            dryMatterTemp = self.DryMatterWeight.text()
        try:
            dryMatter = float(dryMatterTemp)
        except:
            dryMatter = int(dryMatterTemp)
            
    def getTargetWeightPercent(self):   #method for saving the values input in the boxes - made an attempt to convert to int or float as appropriate
        global targetPercentTemp
        global targetPercent
        if self.TargetWeightPercent.text() != "":
            targetPercentTemp = self.TargetWeightPercent.text()
        try:
            targetPercent = float(targetPercentTemp)
        except:
            targetPercent = int(targetPercentTemp)         
Exemplo n.º 32
0
class ControlWindow(QWidget):

    #Initialize the class (actually creating a initUI method and calling that, or just put all that code in here)
    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):
        #Primary screen - Control Window Screen (laptop) - Screen0 will always be primary screen (only screen on RPi)
        self.sizeScreen0 = QDesktopWidget().screenGeometry(
            0)  #use this function to get the screen geometry
        print('  Screen 0 size : ' + str(self.sizeScreen0.height()) + 'x' +
              str(self.sizeScreen0.width()))
        #Print out the screen size for debugging issues, will display in terminal

        self.setGeometry(
            0, 0, self.sizeScreen0.width(),
            self.sizeScreen0.height())  #set window screen dimensions
        self.setWindowTitle(
            'Control Panel')  #name window screen (displayed at top of window)

        #Create a button - same format for any button you want to make
        self.Zero_button = QPushButton(
            self)  #declare the button instance from the QPushbutton class
        # set the button position and size .setgeometry(Qrect(X position, Y position, button width, button height)) position is from upper left of button
        # The button position and dimensions are relative to the screen size. You can type in absolute numbers instead if you want and are sure of screensize
        self.Zero_button.setGeometry(
            QRect(self.sizeScreen0.width() * 0.015,
                  self.sizeScreen0.height() * 0.02,
                  self.sizeScreen0.width() * 0.165,
                  self.sizeScreen0.height() * 0.12))
        self.Zero_button.setObjectName("Zero_button")  #name the button
        self.Zero_button.setStyleSheet(
            "font: bold 14px; background-color: rgb(5,176,36);")

        self.Weight_button = QPushButton(self)
        self.Weight_button.setGeometry(
            QRect(self.sizeScreen0.width() * 0.2,
                  self.sizeScreen0.height() * 0.02,
                  self.sizeScreen0.width() * 0.165,
                  self.sizeScreen0.height() * 0.12))
        self.Weight_button.setObjectName("Weight_button")
        self.Weight_button.setStyleSheet(
            "font: bold 14px; background-color: rgb(5,176,36);")

        self.Estop_button = QPushButton(self)
        self.Estop_button.setGeometry(
            QRect(self.sizeScreen0.width() * 0.74,
                  self.sizeScreen0.height() * 0.02,
                  self.sizeScreen0.width() * 0.2,
                  self.sizeScreen0.height() * 0.12))
        self.Estop_button.setObjectName("Estop_button")
        self.Estop_button.setStyleSheet(
            "font: bold 14px; background-color: red;")

        #Create another button (same process as before)
        self.Close_button = QPushButton(self)
        self.Close_button.setGeometry(
            QRect(self.sizeScreen0.width() * 0.95,
                  self.sizeScreen0.height() * 0.01,
                  self.sizeScreen0.width() * 0.04,
                  self.sizeScreen0.height() * 0.06))
        self.Close_button.setObjectName("X_button")
        self.Close_button.setStyleSheet(
            "font: bold 18px; background-color: rgb(5,176,36);")

        self.Top_label = QLabel(self)
        self.Top_label.setGeometry(
            QRect(self.sizeScreen0.width() * 0.1,
                  self.sizeScreen0.height() * 0.125,
                  self.sizeScreen0.width() * 0.3,
                  self.sizeScreen0.height() * 0.3))
        self.Top_label.setStyleSheet("font: bold 20px;")

        self.Middle_label = QLabel(self)
        self.Middle_label.setGeometry(
            QRect(self.sizeScreen0.width() * 0.1,
                  self.sizeScreen0.height() * 0.325,
                  self.sizeScreen0.width() * 0.3,
                  self.sizeScreen0.height() * 0.3))
        self.Middle_label.setStyleSheet("font: bold 20px;")

        self.Bottom_label = QLabel(self)
        self.Bottom_label.setGeometry(
            QRect(self.sizeScreen0.width() * 0.1,
                  self.sizeScreen0.height() * 0.525,
                  self.sizeScreen0.width() * 0.3,
                  self.sizeScreen0.height() * 0.3))
        self.Bottom_label.setStyleSheet("font: bold 20px;")

        self.Progress_label = QLabel(self)
        self.Progress_label.setGeometry(
            QRect(self.sizeScreen0.width() * 0.1,
                  self.sizeScreen0.height() * 0.65,
                  self.sizeScreen0.width() * 0.3,
                  self.sizeScreen0.height() * 0.3))
        self.Progress_label.setStyleSheet("font: bold 15px;")

        self.Weight_label = QLabel(self)
        self.Weight_label.setGeometry(
            QRect(self.sizeScreen0.width() * 0.355,
                  self.sizeScreen0.height() * 0.05,
                  self.sizeScreen0.width() * 0.3,
                  self.sizeScreen0.height() * 0.3))
        self.Weight_label.setStyleSheet("font: bold 15px;")

        self.Moisture_label = QLabel(self)
        self.Moisture_label.setGeometry(
            QRect(self.sizeScreen0.width() * 0.6125,
                  self.sizeScreen0.height() * 0.125,
                  self.sizeScreen0.width() * 0.2,
                  self.sizeScreen0.height() * 0.15))
        self.Moisture_label.setStyleSheet("font: bold 15px;")

        self.TopTemp_label = QLabel(self)
        self.TopTemp_label.setGeometry(
            QRect(self.sizeScreen0.width() * 0.4,
                  self.sizeScreen0.height() * 0.03,
                  self.sizeScreen0.width() * 0.22,
                  self.sizeScreen0.height() * 0.05))
        self.TopTemp_label.setStyleSheet("font: bold 15px;")

        self.BottomTemp_label = QLabel(self)
        self.BottomTemp_label.setGeometry(
            QRect(self.sizeScreen0.width() * 0.4,
                  self.sizeScreen0.height() * 0.105,
                  self.sizeScreen0.width() * 0.22,
                  self.sizeScreen0.height() * 0.05))
        self.BottomTemp_label.setStyleSheet("font: bold 15px;")

        #Create an LCD display widget to show numbers
        self.LCDdisplay = QLCDNumber(
            self)  #Create the instance from the QLCDNumber class
        #Set the position and dimensions just like was done for the buttons
        self.LCDdisplay.setGeometry(
            QRect(self.sizeScreen0.width() * 0.935,
                  self.sizeScreen0.height() * 0.8,
                  self.sizeScreen0.width() * 0.05,
                  self.sizeScreen0.height() * 0.1))
        self.LCDdisplay.setObjectName("Counter")  #Name it
        self.LCDdisplay.setStyleSheet("background-color:white;")

        self.TopTempdisplay = QLCDNumber(self)
        self.TopTempdisplay.setGeometry(
            QRect(self.sizeScreen0.width() * 0.62,
                  self.sizeScreen0.height() * 0.025,
                  self.sizeScreen0.width() * 0.1,
                  self.sizeScreen0.height() * 0.06))
        self.TopTempdisplay.setObjectName("Top Temperature")
        self.TopTempdisplay.setStyleSheet("background-color:white;")

        self.BottomTempdisplay = QLCDNumber(self)
        self.BottomTempdisplay.setGeometry(
            QRect(self.sizeScreen0.width() * 0.62,
                  self.sizeScreen0.height() * 0.1,
                  self.sizeScreen0.width() * 0.1,
                  self.sizeScreen0.height() * 0.06))
        self.BottomTempdisplay.setObjectName("Bottom Temperature")
        self.BottomTempdisplay.setStyleSheet("background-color:white;")

        self.TopWeightdisplay = QLCDNumber(self)
        self.TopWeightdisplay.setGeometry(
            QRect(self.sizeScreen0.width() * 0.3,
                  self.sizeScreen0.height() * 0.22,
                  self.sizeScreen0.width() * 0.2,
                  self.sizeScreen0.height() * 0.12))
        self.TopWeightdisplay.setObjectName("Top Weight")
        self.TopWeightdisplay.setStyleSheet("background-color:white;")

        self.TopMoisturedisplay = QLCDNumber(self)
        self.TopMoisturedisplay.setGeometry(
            QRect(self.sizeScreen0.width() * 0.6,
                  self.sizeScreen0.height() * 0.22,
                  self.sizeScreen0.width() * 0.2,
                  self.sizeScreen0.height() * 0.12))
        self.TopMoisturedisplay.setObjectName("Top Moisture")
        self.TopMoisturedisplay.setStyleSheet("background-color:white;")

        self.MiddleWeightdisplay = QLCDNumber(self)
        self.MiddleWeightdisplay.setGeometry(
            QRect(self.sizeScreen0.width() * 0.3,
                  self.sizeScreen0.height() * 0.42,
                  self.sizeScreen0.width() * 0.2,
                  self.sizeScreen0.height() * 0.12))
        self.MiddleWeightdisplay.setObjectName("Middle Weight")
        self.MiddleWeightdisplay.setStyleSheet("background-color:white;")

        self.MiddleMoisturedisplay = QLCDNumber(self)
        self.MiddleMoisturedisplay.setGeometry(
            QRect(self.sizeScreen0.width() * 0.6,
                  self.sizeScreen0.height() * 0.42,
                  self.sizeScreen0.width() * 0.2,
                  self.sizeScreen0.height() * 0.12))
        self.MiddleMoisturedisplay.setObjectName("Middle Moisture")
        self.MiddleMoisturedisplay.setStyleSheet("background-color:white;")

        self.BottomWeightdisplay = QLCDNumber(self)
        self.BottomWeightdisplay.setGeometry(
            QRect(self.sizeScreen0.width() * 0.3,
                  self.sizeScreen0.height() * 0.62,
                  self.sizeScreen0.width() * 0.2,
                  self.sizeScreen0.height() * 0.12))
        self.BottomWeightdisplay.setObjectName("Bottom Weight")
        self.BottomWeightdisplay.setStyleSheet("background-color:white;")

        self.BottomMoisturedisplay = QLCDNumber(self)
        self.BottomMoisturedisplay.setGeometry(
            QRect(self.sizeScreen0.width() * 0.6,
                  self.sizeScreen0.height() * 0.62,
                  self.sizeScreen0.width() * 0.2,
                  self.sizeScreen0.height() * 0.12))
        self.BottomMoisturedisplay.setObjectName("Bottom Moisture")
        self.BottomMoisturedisplay.setStyleSheet("background-color:white;")

        self.Progress_bar = QProgressBar(self)
        self.Progress_bar.setGeometry(
            QRect(self.sizeScreen0.width() * 0.1,
                  self.sizeScreen0.height() * 0.83,
                  self.sizeScreen0.width() * 0.7,
                  self.sizeScreen0.height() * 0.04))
        self.Progress_bar.setRange(0, 100)
        #loop = 60
        #self.Progress_bar.setValue(loop)
        self.Progress_bar.setStyleSheet(
            "font: bold 15px; text-align: center; border: 1px solid grey;")

        #Not exactly sure what this does, but it is needed to put a name label on the buttons
        _translate = QCoreApplication.translate

        #Name the Close Button label
        self.Close_button.setText(_translate("ControlWindow", "X"))
        #Name the calibrate button label
        self.Zero_button.setText(_translate("ControlWindow",
                                            "Zero All Scales"))

        self.Weight_button.setText(
            _translate("ControlWindow", "Set Initial Weights"))

        self.Estop_button.setText(
            _translate("ControlWindow", "Emergency Shutoff"))

        self.Top_label.setText(_translate("ControlWindow", "Top Shelf:"))

        self.Middle_label.setText(_translate("ControlWindow", "Middle Shelf:"))

        self.Bottom_label.setText(_translate("ControlWindow", "Bottom Shelf:"))

        self.Progress_label.setText(
            _translate("ControlWindow", "Drying Progress:"))

        self.Weight_label.setText(_translate("ControlWindow", "Weight (lbs):"))

        self.Moisture_label.setText(
            _translate("ControlWindow", "Moisture Percent (%):"))

        self.TopTemp_label.setText(
            _translate("ControlWindow", "Top Temperature (F):"))

        self.BottomTemp_label.setText(
            _translate("ControlWindow", "Bottom Temperature (F):"))

        #This sets the Close button's action when you click on it, in this case it will run the method "CloseUp" which is below
        self.Close_button.clicked.connect(self.CloseUp)

        #Show the screen, not sure it is really needed though
        self.show

    #Like before, not exactly sure what it is doing, but needed to create and show the button naming labels
    def retranslateUi(self, TestDisplay):
        _translate = QCoreApplication.translate
        TestDisplay.setWindowTitle(_translate("MainGroWin", "MainWindow"))
        self.Disconnect_button.setText(_translate("MainGroWin", "Disconnect"))

    #The function that will close the window and program when you click on the "Close" button
    def CloseUp(
        self
    ):  #create method inside the ControlWindow Class (belongs to the ControlWindow class)
        # print('Closed')  #Used for debugging in terminal
        # Maximize the window, you can use the windowstate function to minimize, maximize and manipulate the window
        self.setWindowState(Qt.WindowMaximized)
        # Close up the window and shut it down
        self.close()

    #Function to update the LED value inside the counting display
    def updateLED(self, LEDnum):
        #update the LED value
        self.LEDvalue = LEDnum  #rename the variable for clarity
        self.LCDdisplay.display(
            self.LEDvalue
        )  #use the display method of the LCDdisplay inhereited class to update the LED

    def updateProgressBar(self, ProgressNum):
        self.ProgressValue = ProgressNum
        self.Progress_bar.setValue(self.ProgressValue)

    def updateTopTemp(self, TopTemp):
        self.TopTempValue = TopTemp
        self.TopTempdisplay.display(self.TopTempValue)
Exemplo n.º 33
0
class CueWidget(QWidget):

    STOP = QIcon.fromTheme('led-off')
    START = QIcon.fromTheme('led-running')
    PAUSE = QIcon.fromTheme('led-pause')
    ERROR = QIcon.fromTheme('led-error')

    ICON_SIZE = 14

    context_menu_request = pyqtSignal(object, QPoint)
    edit_request = pyqtSignal(object)
    cue_executed = pyqtSignal(object)

    def __init__(self, cue, **kwargs):
        super().__init__(**kwargs)
        self.cue = None

        self._selected = False
        self._accurate_timing = False
        self._show_dbmeter = False
        self._countdown_mode = True

        self._dbmeter_element = None
        self._fade_element = None

        self.setAttribute(Qt.WA_TranslucentBackground)
        self.setLayout(QGridLayout())

        self.layout().setContentsMargins(0, 0, 0, 0)
        self.layout().setSpacing(2)
        self.layout().setColumnStretch(0, 6)
        self.layout().setRowStretch(0, 4)

        self.nameButton = QClickLabel(self)
        self.nameButton.setObjectName('ButtonCueWidget')
        self.nameButton.setWordWrap(True)
        self.nameButton.setAlignment(Qt.AlignCenter)
        self.nameButton.setFocusPolicy(Qt.NoFocus)
        self.nameButton.clicked.connect(self._clicked)
        self.nameButton.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored)
        self.layout().addWidget(self.nameButton, 0, 0)

        self.statusIcon = QLabel(self.nameButton)
        self.statusIcon.setStyleSheet('background-color: transparent')
        self.statusIcon.setPixmap(CueWidget.STOP.pixmap(CueWidget.ICON_SIZE,
                                                        CueWidget.ICON_SIZE))

        self.seekSlider = QClickSlider(self.nameButton)
        self.seekSlider.setOrientation(Qt.Horizontal)
        self.seekSlider.setFocusPolicy(Qt.NoFocus)
        self.seekSlider.setVisible(False)

        self.dbMeter = QDbMeter(self)
        self.dbMeter.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored)
        self.dbMeter.setVisible(False)

        self.timeBar = QProgressBar(self)
        self.timeBar.setTextVisible(False)
        self.timeBar.setLayout(QHBoxLayout())
        self.timeBar.layout().setContentsMargins(0, 0, 0, 0)
        self.timeDisplay = QLCDNumber(self.timeBar)
        self.timeDisplay.setStyleSheet('background-color: transparent')
        self.timeDisplay.setSegmentStyle(QLCDNumber.Flat)
        self.timeDisplay.setDigitCount(8)
        self.timeDisplay.display('00:00:00')
        self.timeBar.layout().addWidget(self.timeDisplay)
        self.timeBar.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored)
        self.timeBar.setVisible(False)

        self._set_cue(cue)

    @property
    def selected(self):
        return self._selected

    @selected.setter
    def selected(self, value):
        self._selected = value
        self._update_style(self.cue.stylesheet)

    def contextMenuEvent(self, event):
        self.context_menu_request.emit(self, event.globalPos())

    def mouseMoveEvent(self, event):
        if (event.buttons() == Qt.LeftButton and
                (event.modifiers() == Qt.ControlModifier or
                 event.modifiers() == Qt.ShiftModifier)):
            mime_data = QMimeData()
            mime_data.setText(PageWidget.DRAG_MAGIC)

            drag = QDrag(self)
            drag.setMimeData(mime_data)
            drag.setPixmap(self.grab(self.rect()))

            if event.modifiers() == Qt.ControlModifier:
                drag.exec_(Qt.MoveAction)
            else:
                drag.exec_(Qt.CopyAction)

            event.accept()
        else:
            event.ignore()

    def set_countdown_mode(self, mode):
        self._countdown_mode = mode
        self._update_time(self.cue.current_time())

    def set_accurate_timing(self, enable):
        self._accurate_timing = enable
        if self.cue.state == CueState.Pause:
            self._update_time(self.cue.current_time(), True)
        elif self.cue.state != CueState.Running:
            self._update_duration(self.cue.duration)

    def show_seek_slider(self, visible):
        self.seekSlider.setVisible(visible)
        self.update()

    def show_dbmeters(self, visible):
        if isinstance(self.cue, MediaCue):
            self._show_dbmeter = visible

            if self._dbmeter_element is not None:
                self._dbmeter_element.level_ready.disconnect(self.dbMeter.plot)
                self._dbmeter_element = None

            if visible:
                self._dbmeter_element = self.cue.media.element('DbMeter')
                if self._dbmeter_element is not None:
                    self._dbmeter_element.level_ready.connect(self.dbMeter.plot)

                self.layout().addWidget(self.dbMeter, 0, 1)
                self.layout().setColumnStretch(1, 1)
                self.dbMeter.show()
            else:
                self.dbMeter.hide()
                self.layout().setColumnStretch(1, 0)

            self.update()

    def _set_cue(self, cue):
        self.cue = cue
        self.cue.changed('name').connect(self._update_name, Connection.QtQueued)
        self.cue.changed('stylesheet').connect(self._update_style, Connection.QtQueued)
        self.cue.changed('duration').connect(self._update_duration, Connection.QtQueued)
        self.cue.changed('description').connect(self._update_description, Connection.QtQueued)

        if isinstance(cue, MediaCue):
            self.cue.media.changed('pipe').connect(self._media_updated)

            self.cue.paused.connect(self.dbMeter.reset, Connection.QtQueued)
            self.cue.stopped.connect(self.dbMeter.reset, Connection.QtQueued)
            self.cue.end.connect(self.dbMeter.reset, Connection.QtQueued)
            self.cue.error.connect(self.dbMeter.reset, Connection.QtQueued)

            self.seekSlider.sliderMoved.connect(self.cue.media.seek)
            self.seekSlider.sliderJumped.connect(self.cue.media.seek)

        # Cue status changed
        self.cue.started.connect(self._status_playing, Connection.QtQueued)
        self.cue.stopped.connect(self._status_stopped, Connection.QtQueued)
        self.cue.paused.connect(self._status_paused, Connection.QtQueued)
        self.cue.error.connect(self._status_error, Connection.QtQueued)
        self.cue.end.connect(self._status_stopped, Connection.QtQueued)

        self._cue_time = CueTime(self.cue)
        self._cue_time.notify.connect(self._update_time)

        self._update_name(cue.name)
        self._update_style(cue.stylesheet)
        self._update_duration(self.cue.duration)

    def _media_updated(self):
        self.show_dbmeters(self._show_dbmeter)

        new_fade = self.cue.media.element('Fade')
        if new_fade is not self._fade_element:
            if self._fade_element is not None:
                self._fade_element.enter_fadein.disconnect(self._enter_fadein)
                self._fade_element.enter_fadeout.disconnect(self._enter_fadeout)
                self._fade_element.exit_fadein.disconnect(self._exit_fade)
                self._fade_element.exit_fadeout.disconnect(self._exit_fade)

            if new_fade is not None:
                self._fade_element = new_fade
                self._fade_element.enter_fadein.connect(self._enter_fadein)
                self._fade_element.enter_fadeout.connect(self._enter_fadeout)
                self._fade_element.exit_fadein.connect(self._exit_fade)
                self._fade_element.exit_fadeout.connect(self._exit_fade)

    def _update_name(self, name):
        self.nameButton.setText(name)

    def _update_description(self, description):
        self.nameButton.setToolTip(description)

    def _clicked(self, event):
        if not self.seekSlider.geometry().contains(event.pos()):
            if event.button() != Qt.RightButton:
                if event.modifiers() == Qt.ShiftModifier:
                    self.edit_request.emit(self.cue)
                elif event.modifiers() == Qt.ControlModifier:
                    self.selected = not self.selected
                else:
                    self.cue_executed.emit(self.cue)
                    self.cue.execute()

    def _update_style(self, stylesheet):
        stylesheet += 'text-decoration: underline;' if self.selected else ''
        self.nameButton.setStyleSheet(stylesheet)

    def _enter_fadein(self):
        p = self.timeDisplay.palette()
        p.setColor(p.WindowText, QColor(0, 255, 0))
        self.timeDisplay.setPalette(p)

    def _enter_fadeout(self):
        p = self.timeDisplay.palette()
        p.setColor(p.WindowText, QColor(255, 50, 50))
        self.timeDisplay.setPalette(p)

    def _exit_fade(self):
        self.timeDisplay.setPalette(self.timeBar.palette())

    def _status_stopped(self):
        self.statusIcon.setPixmap(CueWidget.STOP.pixmap(CueWidget.ICON_SIZE,
                                                        CueWidget.ICON_SIZE))
        self._update_time(0, True)

    def _status_playing(self):
        self.statusIcon.setPixmap(CueWidget.START.pixmap(CueWidget.ICON_SIZE,
                                                         CueWidget.ICON_SIZE))

    def _status_paused(self):
        self.statusIcon.setPixmap(CueWidget.PAUSE.pixmap(CueWidget.ICON_SIZE,
                                                         CueWidget.ICON_SIZE))

    def _status_error(self, cue, error, details):
        self.statusIcon.setPixmap(CueWidget.ERROR.pixmap(CueWidget.ICON_SIZE,
                                                         CueWidget.ICON_SIZE))
        QDetailedMessageBox.dcritical(self.cue.name, error, details)

    def _update_duration(self, duration):
        # Update the maximum values of seek-slider and time progress-bar
        if duration > 0:
            if not self.timeBar.isVisible():
                self.layout().addWidget(self.timeBar, 1, 0, 1, 2)
                self.layout().setRowStretch(1, 1)
                self.timeBar.show()
            self.timeBar.setMaximum(duration)
            self.seekSlider.setMaximum(duration)
        else:
            self.timeBar.hide()
            self.layout().setRowStretch(1, 0)

        # If not in playing or paused update the widget showed time
        if self.cue.state != CueState.Running or self.cue.state != CueState.Running:
            self._update_time(duration, True)

    def _update_time(self, time, ignore_visibility=False):
        if ignore_visibility or not self.visibleRegion().isEmpty():
            # If the given value is the duration or < 0 set the time to 0
            if time == self.cue.duration or time < 0:
                time = 0

            # Set the value the seek slider
            self.seekSlider.setValue(time)

            # If in count-down mode the widget will show the remaining time
            if self._countdown_mode:
                time = self.cue.duration - time

            # Set the value of the timer progress-bar
            if self.cue.duration > 0:
                self.timeBar.setValue(time)

            # Show the time in the widget
            self.timeDisplay.display(strtime(time, accurate=self._accurate_timing))

    def resizeEvent(self, event):
        self.update()

    def update(self):
        super().update()
        self.layout().activate()

        xdim = self.nameButton.width()
        ydim = self.nameButton.height() / 5
        ypos = self.nameButton.height() - ydim

        self.seekSlider.setGeometry(0, ypos, xdim, ydim)
        self.statusIcon.setGeometry(4, 4, CueWidget.ICON_SIZE,
                                    CueWidget.ICON_SIZE)
class PlayingMediaWidget(QWidget):

    def __init__(self, cue, **kwargs):
        super().__init__(**kwargs)

        self.cue = cue
        self.cue_time = CueTime(cue)
        self.cue_time.notify.connect(self._time_updated, Connection.QtQueued)

        self._dbmeter_element = None
        self._accurate_time = False

        scroll_size = (self.parent().verticalScrollBar().width() + 5)
        self.setGeometry(0, 0, self.parent().width() - scroll_size, 102)
        self.setFocusPolicy(Qt.NoFocus)

        self.gridLayoutWidget = QWidget(self)
        self.gridLayoutWidget.setGeometry(self.geometry())
        self.gridLayout = QGridLayout(self.gridLayoutWidget)
        self.gridLayout.setContentsMargins(2, 2, 2, 2)

        self.nameLabel = QLabel(self.gridLayoutWidget)
        self.nameLabel.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored)
        self.nameLabel.setText(cue.name)
        self.nameLabel.setToolTip(cue.name)
        self.gridLayout.addWidget(self.nameLabel, 0, 0, 1, 3)

        self.playPauseButton = QPushButton(self.gridLayoutWidget)
        self.playPauseButton.setSizePolicy(QSizePolicy.Ignored,
                                           QSizePolicy.Ignored)
        self.playPauseButton.setIcon(QIcon.fromTheme('media-playback-pause'))
        self.playPauseButton.setIconSize(QSize(24, 24))
        self.playPauseButton.setFocusPolicy(Qt.NoFocus)
        self.playPauseButton.clicked.connect(self._pause)
        self.gridLayout.addWidget(self.playPauseButton, 1, 0)

        self.stopButton = QPushButton(self.gridLayoutWidget)
        self.stopButton.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored)
        self.stopButton.setIcon(QIcon.fromTheme('media-playback-stop'))
        self.stopButton.setIconSize(QSize(24, 24))
        self.stopButton.setFocusPolicy(Qt.NoFocus)
        self.stopButton.clicked.connect(self._stop)
        self.gridLayout.addWidget(self.stopButton, 1, 1)

        self.timeDisplay = QLCDNumber(self.gridLayoutWidget)
        self.timeDisplay.setStyleSheet('background-color: transparent')
        self.timeDisplay.setSegmentStyle(QLCDNumber.Flat)
        self.timeDisplay.setDigitCount(8)
        self.timeDisplay.display(strtime(cue.media.duration))
        self.gridLayout.addWidget(self.timeDisplay, 1, 2)

        self.seekSlider = QClickSlider(self.gridLayoutWidget)
        self.seekSlider.setOrientation(Qt.Horizontal)
        self.seekSlider.setRange(0, cue.media.duration)
        self.seekSlider.setFocusPolicy(Qt.NoFocus)
        self.seekSlider.sliderMoved.connect(self._seek)
        self.seekSlider.sliderJumped.connect(self._seek)
        self.seekSlider.setVisible(False)

        self.dbmeter = QDbMeter(self.gridLayoutWidget)
        self.dbmeter.setVisible(False)

        self.gridLayout.setRowStretch(0, 1)
        self.gridLayout.setRowStretch(1, 2)
        self.gridLayout.setColumnStretch(0, 3)
        self.gridLayout.setColumnStretch(1, 3)
        self.gridLayout.setColumnStretch(2, 5)

        cue.changed('name').connect(self.name_changed)
        cue.media.changed('duration').connect(self.update_duration)
        cue.media.played.connect(self._pause_to_play)
        cue.media.paused.connect(self._play_to_pause)

        self.fade = self.cue.media.element('Fade')
        if self.fade is not None:
            self.fade.enter_fadein.connect(self.enter_fadein)
            self.fade.enter_fadeout.connect(self.enter_fadeout)
            self.fade.exit_fadein.connect(self.exit_fade)
            self.fade.exit_fadeout.connect(self.exit_fade)

    def enter_fadeout(self):
        p = self.timeDisplay.palette()
        p.setColor(p.Text, QColor(255, 50, 50))
        self.timeDisplay.setPalette(p)

    def enter_fadein(self):
        p = self.timeDisplay.palette()
        p.setColor(p.Text, QColor(0, 255, 0))
        self.timeDisplay.setPalette(p)

    def exit_fade(self):
        self.timeDisplay.setPalette(self.palette())

    def name_changed(self, name):
        self.nameLabel.setText(name)
        self.nameLabel.setToolTip(name)

    def set_accurate_time(self, enable):
        self._accurate_time = enable

    def set_seek_visible(self, visible):
        if visible and not self.seekSlider.isVisible():
            self.gridLayout.addWidget(self.seekSlider, 2, 0, 1, 3)
            self.gridLayout.setRowStretch(2, 1)
        elif not visible and self.seekSlider.isVisible():
            self.gridLayout.removeWidget(self.seekSlider)
            self.gridLayout.setRowStretch(2, 0)

        self.seekSlider.setVisible(visible)

    def set_dbmeter_visible(self, visible):
        if self._dbmeter_element is not None:
            self._dbmeter_element.level_ready.disconnect(self.dbmeter.plot)
            self._dbmeter_element = None

        if visible:
            self._dbmeter_element = self.cue.media.element('DbMeter')
            if self._dbmeter_element is not None:
                self._dbmeter_element.level_ready.connect(self.dbmeter.plot)

        # Add/Remove the QDbMeter in the layout
        if visible and not self.dbmeter.isVisible():
            self.gridLayout.addWidget(self.dbmeter, 0, 3, 4, 1)
            self.gridLayout.setColumnStretch(3, 1)
        elif not visible and self.dbmeter.isVisible():
            self.gridLayout.removeWidget(self.dbmeter)
            self.gridLayout.setColumnStretch(3, 0)

        self.dbmeter.setVisible(visible)

    def _time_updated(self, time):
        if not self.visibleRegion().isEmpty():
            # If the given value is the duration or < 0 set the time to 0
            if time == self.cue.media.duration or time < 0:
                time = 0

            # Set the value the seek slider
            self.seekSlider.setValue(time)

            # Show the time in the widget
            self.timeDisplay.display(strtime(self.cue.media.duration - time,
                                             accurate=self._accurate_time))

    def update_duration(self, media, duration):
        self.seekSlider.setMaximum(duration)

    def _stop(self, *args):
        self.cue.stop()

    def _play(self, *args):
        self.cue.start()

    def _pause(self, *args):
        self.cue.pause()

    def _seek(self, position):
        self.cue.media.seek(position)

    def _play_to_pause(self):
        self.playPauseButton.clicked.disconnect()
        self.playPauseButton.clicked.connect(self._play)
        self.playPauseButton.setIcon(QIcon.fromTheme('media-playback-start'))

    def _pause_to_play(self):
        self.playPauseButton.clicked.disconnect()
        self.playPauseButton.clicked.connect(self._pause)
        self.playPauseButton.setIcon(QIcon.fromTheme('media-playback-pause'))