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
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)
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_())
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)
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)
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)
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)
class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.lcd = QLCDNumber(self) # 设置数字类 self.lcd.setDigitCount(25) self.lcd.setMode(QLCDNumber.Dec) self.lcd.setSegmentStyle(QLCDNumber.Flat) self.lcd.setStyleSheet( "border: 1px solid green; color: green; background: silver;" ) # 设置显示的颜色样式 # vbox = QVBoxLayout() # 设置布局 # vbox.addWidget(self.lcd) # self.setLayout(vbox) self.setGeometry(300, 300, 250, 150) self.setWindowTitle('hello') dir_path = os.path.abspath(os.path.dirname(__file__)) + '\image\\1.ico' self.setWindowIcon(QIcon(dir_path)) self.show() self.timer = QTimer() self.timer.start(1) self.timer.timeout.connect(self.flush) # 使用了计时器 ''' 创建计时器->设置1ms刷新间隔->每次刷新执行flush函数 ''' def flush(self): # 获取系统当前时间 dateTime = QDateTime.currentDateTime() # 显示的内容 self.lcd.display(dateTime.toString("yyyy-MM-dd HH:mm:ss.zzz"))
class 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)
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)
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)
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)
class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.resize(370, 190) self.setWindowTitle('关注微信公众号:学点编程吧--倒计时:LCD数字') self.lcd = QLCDNumber(self) lb = QLabel("距离2022年北京-张家口冬季奥林匹克运动会还有", self) ft = QFont() ft.setPointSize(15) lb.setFont(ft) vbox = QVBoxLayout(self) vbox.addWidget(lb) vbox.addWidget(self.lcd) self.lcd.setDigitCount(12) self.lcd.setMode( QLCDNumber.Dec) # etMode()该属性保存当前的显示模式(数字库),对应于当前显示模式, self.lcd.setStyleSheet( "border: 2px solid black; color: blue; background: silver; border-radius:10px;border-width:3px;" ) time = QTimer(self) time.setInterval(1000) # 1000毫秒=1秒 time.timeout.connect(self.refresh) # 以固定时间1秒,向refresh槽发出信号 time.start() self.show() def refresh(self): startDate = QDateTime.currentMSecsSinceEpoch() endDate = QDateTime( QDate(2020, 2, 4), QTime(0, 0, 0) ).toMSecsSinceEpoch( ) # 假设是0:0:0开始的,我们创建一个QDatetime对象,并使用toMSecsSinceEpoch()返回2020年2月4日0:0:0自1970-01-01T00:00:00.000世界协调时间以来的毫秒数。 interval = endDate - startDate if interval > 0: days = interval // (24 * 60 * 60 * 1000) hour = (interval - days * 24 * 60 * 60 * 1000) // (60 * 60 * 1000) min = (interval - days * 24 * 60 * 60 * 1000 - hour * 60 * 60 * 1000) // (60 * 1000) sec = (interval - days * 24 * 60 * 60 * 1000 - hour * 60 * 60 * 1000 - min * 60 * 1000) // 1000 intervals = str(days) + ':' + str(hour) + ':' + str( min) + ':' + str(sec) self.lcd.display(intervals)
class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.resize(370, 190) self.setWindowTitle('LCD数字') self.lcd = QLCDNumber(self) lb = QLabel("距离2022年北京-张家口冬季奥林匹克运动会还有", self) ft = QFont() ft.setPointSize(15) lb.setFont(ft) vbox = QVBoxLayout(self) vbox.addWidget(lb) vbox.addWidget(self.lcd) self.lcd.setDigitCount(13) self.lcd.setMode(QLCDNumber.Dec) self.lcd.setStyleSheet( "border: 2px solid black; color: red; background: silver;") time = QTimer(self) time.setInterval(1000) time.timeout.connect(self.refresh) time.start() self.show() def refresh(self): startDate = QDateTime.currentMSecsSinceEpoch() endDate = QDateTime(QDate(2022, 2, 4), QTime(0, 0, 0)).toMSecsSinceEpoch() interval = endDate - startDate if interval > 0: days = interval // (24 * 60 * 60 * 1000) hour = (interval - days * 24 * 60 * 60 * 1000) // (60 * 60 * 1000) min = (interval - days * 24 * 60 * 60 * 1000 - hour * 60 * 60 * 1000) // (60 * 1000) sec = (interval - days * 24 * 60 * 60 * 1000 - hour * 60 * 60 * 1000 - min * 60 * 1000) // 1000 intervals = str(days) + ':' + str(hour) + ':' + str( min) + ':' + str(sec) self.lcd.display(intervals)
class MainWindow(Ui_MainWindow, QMainWindow): """ 主界面二次设计 """ def __init__(self): super(MainWindow, self).__init__() # 获取桌面尺寸 desktop = QApplication.desktop() desk_width = desktop.screenGeometry().width() desk_height = desktop.screenGeometry().height() # 摄像头图像设置 self.frame = DIYLabel(self) self.frame.setGeometry(0, 0, desk_width, desk_height) self.setupUi(self) # 按钮定位 self.buttons = [ self.att_rec, self.face_login, self.face_rec, self.face_reg ] map( lambda x: x.move( desk_width * 0.80, desk_height * 0.33 + self.buttons.index(x) * (x.height() + 8)), self.buttons) map(lambda x: x.raise_(), self.buttons) # 设置时钟 self.clock = QLCDNumber(self) self.clock.setDigitCount(10) self.clock.setMode(QLCDNumber.Dec) self.clock.setSegmentStyle(QLCDNumber.Flat) self.clock.display(time.strftime("%X", time.localtime())) self.clock.setStyleSheet("QLCDNumber{color:rgba(255,0,0,100);}") self.clock.resize(280, 120) self.clock.move(50, desk_height - 30 - self.clock.height()) self.setWindowFlags(Qt.FramelessWindowHint) # 隐藏窗口 self.showFullScreen() # 窗体全屏
class 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)
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))
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()
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()
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))
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
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)
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
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", " Почему появляется ошибка?"))
class Game(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): grid = QGridLayout() grid.setSpacing(10) # 创建标签之间的空间。 self.labels = [] self.palettes = [] for i in range(ROW**2): # create label label = QLabel('0', self) label.setAlignment(Qt.AlignCenter) # 居中显示 label.setFixedWidth(80) label.setFixedHeight(80) label.setFont(QFont("Arial", 20, QFont.Bold)) # 粗体 grid.addWidget(label, i // ROW, i % ROW) self.labels.append(label) # create palette pe = QPalette() pe.setColor(QPalette.WindowText, NUM_MAP_COLOR['0']['font']) label.setAutoFillBackground(True) # 设置背景充满,为设置背景颜色的必要条件 pe.setColor(QPalette.Window, NUM_MAP_COLOR['0']['background']) # 设置背景颜色 label.setPalette(pe) self.palettes.append(pe) self.randomSetLabels(2) self.succeed = False self.isMove = False self.isLose = False # lcd self.lcd = QLCDNumber(self) lb = QLabel("game running time : ", self) self.lcd.setDigitCount(8) self.lcd.setMode(QLCDNumber.Dec) self.lcd.setStyleSheet( "border: 2px solid black; color: red; background: silver;") grid.addWidget(lb, 4, 0, 1, 2) grid.addWidget(self.lcd, 4, 2, 1, 2) # debug label self.__debug_label = QLabel('debug text', self) grid.addWidget(self.__debug_label, 5, 0, 4, 4) self.setLayout(grid) # timer self.second_count = 0 time = QTimer(self) time.setInterval(1000) time.timeout.connect(self.refresh) time.start() self.setGeometry(300, 300, 400, 600) self.setWindowTitle('2048 game') self.setWindowIcon(QIcon('2048.png')) self.show() def refresh(self): self.second_count += 1 sec = self.second_count % 60 min = int(self.second_count / 60) % 60 hour = int(self.second_count / 60 / 60) % 60 sec_str = str(sec) if sec > 9 else '0' + str(sec) min_str = str(sec) if min > 9 else '0' + str(min) hour_str = str(sec) if hour > 9 else '0' + str(hour) show_num = '{}:{}:{}'.format(hour_str, min_str, sec_str) self.lcd.display(show_num) def resetLabel(self): for i in range(ROW * COL): self.setTextAndColor(i, '0', setIsMove=False) self.randomSetLabels(2) self.second_count = 0 def keyPressEvent(self, e): if e.key() == Qt.Key_Up: self.__debug_label.setText('↑') self.gridMove('up') elif e.key() == Qt.Key_Down: self.__debug_label.setText('↓') self.gridMove('down') elif e.key() == Qt.Key_Left: self.__debug_label.setText('←') self.gridMove('left') elif e.key() == Qt.Key_Right: self.__debug_label.setText('→') self.gridMove('right') elif e.key() == Qt.Key_R: self.resetLabel() def gridMove(self, dir): self.removeEmptyLabel(dir) self.mergeSameLabel(dir) if self.isLose: self.gameOver() if self.succeed: self.gameSuccess() if self.isMove: self.isMove = False self.randomSetLabels(1) def removeEmptyLabel(self, dir): self.isLose = True if dir == 'right': for i in range(ROW): # 每一行 row_point = [] # 记录所有有效值 for j in range(COL - 1, -1, -1): if self.labels[i * ROW + j].text() != '0': row_point.append(self.labels[i * ROW + j].text()) else: self.isLose = False j = COL - 1 # 依次填充有效值 for text in row_point: self.setTextAndColor(i * ROW + j, text) j -= 1 # 剩余label补零 while j != -1: self.setTextAndColor(i * ROW + j, '0') j -= 1 elif dir == 'left': for i in range(ROW): # 每一行 row_point = [] for j in range(COL): if self.labels[i * ROW + j].text() != '0': row_point.append(self.labels[i * ROW + j].text()) else: self.isLose = False j = 0 for text in row_point: self.setTextAndColor(i * ROW + j, text) j += 1 while j != COL: self.setTextAndColor(i * ROW + j, '0') j += 1 elif dir == 'up': for j in range(COL): # 每一行 row_point = [] for i in range(ROW): if self.labels[i * ROW + j].text() != '0': row_point.append(self.labels[i * ROW + j].text()) else: self.isLose = False i = 0 for text in row_point: self.setTextAndColor(i * ROW + j, text) i += 1 while i != ROW: self.setTextAndColor(i * ROW + j, '0') i += 1 elif dir == 'down': for j in range(COL): # 每一行 col_point = [] for i in range(ROW - 1, -1, -1): if self.labels[i * ROW + j].text() != '0': col_point.append(self.labels[i * ROW + j].text()) else: self.isLose = False i = ROW - 1 for text in col_point: self.setTextAndColor(i * ROW + j, text) i -= 1 while i != -1: self.setTextAndColor(i * ROW + j, '0') i -= 1 def mergeSameLabel(self, dir): if dir == 'right': for j in range(ROW): # 每一行 for i in range(COL - 1, 0, -1): # 每一列 right_label = self.labels[j * ROW + i] # 每一行中相邻两个靠右的label left_label = self.labels[j * ROW + i - 1] # 靠左的label if right_label.text() == left_label.text(): # 两个格相等 num = int(right_label.text()) self.finishedMerge(j * ROW + i, num * 2) self.setTextAndColor(j * ROW + i, str(num * 2)) for k in range(i - 1, 0, -1): # 依次右移一格 self.setTextAndColor( j * ROW + k, self.labels[j * ROW + k - 1].text()) self.setTextAndColor(j * ROW + 0, '0') break elif dir == 'left': for j in range(ROW): # 每一行 for i in range(COL - 1): # 每一列 right_label = self.labels[j * ROW + i + 1] left_label = self.labels[j * ROW + i] if right_label.text() == left_label.text(): # 两个格相等 num = int(left_label.text()) self.finishedMerge(j * ROW + i, num * 2) self.setTextAndColor(j * ROW + i, str(num * 2)) for k in range(i + 1, COL - 1): self.setTextAndColor( j * ROW + k, self.labels[j * ROW + k + 1].text()) self.setTextAndColor(j * ROW + COL - 1, '0') break elif dir == 'down': for i in range(COL): for j in range(ROW - 1, 0, -1): up_label = self.labels[(j - 1) * ROW + i] down_label = self.labels[j * ROW + i] if up_label.text() == down_label.text(): # 两个格相等 num = int(down_label.text()) self.finishedMerge(j * ROW + i, num * 2) self.setTextAndColor(j * ROW + i, str(num * 2)) for k in range(j - 1, 0, -1): self.setTextAndColor( k * ROW + i, self.labels[(k - 1) * ROW + i].text()) self.setTextAndColor(0 * ROW + i, '0') break elif dir == 'up': for i in range(COL): for j in range(ROW - 1): up_label = self.labels[j * ROW + i] down_label = self.labels[(j + 1) * ROW + i] if up_label.text() == down_label.text(): # 两个格相等 num = int(up_label.text()) self.finishedMerge(j * ROW + i, num * 2) self.setTextAndColor(j * ROW + i, str(num * 2)) for k in range(j + 1, ROW - 1): self.labels[k * ROW + i].setText( self.labels[(k + 1) * ROW + i].text()) self.setTextAndColor( k * ROW + i, self.labels[(k + 1) * ROW + i].text()) self.setTextAndColor((COL - 1) * ROW + i, '0') break def randomSetLabels(self, nums): empty_grids = self.getEmptyGrid() num_strs = '22244' for _ in range(nums): num = random.choice(num_strs) # todo 添加权重 label_index = random.choice(empty_grids) self.setTextAndColor(label_index, num, setIsMove=False) def getEmptyGrid(self): results = [ index for index, labels in enumerate(self.labels) if labels.text() == '0' ] return results def gameSuccess(self): button = QMessageBox.question( self, "Congratulations", "You are very NB! Do you want to restart?", QMessageBox.Ok | QMessageBox.Cancel, QMessageBox.Ok) if button == QMessageBox.Ok: self.resetLabel() self.__debug_label.setText("Question button/Ok") elif button == QMessageBox.Cancel: self.__debug_label.setText("Question button/Cancel") def setTextAndColor(self, index, num, setIsMove=True): if setIsMove: pre_text = self.labels[index].text() if pre_text != num: self.isMove = True self.labels[index].setText(num) self.palettes[index].setColor(QPalette.WindowText, NUM_MAP_COLOR[num]['font']) self.palettes[index].setColor(QPalette.Window, NUM_MAP_COLOR[num]['background']) self.labels[index].setPalette(self.palettes[index]) def finishedMerge(self, index, num): if num == 2048: self.succeed = True self.isLose = False def gameOver(self): button = QMessageBox.question(self, "Sorry", "Game over! Do you want to restart?", QMessageBox.Ok | QMessageBox.Cancel, QMessageBox.Ok) if button == QMessageBox.Ok: self.resetLabel() self.__debug_label.setText("Question button/Ok") elif button == QMessageBox.Cancel: self.__debug_label.setText("Question button/Cancel")
class 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()
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()
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()))
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()))
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)
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)
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'))