예제 #1
0
class VideoPlayer(QMediaPlayer):
    """docstring for VideoPlayer"""
    def __init__(self):
        super(VideoPlayer, self).__init__(None, QMediaPlayer.VideoSurface)
        self.view = QVideoWidget()
        self.view.setWindowTitle('Video Player')
        self.setVideoOutput(self.view)

    def widget(self):
        return self.view

    def show(self):
        self.view.show()

    def hide(self):
        self.view.hide()

    def isVisible(self):
        return self.view.isVisible()

    def setSize(self, width, height):
        self.view.resize(width, height)

    def toggle(self):
        if self.state() == self.PlayingState:
            self.pause()
        else:
            self.play()

    def loadMedia(self, fullPath):
        self.setMedia(QMediaContent(QUrl.fromLocalFile(fullPath)))
        self.stop()
예제 #2
0
파일: ste.py 프로젝트: Aerasair/diplom
class Player(QDialog):
    def __init__(self):
        super().__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        # self.show()
        self.ui.btn_play.clicked.connect(self.playvideo) #включить видео
        self.ui.btn_stop.clicked.connect(self.stopvideo) #остановить видео
        self.ui.btn_pause.clicked.connect(self.pausevideo) #пауза
        self.ui.btn_back.clicked.connect(self.hidewindow) #скрыть окно плеера
        self.ui.verticalSlider.valueChanged.connect(self.setvolume) #громкость
        # self.ui.horizontalSlider.valueChanged.connect(self.settimevideo) #перемотка - починить функцию
        self.ui.listWidget.addItems(listdir("records")) #генерация списка файлов в папке records
        self.ui.listWidget.itemClicked.connect(self.playthis) #выбор видео


        self.player = QMediaPlayer()
        self.player.positionChanged.connect(self.setvideoonslider)#автодвижение ползунка
        self.video = QVideoWidget(self.ui.label)
        self.video.resize(621, 451)
        self.video.move(0, 0)
        self.player.setVideoOutput(self.video)
        self.video.show()

        self.ui.label.customContextMenuRequested.connect(self.testfun) #ПРАВАЯ КНОПКА МЫШИ

    def testfun(self):
        print("Тест успешен")

    def playvideo(self):
        self.player.play()
        self.ui.horizontalSlider.setMaximum(self.player.duration())
        self.ui.horizontalSlider.setPageStep(self.player.duration() / 10)

    def stopvideo(self):
        self.player.stop()

    def pausevideo(self):
        self.player.pause()

    def hidewindow(self):
        self.hide()

    def setvolume(self):
        self.player.setVolume(self.ui.verticalSlider.value())

    def settimevideo(self):
        self.player.setPosition(self.ui.horizontalSlider.value())

    def playthis(self):
        self.player.setMedia(QMediaContent(QUrl.fromLocalFile("records/" + str(self.ui.listWidget.currentItem().text()))))

    def setvideoonslider(self):
        self.ui.horizontalSlider.setValue(self.player.position())
        self.ui.lbl_time.setText(str(int(self.player.position() / 1000)) + "/" + str(int(self.player.duration() / 1000)))

    def test(self):
        print("Тест пройден")
class VideoPlayer:
    def __init__(self):
        self.video = QVideoWidget()
        self.video.resize(300, 300)
        self.video.move(0, 0)
        self.player = QMediaPlayer()
        self.player.setVideoOutput(self.video)
        self.player.setMedia(
            QMediaContent(
                QUrl.fromLocalFile("/home/akhil/Videos/SoftwareTrial.mp4")))

    def callback(self):
        self.player.setPosition(
            0)  # to start at the beginning of the videowidget every time
        self.video.show()
        self.player.play()
예제 #4
0
 def loose(self):
     if globals.loose_animation:
         video = QVideoWidget()
         video.resize(500, 400)
         video.setWindowTitle("GAME OVER")
         player = QMediaPlayer()
         player.setVideoOutput(video)
         player.setMedia(
             QMediaContent(QUrl.fromLocalFile("../Video/bum.gif")))
         video.show()
         player.play()
         self.signals.add_music.emit()
         time.sleep(5.5)
         self.signals.delete_music.emit()
         player.stop()
         video.close()
     else:
         __loose_statement = QMessageBox.question(
             QMessageBox(), "GAME OVER!!",
             "You loose!!!\nYour time: {}".format(globals.time),
             QMessageBox.Ok)
예제 #5
0
class VideoPlayer:

    def __init__(self):
        self.video = QVideoWidget()
        self.video.resize(300, 300)
        self.video.move(0, 0)
        self.player = QMediaPlayer()
        self.player.setVideoOutput(self.video)
        self.player.setMedia(QMediaContent(QUrl.fromLocalFile("D:/FILM/film/data/video/2.mp4")))

        self.timer = QTimer()
        self.timer.timeout.connect(self.check)
        self.timer.start(1000)

    def callback(self):
        self.player.setPosition(0)  # to start at the beginning of the video every time
        self.video.show()
        self.player.play()

    def check(self):
        print('DADA')
예제 #6
0
class Frogger(QWidget):
    def __init__(self):
        super().__init__()
        Config.mainWindow = self  #odma se postavi koji objekat je mainWindow da bi tamo u Rectangle.py Qlabeli znali gde treba da se nacrtaju. Lose je resenje, al radi bar za testiranje
        self.Menu = None  # glavni meni

        self.InitFlagsAndVariables()

        self.scoreboard = Scoreboard(self)
        self.highscore = HighScore()
        self.highscore.readFromFile()

        ###############################################
        self.videoWidget = QVideoWidget(self)
        self.videoWidget.resize(Config.mapSize * Config.gridSize,
                                Config.mapSize * Config.gridSize + 50)
        self.mediaPlayer = QMediaPlayer(None, QMediaPlayer.VideoSurface)
        self.mediaPlayer.setVideoOutput(self.videoWidget)
        self.mediaPlayer.setMedia(
            QMediaContent(QUrl(Config.spriteLocation + "Intro.wmv")))
        ###############################################

        self.setWindowState(Qt.WindowNoState)
        self.__init_ui__()

        self.key_notifier = KeyNotifier()
        self.key_notifier.key_signal.connect(self.__update_position__)
        self.key_notifier.start()

        self.ZevsJavljaVremeQueue = Queue()
        self.procUKomZiviZevs = Zeus.PokreniZevsa(
            self.ZevsJavljaVremeQueue
        )  #pokrece proces koji u kju stavlja kakvo vreme treba da bude (sunce, kisa, sneg)

    def InitFlagsAndVariables(self):
        self.Map = []  # lista lejnova
        self.previousWeather = 'n'
        self.player1 = None
        self.player2 = None
        self.player1RectId = -1  # ovo je potrebno za mrezu
        self.player2RectId = -1  # ovo je potrebno za mrezu

        self.gamePaused = False

        self.GameOverBrojac = 0  # za zivote, ako je 2PlayerMode, kad igrac izgubi sve zivote povecava brojac za 1, kad oba izgube sve zivote, brojac je 2 i tad je gameOver
        # ako je SinglePlayer mod onda je gameOver ako je brojac 1
        self.Level = 1  # za levele

        Config.p1Score = 0
        Config.p2Score = 0
        Config.p1Lives = 5
        Config.p2Lives = 5

        try:
            self.ShutDownHost()
        except:
            pass

        try:
            self.ShutDownClient()
        except:
            pass

        self.host = None
        self.client = None
        self.isHost = False
        self.isClient = False

    def initVideo(self):
        self.videoWidget.show()
        self.mediaPlayer.play()

    def __init_ui__(self):
        self.setWindowTitle('Frogger')
        self.setWindowIcon(QtGui.QIcon(Config.spriteLocation +
                                       'iconFrog.png'))  #ikonica
        self.resize(Config.mapSize * Config.gridSize,
                    Config.mapSize * Config.gridSize + 50)
        self.FixWindowSize()
        self.show()
        self.initVideo()

        q = QTimer()
        q.singleShot(6000, self.DisplayMainMenu)

    def HsFunkc(self):
        self.Menu.HsElementsShow(self.highscore.top3)

    #obicna funkcija za fiksiranje velicine prozora
    def FixWindowSize(self):
        self.setMinimumHeight((Config.mapSize + 1) * Config.gridSize)
        self.setMinimumWidth(Config.mapSize * Config.gridSize)
        self.setMaximumHeight((Config.mapSize + 1) * Config.gridSize)
        self.setMaximumWidth(Config.mapSize * Config.gridSize)

    def RemoveVideoIntro(self):
        try:
            self.mediaPlayer.stop()
            self.videoWidget.setParent(None)
            self.videoWidget = None
        except:
            pass

    def DisplayMainMenu(self):
        self.RemoveVideoIntro()
        self.Menu = None
        self.Menu = Meni(self, self.SinglePlayerMode, self.TwoPlayerMode,
                         self.HsFunkc, self.MainMenuHostClick,
                         self.MainMenuJoinClick, self.CloseWindow)

    def PauseGame(self):
        self.gamePaused = True
        self.updaterGameObjekataThread.PauseGame()

    def ResumeGame(self):
        self.gamePaused = False
        self.updaterGameObjekataThread.ResumeGame()

    def RemoveAllGameUIObjects(self):
        for lejer, lista in Rectangle.allRectangles.items():
            for rect in lista:
                rect.RemoveFromScreen()
        GameObject.allGameObjects = []
        Rectangle.allRectangles = {}
        Rectangle.ResetId()

    def SinglePlayerMode(self):
        self.ClearZeusQueue()
        self.Menu.HideMainMenu()
        self.DisplayMap(
        )  #u displayMap se kreira objekat self.updaterGameObjekataThread i zato DisplayMap mora ici prvi
        self.createThreadToUpdateGameObjects()
        self.startThreadForUpdatingGameObjects()
        self.scoreboard.ShowScore()
        self.CreatePlayers()
        Config.collectLilypadsToAdvanceLevel = 1

    def ClearZeusQueue(self):
        while not self.ZevsJavljaVremeQueue.empty():
            self.ZevsJavljaVremeQueue.get()

    def TwoPlayerMode(self, OverNetworkGame=False):
        self.ClearZeusQueue()
        self.Menu.HideMainMenu()
        if not OverNetworkGame:  #kad je preko mreze onda updateovanje krece kad klijent bude spreman
            self.createThreadToUpdateGameObjects()
            self.startThreadForUpdatingGameObjects()
        self.DisplayMap(TwoPlayers=True)
        self.scoreboard.ShowScores()
        self.CreatePlayers(TwoPlayers=True)
        Config.collectLilypadsToAdvanceLevel = 3

    def MainMenuHostClick(self):
        self.HostServer(Config.serverAddress, Config.serverPort)

    def MainMenuJoinClick(self):
        #self.Menu.JoinWidgetHide()
        self.setFocus()

        #ovde sacuvamo ip adresu i port u fajl. da kad se sledeci put upali igra da odma ucita tu ipadresu i port
        try:
            with open(Config.lastIp_filename, "w") as f:
                f.write(str(self.Menu.ipAddr) + ":" + str(self.Menu.port))
        except:
            pass

        self.JoinServer(self.Menu.ipAddr, int(self.Menu.port))

    def CreatePlayers(self, TwoPlayers=False):
        self.player1 = Frog(Config.player1StartPosition[0],
                            Config.player1StartPosition[1], self.GameOverCheck,
                            self.updateP1Score, self.createGreenLives)
        self.player1RectId = self.player1.id
        if TwoPlayers:
            self.player2 = Frog(Config.player2StartPosition[0],
                                Config.player2StartPosition[1],
                                self.GameOverCheck,
                                self.updateP2Score,
                                self.createPinkLives,
                                isPlayerTwo=True)
            self.player2RectId = self.player2.id

    def updateP1Score(self, newScore):
        self.scoreboard.updateP1Score(newScore)
        if self.isHost:
            self.host.SendToClient(Config.network_updateGameScoreAndLives +
                                   ":" + "P1S_" +
                                   str(newScore))  #P2L => Player 2 Lives

    def updateP2Score(self, newScore):
        self.scoreboard.updateP2Score(newScore)
        if self.isHost:
            self.host.SendToClient(Config.network_updateGameScoreAndLives +
                                   ":" + "P2S_" +
                                   str(newScore))  #P2L => Player 2 Lives

    def createPinkLives(self, lives):
        self.scoreboard.CreatePinkLives(lives)
        if self.isHost:
            self.host.SendToClient(Config.network_updateGameScoreAndLives +
                                   ":" + "P2L_" +
                                   str(lives))  #P2L => Player 2 Lives

    def createGreenLives(self, lives):
        self.scoreboard.CreateGreenLives(lives)
        if self.isHost:
            self.host.SendToClient(Config.network_updateGameScoreAndLives +
                                   ":" + "P1L_" +
                                   str(lives))  #P1L => Player 2 Lives

    def DisplayMap(self, TwoPlayers=False):
        self.Map.append(Lane.GenerateSafetyLane())  #prvi je uvek sejf lejn
        self.GenerateLanes('Road')  #fja da generise lejnove za put
        #self.Map.append(Lane.GenerateSafetyLane())
        ##ovaj ce da bude uvek tu da bi se moglo duze igrati
        ##lejn sa zivotom
        self.Map.append(Lane.GenerateSafetyLaneWithDeus())
        self.GenerateLanes('Water')  #fja da generise lejnove za reku
        if TwoPlayers:
            self.Map.append(Lane.GenerateFinalLane(
                self.LevelPassed))  # zadnji je uvek finalLane
        else:
            self.Map.append(
                Lane.GenerateFinalLane(
                    self.LevelPassed,
                    lilyPadPattern=Config.lilypadPatternBO5Standard)
            )  # zadnji je uvek finalLane

    def GameOverCheck(self, isPlayerTwo):
        #fja koja se poziva kada igrac ima 0 zivota, prosledjuje se igracima kroz konstruktor
        self.GameOverBrojac += 1
        if self.player1 != None and self.player2 != None:
            if self.GameOverBrojac == 1:
                if isPlayerTwo:
                    self.highscore.checkIfHighScore(self.player2.playerName,
                                                    self.player2.score)
                    self.player2.RemoveFromScreen()
                    self.player2 = None
                    Config.p2Lives = 0
                else:
                    self.highscore.checkIfHighScore(self.player1.playerName,
                                                    self.player1.score)
                    self.player1.RemoveFromScreen()
                    self.player1 = None
                    Config.p1Lives = 0
        elif self.player1 != None:
            self.highscore.checkIfHighScore(self.player1.playerName,
                                            self.player1.score)
            self.GameOver()
        elif self.player2 != None:
            self.highscore.checkIfHighScore(self.player2.playerName,
                                            self.player2.score)
            self.GameOver()

    def GameOver(self):
        # javimo klijentu da bi se vratio na meni
        if self.isHost:
            self.host.SendToClient(Config.network_ConnectionError)

        #fja koja se poziva kad su svi igraci igraci ostali bez zivota
        self.stopThreadForUpdatingObjects()
        self.DeleteMap(deleteP1=True, deleteP2=True)
        self.Menu.ShowMainMenu()
        Lane.ResetLaneStartingIndex()
        self.scoreboard.HideScores()
        self.Menu.kisa.hide()
        self.Menu.sneg.hide()
        self.scoreboard.CreateGreenLives(0)
        self.scoreboard.CreatePinkLives(0)

        self.InitFlagsAndVariables()

    def ShutDownHost(self):
        if self.host != None:
            print("gasim hosta")
            self.host.StopHosting()
            self.isHost = False
            self.host = None

    def ShutDownClient(self):
        if self.client != None:
            self.client.StopClienting()
            self.isClient = False
            self.client = None

    def LevelPassed(self):
        #fja koja se poziva kad su svih 5 Lilypada popunjena, prosledjuje se u konstruktoru, prvo finalLejnu pa samim objektima
        self.Level += 1
        Lane.ResetLaneStartingIndex()
        self.GameOverBrojac = 0
        self.DeleteMap()
        if self.player1 != None and self.player2 != None:
            Config.p1Score = self.player1.score
            Config.p2Score = self.player2.score
            Config.p1Lives = self.player1.lives
            Config.p2Lives = self.player2.lives
            self.DisplayMap(TwoPlayers=True)
            self.CreatePlayers(TwoPlayers=True)
        elif self.player1 != None:
            Config.p1Score = self.player1.score
            Config.p1Lives = self.player1.lives
            self.DisplayMap()
            self.CreatePlayers()
        elif self.player2 != None:
            Config.p2Score = self.player2.score
            Config.p2Lives = self.player2.lives
            self.DisplayMap()
            self.CreatePlayers(TwoPlayers=True)
            self.player1.RemoveFromScreen()
            self.player1 = None

        if self.isHost and self.player2 != None:
            self.SendClientToReplicateObjects()

    def DeleteMap(self, deleteP1=False, deleteP2=False):
        if deleteP1:
            try:
                self.player1.RemoveFromScreen()
                self.player1 = None
            except:
                print('P1 vec postavljen na None')

        if deleteP2:
            try:
                self.player2.RemoveFromScreen()
                self.player2 = None
            except:
                print('P2 vec postavljen na None')

        for lane in self.Map:
            for obs in lane.obstacles:
                obs.RemoveFromScreen()
            lane.obstacles.clear()
            lane.RemoveFromScreen()

        for layer, listOfRectanglesInLayer in Rectangle.allRectangles.items():
            for rect in listOfRectanglesInLayer:
                rect.RemoveFromScreen()
            listOfRectanglesInLayer.clear()

        self.Map.clear()

    def DisplayTestMap(self):
        Lane.ResetLaneStartingIndex()
        self.Map.append(Lane.GenerateSafetyLane())
        self.Map.append(Lane.GenerateEasyLane())
        self.Map.append(Lane.GenerateEasyLane())
        self.Map.append(Lane.GenerateEasyLane())
        self.Map.append(Lane.GenerateSafetyLane())
        self.Map.append(Lane.GenerateFinalLane())
        self.Map.append(
            Lane.GenerateFinalLane(lilyPadPattern=Config.lilypadPatternBO3))
        self.Map.append(
            Lane.GenerateFinalLane(lilyPadPattern=Config.lilypadPatternBO5V2))
        self.Map.append(Lane.GenerateFinalLane(randomPatternBO5=True))

    def keyPressEvent(self, event):
        if not event.isAutoRepeat():
            self.key_notifier.add_key(event.key())

    def __update_position__(self, key):
        if not self.isClient:
            if key == Qt.Key_Escape and self.gamePaused:
                self.ResumeGame()
            elif key == Qt.Key_Escape and not self.gamePaused:
                self.PauseGame()

        if self.isClient:  #ako sam klijent onda pored pomeranja zabe, hocu da posaljem INPUT serveru
            if key == Qt.Key_Right:
                self.client.SendToServer(Config.network_inputKlijentaPrefix +
                                         "DESNO")
            elif key == Qt.Key_Down:
                self.client.SendToServer(Config.network_inputKlijentaPrefix +
                                         "DOLE")
            elif key == Qt.Key_Up:
                self.client.SendToServer(Config.network_inputKlijentaPrefix +
                                         "GORE")
            elif key == Qt.Key_Left:
                self.client.SendToServer(Config.network_inputKlijentaPrefix +
                                         "LEVO")

        if key == Qt.Key_T:
            for go in GameObject.allGameObjects:
                print(str(go.id) + "__" + str(go.loadedSprite))

        if self.gamePaused:  #sve sto je ispod nece biti odradjeno kad je game pauziran
            return

        if self.player1 != None:
            self.player1.KeyPress(key)
        if self.player2 != None:
            self.player2.KeyPress(key)

    def CloseWindow(self):
        # OVDE TREBA DA SE POZOVE KOD KOJI CE DA ZAUSTAVI ZEVSA
        # (ako uopste postoji neko toliko jak da zaustavi zevsa)
        try:
            self.procUKomZiviZevs.terminate()
        except:
            pass

        try:
            self.updaterGameObjekataThread.updaterThreadWork = False  # self.updaterGameObjekataThread se kreira samo kad pocne IGRA. Ako budes na meniju i nista ne radis nece se kreirati
        except:
            pass
        self.key_notifier.die()

    def closeEvent(self, event):
        self.CloseWindow()

    def createThreadToUpdateGameObjects(self):
        self.updaterGameObjekataThread = GOUpdater()
        self.updaterGameObjekataThread.nekiObjekat.connect(
            self.updateAllGameObjects)

        #OVO (thread koji updateuje objekte) SE POKRECE KAD KLIJENT BUDE SPREMAN (nakon sto preuzme sve objekte i nacrta ih na ekranu), ili kad pocne neki od lokalnih game modova
        #self.updaterGameObjekataThread.start()

    def startThreadForUpdatingGameObjects(self):
        self.updaterGameObjekataThread.start()

    def stopThreadForUpdatingObjects(self):
        try:  #na klijentu ovaj objekat za updateovanje ce biti null
            self.updaterGameObjekataThread.updaterThreadWork = False
        except:
            pass

    def updateAllGameObjects(self, dummy):  #callback funkcija
        for gameObject in GameObject.allGameObjects:
            gameObject.update()

        # ako je instanca server i postoje gameobjekti onda da salje klijentu pozicije tih objekata
        if self.isHost and len(GameObject.allGameObjects) > 0:
            self.SendRectPositionUpdateToClient()

        if not self.ZevsJavljaVremeQueue.empty():
            self.updateWeather(self.ZevsJavljaVremeQueue.get())
        else:
            return

    def updateWeather(self, newWeather):
        if self.isHost:
            self.host.SendToClient(Config.network_updateWeatherInfo + ":" +
                                   newWeather)

        if newWeather == 'k':
            if self.previousWeather == 'k':
                self.ZaustaviKisu()
            elif self.previousWeather == 's':
                self.ZaustaviSneg()
            self.PokreniKisu()
        elif newWeather == 's':
            if self.previousWeather == 'k':
                self.ZaustaviKisu()
            elif self.previousWeather == 's':
                self.ZaustaviSneg()
            self.PokreniSneg()
        elif newWeather == 'n':
            if self.previousWeather == 'k':
                self.ZaustaviKisu()
            elif self.previousWeather == 's':
                self.ZaustaviSneg()

        self.previousWeather = newWeather

    def createLanes(self, niz, type):
        #funkcija koja generise lejnove u zavisnosti od prosledjenog niza i karaktera u njemu
        if type == 'Road':
            for letter in niz:
                if letter == 'e':
                    self.Map.append(Lane.GenerateEasyLane())
                elif letter == 'm':
                    self.Map.append(Lane.GenerateMediumLane())
                elif letter == 'h':
                    self.Map.append(Lane.GenerateHardLane())
        elif type == 'Water':
            for letter in niz:
                if letter == 'e':
                    self.Map.append(Lane.GenerateEasyWaterLane())
                elif letter == 'm':
                    self.Map.append(Lane.GenerateMediumWaterLane())
                elif letter == 'h':
                    self.Map.append(Lane.GenerateHardWaterLane())
        elif type == 'Random':
            for letter in niz:
                if letter == 's':  # safe lane
                    self.Map.append(Lane.GenerateSafetyLane())
                elif letter == 'e':  # easy lane, if generated -1 -> easyWaterLane if 1 easyTrafficLane, isto vazi za ostale samo se menja tezina s,m,h...
                    if [-1, 1][randrange(2)] == -1:
                        self.Map.append(Lane.GenerateEasyWaterLane())
                    else:
                        self.Map.append(Lane.GenerateEasyLane())
                elif letter == 'm':
                    if [-1, 1][randrange(2)] == -1:
                        self.Map.append(Lane.GenerateMediumWaterLane())
                    else:
                        self.Map.append(Lane.GenerateMediumLane())
                elif letter == 'h':
                    if [-1, 1][randrange(2)] == -1:
                        self.Map.append(Lane.GenerateHardWaterLane())
                    else:
                        self.Map.append(Lane.GenerateHardLane())

    def GenerateLanes(self, type):
        # 6 lejnova, fja u kojoj se odlucuje tezina po levelima, moze da se menja po volji
        nizTezine = []
        if self.Level <= 2:
            nizTezine.append('e')
            nizTezine.append('e')
            nizTezine.append('e')
            nizTezine.append('e')
            nizTezine.append('e')
            nizTezine.append('e')
        elif self.Level > 2 and self.Level <= 4:
            nizTezine.append('e')
            nizTezine.append('e')
            nizTezine.append('e')
            nizTezine.append('e')
            nizTezine.append('e')
            nizTezine.append('e')
            type = 'Random'
        elif self.Level > 4 and self.Level <= 6:
            nizTezine.append('e')
            nizTezine.append('e')
            nizTezine.append('e')
            nizTezine.append('m')
            nizTezine.append('m')
            nizTezine.append('m')
        elif self.Level > 6 and self.Level <= 8:
            nizTezine.append('e')
            nizTezine.append('e')
            nizTezine.append('e')
            nizTezine.append('m')
            nizTezine.append('m')
            nizTezine.append('m')
            type = 'Random'
        elif self.Level > 8 and self.Level <= 10:
            nizTezine.append('m')
            nizTezine.append('m')
            nizTezine.append('m')
            nizTezine.append('m')
            nizTezine.append('m')
            nizTezine.append('m')
        elif self.Level > 10 and self.Level <= 12:
            nizTezine.append('m')
            nizTezine.append('m')
            nizTezine.append('m')
            nizTezine.append('m')
            nizTezine.append('m')
            nizTezine.append('m')
            type = 'Random'
        elif self.Level > 12 and self.Level <= 14:
            nizTezine.append('m')
            nizTezine.append('m')
            nizTezine.append('m')
            nizTezine.append('h')
            nizTezine.append('h')
            nizTezine.append('h')
        elif self.Level > 12 and self.Level <= 14:
            nizTezine.append('m')
            nizTezine.append('m')
            nizTezine.append('m')
            nizTezine.append('h')
            nizTezine.append('h')
            nizTezine.append('h')
            type = 'Random'
        elif self.Level > 14 and self.Level <= 16:
            nizTezine.append('h')
            nizTezine.append('h')
            nizTezine.append('h')
            nizTezine.append('h')
            nizTezine.append('h')
            nizTezine.append('h')
        elif self.Level > 16:
            nizTezine.append('h')
            nizTezine.append('h')
            nizTezine.append('h')
            nizTezine.append('h')
            nizTezine.append('h')
            nizTezine.append('h')
            type = 'Random'

        shuffle(nizTezine)  #permutuj niz da lejnovi budu random
        self.createLanes(nizTezine, type)

    def PokreniKisu(self):  #Fja da se prikaze kisa
        self.Menu.PrikaziPadavinu('kisa')
        for lane in self.Map:
            if lane.laneType == Config.laneTypeWater:
                lane.ChangeSpeed(
                    Config.speedChange)  #brzina drveca se povecava kad je kisa
            elif lane.laneType == Config.laneTypeTraffic or lane.laneType == Config.laneTypeTrafficTop or lane.laneType == Config.laneTypeTrafficBottom:
                lane.ChangeSpeed(-Config.speedChange
                                 )  #brzina automobila se smanjuje kad je kisa

    def PokreniSneg(self):  #Fja da se prikaze sneg
        self.Menu.PrikaziPadavinu('sneg')
        for lane in self.Map:
            if lane.laneType == Config.laneTypeWater:
                lane.ChangeSpeed(-Config.speedChange
                                 )  #brzina drveca se smanjuje kad je sneg
            elif lane.laneType == Config.laneTypeTraffic or lane.laneType == Config.laneTypeTrafficTop or lane.laneType == Config.laneTypeTrafficBottom:
                lane.ChangeSpeed(Config.speedChange
                                 )  #brzina automobila se povecava kad je sneg

    def ZaustaviKisu(self):  #Fja da se zaustavi kisa
        self.Menu.SakrijPadavinu('kisa')
        for lane in self.Map:
            if lane.laneType == Config.laneTypeWater:
                lane.ChangeSpeed(
                    -Config.speedChange
                )  #obrnuto, ako smo bili povecali brzinu drveca kad je kisa pocela, sad je smanjujemo, vracamo na default
            elif lane.laneType == Config.laneTypeTraffic or lane.laneType == Config.laneTypeTrafficTop or lane.laneType == Config.laneTypeTrafficBottom:
                lane.ChangeSpeed(
                    Config.speedChange
                )  #obrnuto, ako smo bili smanjili brzinu automobila kad je kisa pocela, sad je povecavamo, vracamo na default

    def ZaustaviSneg(self):  #Fja da se zaustavi sneg
        self.Menu.SakrijPadavinu('sneg')
        for lane in self.Map:
            if lane.laneType == Config.laneTypeWater:
                lane.ChangeSpeed(
                    Config.speedChange
                )  #obrnuto, ako smo bili smanjili brzinu drveca kad je poceo sneg, sad je povecavamo, vracamo na default
            elif lane.laneType == Config.laneTypeTraffic or lane.laneType == Config.laneTypeTrafficTop or lane.laneType == Config.laneTypeTrafficBottom:
                lane.ChangeSpeed(
                    -Config.speedChange
                )  #obrnuto, ako smo bili povecali brzinu automobila kad je poceo sneg, sad je smanjujemo, vracamo na default

    ################################################################################
    #FUNKCIJE ISPOD SE KORISTE SAMO ZA MULITPLAYER
    ################################################################################

    def HostServer(self, address, port):
        self.isHost = True
        self.host = Host(address, port)
        self.host.receiveCallBack.connect(self.ReceiveFromClient)
        self.host.start()

    def JoinServer(self, address, port):
        self.isClient = True
        self.client = Client(address, port)
        self.client.receiveCallBack.connect(self.ReceiveFromServer)
        self.client.start()

    def SendClientToReplicateObjects(self):
        self.host.SendToClient(Config.network_kreirajSveObjekteNaKlijentu +
                               ":" + self.CreateInitObjectsString())

    # ovo ce biti pozvano kad server primi poruku od klijenta
    def ReceiveFromClient(self, data):
        # print("Primio od klijenta: " + str(data))
        if data == Config.network_clientIsReady:  # kad primi ovo znaci da se klijent povezao
            self.TwoPlayerMode(OverNetworkGame=True)
            self.player2.keyBoardInputEnabled = False
            self.SendClientToReplicateObjects(
            )  #da ne generise updater svaki put kad se predje level, vec samo incijalno kad se uspostavi veza
        elif data == Config.network_potvrdaKlijentaDaJeNapravioSveObjekte and self.Level == 1:  # klijent je potvrdio da je napravio sve objekte i sad pokrecemo igru (pravimo i pokrecemo thread koji updateuje igru)
            self.createThreadToUpdateGameObjects()
            self.startThreadForUpdatingGameObjects()
        elif Config.network_inputKlijentaPrefix in data and self.player2 != None:  #ovo da li je igrac razlicit od None je ustvari provera da li je ziv
            if Config.network_inputKlijentaPrefix + "DESNO" == data:
                self.player2.GoRight()
            elif Config.network_inputKlijentaPrefix + "DOLE" == data:
                self.player2.GoDown()
            elif Config.network_inputKlijentaPrefix + "GORE" == data:
                self.player2.GoUp()
            elif Config.network_inputKlijentaPrefix + "LEVO" == data:
                self.player2.GoLeft()
        elif Config.network_ConnectionError == data:
            print("Klijent je otiso :(")
            self.ResetGameStateOnError()

    # ovo ce biti pozvano kad klijent primi poruku od servera
    def ReceiveFromServer(self, data):
        #print("Primio od servera: " + str(data))
        if data == Config.network_serverWelcomeMsg:  # znaci da smo se uspesno povezali sa serverom i inicijalizujemo gejm
            self.InitNetworkGame()
        elif Config.network_kreirajSveObjekteNaKlijentu in data:
            self.GenerateObjects(data.split(":")[1])
            self.client.SendToServer(
                Config.network_potvrdaKlijentaDaJeNapravioSveObjekte)
        elif Config.network_updateSveObjekteNaKlijentu in data:
            self.UpdateObjectsPosition(data.split(":")[1])
        elif Config.network_updateGameScoreAndLives in data:
            #ako ovde udje PAYLOAD moze da izgleda ovako:
            #P2L_3
            #P1S_2
            #P2S_4
            #P1L_1
            payload = data.split(":")[1]
            player, scoreOrLives = payload.split('_')
            #print(str(payload))
            if "P1" in player:
                if "S" in player:
                    self.updateP1Score(scoreOrLives)
                elif "L" in player:
                    self.createGreenLives(int(scoreOrLives))
            elif "P2" in player:
                if "S" in player:
                    self.updateP2Score(scoreOrLives)
                elif "L" in player:
                    self.createPinkLives(int(scoreOrLives))

        elif Config.network_updateWeatherInfo in data:
            self.updateWeather(data.split(":")[1])
        elif Config.network_ConnectionError == data:
            self.ResetGameStateOnError()

    #ovo se poziva na klijentu.
    def InitNetworkGame(self):
        self.TwoPlayerMode(
            OverNetworkGame=True
        )  #nije potrebno ovo True, al da se dzabe nebi pravio thread koji se ne koristi :D

        #sklanjamo sve objekte, jer ce nam server poslati sta je on generisao (velicine, pozicije, sprajtove)
        for go in GameObject.allGameObjects:
            go.RemoveFromScreen()
        GameObject.allGameObjects.clear()
        #klijent javi serveru da je spreman (spreman da primi podatke o svim objektima)
        self.client.SendToServer(Config.network_clientIsReady)

    #poziva se ako dodje do greske prilikom komunikacije sa klijentom
    def ResetGameStateOnError(self):
        self.RemoveAllGameUIObjects()
        self.GameOver()

    #poziva se samo na serveru
    def SendRectPositionUpdateToClient(self):
        self.host.SendToClient(Config.network_updateSveObjekteNaKlijentu +
                               ":" + self.CreateUpdateObjectsString())

    #ova metoda moze ici u GameObject Klasu
    def CreateInitObjectsString(self):
        objektiUString = []
        for go in GameObject.allGameObjects:  #saljemo podatke koji su potrebni da bi se napravili objekti na klijentu
            objektiUString.append(
                str(go.id) + "%" + go.loadedSprite + "%" + str(go.x) + "%" +
                str(go.y) + "%" + str(go.w) + "%" + str(go.h))
        return "#".join(objektiUString)

    # ova metoda moze ici u GameObject Klasu
    def CreateUpdateObjectsString(self):
        objektiUString = []
        for go in GameObject.allGameObjects:  #saljemo podatke koji su potrebni da bi se updateovale pozicije objekata na klijentu

            #optimizovano, ne saljem update za sve gameObjecte vec samo one koji su u lejeru prepreke i imaju neku brzinu
            if go.layer == Config.layerPrepreke and go.speed != 0:
                objektiUString.append(
                    str(go.id) + "%" + str(go.x) + "%" + str(go.y))
            elif go.layer == Config.layerZabe or go.layer == Config.layerLilypad:  #igraci i lokvanji mogu da promene sprite i zato saljem i sprite :D
                objektiUString.append(
                    str(go.id) + "%" + str(go.x) + "%" + str(go.y) + "%" +
                    str(go.loadedSprite))

        # ovo je dodato ako neki od igraca umre da ga klijent skloni sa ekrana (sprite se stavi na prazan string)
        if self.player1 == None and self.player1RectId != -1:
            objektiUString.append(
                str(self.player1RectId) + "%" + str(0) + "%" + str(0) +
                "%DEAD")
            self.player1RectId = -1
        if self.player2 == None and self.player2RectId != -1:
            objektiUString.append(
                str(self.player2RectId) + "%" + str(0) + "%" + str(0) +
                "%DEAD")
            self.player2RectId = -1

        return "#".join(objektiUString)

    #ova funkcija se poziva na klijentu, da napravi objekte iste kao sto su na serveru. Pozove se samo na pocetku
    def GenerateObjects(self, data):
        for layer, listOfRects in Rectangle.allRectangles.items():
            for rect in listOfRects:
                rect.RemoveFromScreen()
            listOfRects.clear()

        objs = data.split("#")
        Rectangle.ResetId()
        for obj in objs:
            objData = obj.split("%")
            r = Rectangle(float(objData[2]),
                          float(objData[3]),
                          int(objData[4]),
                          int(objData[5]),
                          objData[1],
                          layer=objData[0],
                          forceId=int(objData[0]))
            r.Show()

    #ova funkcija se poziva na klijentu, sluzi za updateovanje (samo X i Y kordinate) svih rectanglova na klijentu.
    #server ce ovo slati klijentu svaki frejm (30 puta u sekundi)
    def UpdateObjectsPosition(self, data):
        objs = data.split("#")
        dictObj = {}
        for obj in objs:
            objData = obj.split("%")

            if len(objData) == 4:
                dictObj[objData[0]] = (float(objData[1]), float(objData[2]),
                                       objData[3])
            elif len(objData) == 3:
                dictObj[objData[0]] = (float(objData[1]), float(objData[2]))

        for go in GameObject.allGameObjects:
            strId = str(go.id)
            if strId in dictObj.keys():
                go.SetPosition(dictObj[strId][0], dictObj[strId][1])
                if len(dictObj[strId]
                       ) == 3:  #ako je 3 znaci da imamo i sprite poslat
                    go.ChangeSprite(dictObj[strId][2])
예제 #7
0
class Final(QWidget):
    def __init__(self):
        super().__init__()

        self.setGeometry(0, 0, w, h)
        self.backgroundImage = QLabel(self)
        self.textBubble = QLabel(self)
        self.previousButton = QPushButton(self)
        self.nextButton = QPushButton(self)
        self.textField = QLabel(self)
        # self.video = VideoPlayer(self)
        self.inputPassword = QLineEdit(self)
        self.checkButton = QPushButton('QED', self)
        self.initWindow()

        self.show()

    def initWindow(self):
        pixmap = QPixmap(
            resource_path("./images/examen3/merceClasse2.JPG")).scaled(w, h)
        self.backgroundImage.setPixmap(pixmap)

        self.previousButton.move(0.12 * w, 0.83 * h)
        self.previousButton.setIcon(
            QIcon(resource_path('./images/icons/previous.png')))
        self.previousButton.setStyleSheet(
            "QPushButton{background: transparent;}")
        self.previousButton.hide()

        bubblePM = QPixmap(resource_path("./images/icons/textBubble.png"))
        self.textBubble.setPixmap(bubblePM)
        self.textBubble.move(0.1 * w, 0.75 * h)

        self.textField.setText(
            '''<p> - I la resposta és... 432! Doncs crec que ja ho tindríem, primer exercici... segon exercici... i tercer! Tots acabats i en fulls separats, crec que va sent hora d'entregar aquest examen d'aquesta assignatura de merda, per fi me'n puc desfer, per fi podré no gastar l'hora i mitja de dilluns i divendres que els meus solidaris companys feien servir per restregar-me lo bé que s'ho passaven fent birres al bar. I tot això? Per a què? Per a que acabin traient la mateixa nota que jo, o millor? N'estic fart. <b> ( Silenci ) </b> Hola Morsè, et vinc a entregar el final de la millor assignatura que he fet en la meva vida, gràcies per tot.</p>'''
        )
        self.textField.setAlignment(Qt.AlignJustify)
        self.textField.setWordWrap(True)
        self.textField.resize(600, 200)
        self.textField.move(0.167 * w, 0.76 * h)
        self.textField.show()

        self.inputPassword.setGeometry(0.2 * w, 0.83 * h, 0.2 * w, 0.04 * h)
        self.inputPassword.setMaxLength(20)
        self.inputPassword.setFrame(False)
        self.inputPassword.hide()

        self.checkButton.move(0.45 * w, 0.83 * h)
        self.checkButton.clicked.connect(self.checkAnswerSecondExercise)
        self.checkButton.hide()

        self.nextButton.move(0.85 * w, 0.83 * h)
        self.nextButton.setIcon(QIcon(
            resource_path('./images/icons/next.png')))
        self.nextButton.setStyleSheet("QPushButton{background: transparent;}")
        try:
            self.nextButton.clicked.disconnect()
            self.textBubble.show()
            self.textField.show()
            self.nextButton.show()
        except:
            pass

        self.nextButton.clicked.connect(self.finalFirst)

        # self.video.resize(w, h)
        # self.video.hide()

        self.hide()
        self.show()

    def finalFirst(self):
        self.textField.setText(
            '''<p> <b> Morsè Oller: </b> . ... -.-. --- .-.. - .-  -. --- ..  -. ---  .... .- ...  .--. --- ... .- -  .-. . ...  .-  .-.. ·----· .- .--. .- .-. - .- -  -.. ·----· .- ... ... .. --. -. .- - ..- .-. .- <br> - Que no he posat res a l'apartat d'assignatura?! (M'ha enxampat) És que... com t'explico això Morsè... resulta que aquesta part no me l'he pogut estudiar, tenia pensat fer-ho avui al matí però... al final m'he liat (toma aresta) i no he pogut... No tindries pas una pista per ajudar-me? De quina assignatura estem parlant?</p>'''
        )
        self.textField.setAlignment(Qt.AlignJustify)
        self.textField.setWordWrap(True)
        self.textField.resize(600, 200)
        self.textField.move(0.167 * w, 0.78 * h)

        try:
            self.previousButton.clicked.disconnect()
        except:
            pass

        self.previousButton.clicked.connect(self.initWindow)

        self.nextButton.clicked.disconnect()
        self.nextButton.clicked.connect(self.videoFinal)

    def videoFinal(self):
        self.nextButton.hide()

        self.mediaPlayer = QMediaPlayer(None, QMediaPlayer.VideoSurface)

        self.videoWidget = QVideoWidget(self)
        self.mediaPlayer.setVideoOutput(self.videoWidget)
        self.mediaPlayer.setMedia(QMediaContent(QUrl.fromLocalFile(path)))

        self.videoWidget.show()
        self.videoWidget.resize(w, h)

        self.textField.hide()
        self.textBubble.hide()
        self.backgroundImage.hide()

        self.nextNewButton = QPushButton(self)
        self.nextNewButton.setStyleSheet(
            "QPushButton{background-color: white;}")
        # self.nextNewButton.setStyleSheet("QPushButton{background: transparent;}")
        self.nextNewButton.move(0.85 * w, 0.83 * h)
        self.nextNewButton.setIcon(
            QIcon(resource_path('./images/icons/next.png')))
        self.nextNewButton.show()

        self.mediaPlayer.play()

        # self.video.show()

        try:
            self.nextNewButton.clicked.disconnect()
        except:
            pass

        self.nextNewButton.clicked.connect(self.finalAnswer)

    def finalAnswer(self):
        self.nextNewButton.hide()
        self.videoWidget.hide()
        self.textField.setText(
            '''<p> - Finalment, de quina assignatura ha sigut l'examen que has fet avui? </p>'''
        )
        self.textField.setAlignment(Qt.AlignJustify)
        self.textField.setWordWrap(True)
        self.textField.resize(600, 200)
        self.textField.move(0.167 * w, 0.78 * h)

        self.inputPassword.show()
        self.checkButton.show()

        self.textField.show()
        self.textBubble.show()

    def checkAnswerSecondExercise(self):
        self.finalFinal = FinalFinal()
        self.close()
예제 #8
0
파일: tomarFoto.py 프로젝트: ykv001/PyQt5
class Widgets(QWidget):
    def __init__(self, dispositivoCamara, parent=None):
        super(Widgets, self).__init__(parent)

        self.parent = parent

        self.estadoFoto = False
        self.byteArrayFoto = QByteArray()

        # ==========================================================

        frame = QFrame(self)
        frame.setFrameShape(QFrame.Box)
        frame.setFrameShadow(QFrame.Sunken)
        frame.setFixedWidth(505)
        frame.setFixedHeight(380)
        frame.move(10, 10)

        # Instancias
        self.paginaVisor = QVideoWidget()
        self.paginaVisor.resize(500, 375)

        self.visor = QCameraViewfinder(self.paginaVisor)
        self.visor.resize(500, 375)

        self.labelFoto = QLabel()
        self.labelFoto.setAlignment(Qt.AlignCenter)
        self.labelFoto.resize(500, 375)

        # QStackedWidget
        self.stackedWidget = QStackedWidget(frame)
        self.stackedWidget.addWidget(self.paginaVisor)
        self.stackedWidget.addWidget(self.labelFoto)
        self.stackedWidget.resize(500, 375)
        self.stackedWidget.move(2, 2)

        # ======================== BOTONES =========================

        self.buttonTomarFoto = QPushButton("Tomar foto", self)
        self.buttonTomarFoto.resize(110, 26)
        self.buttonTomarFoto.move(525, 10)

        self.buttonEliminarFoto = QPushButton("Eliminar foto", self)
        self.buttonEliminarFoto.resize(110, 26)
        self.buttonEliminarFoto.move(525, 50)

        self.buttonGuardarFoto = QPushButton("Guardar foto", self)
        self.buttonGuardarFoto.resize(110, 26)
        self.buttonGuardarFoto.move(525, 82)

        # ======================== EVENTOS =========================

        self.buttonTomarFoto.clicked.connect(self.tomarFoto)
        self.buttonEliminarFoto.clicked.connect(self.eliminarFoto)
        self.buttonGuardarFoto.clicked.connect(self.guardarFoto)

        # ================== FUNCIONES AUTOMÁTICAS =================

        self.setCamara(dispositivoCamara)

# ======================= FUNCIONES ============================

    def setCamara(self, dispositivoCamara):
        if dispositivoCamara.isEmpty():
            self.camara = QCamera()
        else:
            self.camara = QCamera(dispositivoCamara)

        self.camara.stateChanged.connect(self.actualizarEstadoCamara)

        self.capturaImagen = QCameraImageCapture(self.camara)

        self.camara.setViewfinder(self.visor)

        self.actualizarEstadoCamara(self.camara.state())

        self.capturaImagen.imageCaptured.connect(self.procesarImagenCapturada)
        self.capturaImagen.imageSaved.connect(self.imagenGuardada)

        self.camara.isCaptureModeSupported(QCamera.CaptureStillImage)

        self.camara.start()

        self.paginaVisor.update()

    def actualizarDispositivoCamara(self, action):
        self.setCamara(action.data())

    def actualizarEstadoCamara(self, estado):
        if estado == QCamera.ActiveState:
            self.parent.accionIniciarCamara.setEnabled(False)
            self.parent.accionDetenerCamara.setEnabled(True)

            if not self.estadoFoto:
                self.buttonTomarFoto.setEnabled(True)
                self.buttonEliminarFoto.setEnabled(False)
                self.buttonGuardarFoto.setEnabled(False)
        elif estado in (QCamera.UnloadedState, QCamera.LoadedState):
            self.parent.accionIniciarCamara.setEnabled(True)
            self.parent.accionDetenerCamara.setEnabled(False)

            if not self.estadoFoto:
                self.buttonTomarFoto.setEnabled(False)
                self.buttonEliminarFoto.setEnabled(False)
                self.buttonGuardarFoto.setEnabled(False)

    def iniciarCamara(self):
        self.camara.start()

    def detenerCamara(self):
        self.camara.stop()

    def tomarFoto(self):
        rutaFoto = "{}/fotoTemporal.jpg".format(getcwd())
        self.capturaImagen.capture(rutaFoto)

        self.estadoFoto = True

    def procesarImagenCapturada(self, requestId, imagen):
        foto = QPixmap.fromImage(imagen)

        buffer = QBuffer(self.byteArrayFoto)
        buffer.open(QIODevice.WriteOnly)
        buffer.close()
        foto.save(buffer, "PNG")

        fotoEscalada = foto.scaled(self.labelFoto.size())

        self.labelFoto.setPixmap(fotoEscalada)
        self.mostrarImagenCapturada()

    def visualizarVisor(self):
        self.stackedWidget.setCurrentIndex(0)

    def mostrarImagenCapturada(self):
        self.stackedWidget.setCurrentIndex(1)

        self.buttonTomarFoto.setEnabled(False)
        self.buttonEliminarFoto.setEnabled(True)
        self.buttonGuardarFoto.setEnabled(True)

    def imagenGuardada(self, id, nombreFoto):
        if QFile.exists(nombreFoto):
            remove(nombreFoto)

    def eliminarFoto(self):
        self.estadoFoto = False
        self.byteArrayFoto.clear()

        self.labelFoto.clear()

        self.actualizarEstadoCamara(self.camara.state())
        self.visualizarVisor()

    def guardarFoto(self):
        guardarComo, extension = QFileDialog.getSaveFileName(
            self,
            "Guardar como",
            "Foto",
            "JPG (*.jpg);;PNG (*.png);;ICO (*.ico);;BMP (*.bmp)",
            options=QFileDialog.Options())

        if guardarComo:
            foto = QPixmap()
            foto.loadFromData(self.byteArrayFoto, "PNG", Qt.AutoColor)
            foto.save(guardarComo, quality=100)

            QMessageBox.information(
                self, "Guardar foto",
                "Foto guardada con éxito                                 ")

            self.eliminarFoto()
예제 #9
0
class Ui_selectVideo(object):
    def openFtoAWindow(self):
        self.Window = QtWidgets.QWidget()
        self.ui = addFaceToAnalyze.AFTA_Ui_Form()
        self.ui.setupUi(self.Window)
        self.ui.getVideo(video=self.video)
        self.Window.show()
        self.widget.hide()

    def getVideo(self):
        options = QFileDialog.Options()
        options |= QFileDialog.DontUseNativeDialog
        fileName, _ = QFileDialog.getOpenFileName(None,
                                                  "Select Video",
                                                  options=options)
        if fileName:
            '''vidcap = cv2.VideoCapture(fileName)
            total = int(vidcap.get(cv2.CAP_PROP_FRAME_COUNT))
            num = total/2
            vidcap.set(cv2.CAP_PROP_POS_MSEC,num)
            success,image = vidcap.read()'''
            shortenedFileName = self.getShortenedFilename(fileName)
            self.movieImageLabel.setPixmap(QtGui.QPixmap())
            self.movieImageLabel.clear()
            self.movieImageLabel.setGeometry(QtCore.QRect(140, 240, 201, 201))
            self.movieImageLabel.setStyleSheet("border: 1px solid black;")
            self.movieImageLabel.setAlignment(QtCore.Qt.AlignCenter)
            font = QtGui.QFont()
            font.setPointSize(20)
            self.movieImageLabel.setFont(font)
            self.movieImageLabel.setText(shortenedFileName)
            self.pushButton_2.setEnabled(True)
            self.video = fileName

    def getShortenedFilename(self, filename):
        temp = ""
        i = len(filename) - 1
        while i > 0:
            if (filename[i] == '/' or filename[i] == '\\'):
                return temp
            temp = filename[i] + temp
            i -= 1

        return temp

    def setupUi(self, selectVideo):
        selectVideo.setObjectName("selectVideo")
        selectVideo.resize(508, 584)
        self.label = QtWidgets.QLabel(selectVideo)
        self.label.setGeometry(QtCore.QRect(90, 40, 331, 61))
        font = QtGui.QFont()
        font.setPointSize(24)
        self.label.setFont(font)
        self.label.setAlignment(QtCore.Qt.AlignCenter)
        self.label.setObjectName("label")
        self.pushButton = QtWidgets.QPushButton(selectVideo)
        self.pushButton.setGeometry(QtCore.QRect(140, 160, 201, 41))
        self.pushButton.setObjectName("pushButton")
        self.pushButton.clicked.connect(self.getVideo)
        self.pushButton_2 = QtWidgets.QPushButton(selectVideo)
        self.pushButton_2.setGeometry(QtCore.QRect(140, 490, 201, 41))
        self.pushButton_2.setCheckable(False)
        self.pushButton_2.setObjectName("pushButton_2")
        self.pushButton_2.clicked.connect(self.openFtoAWindow)
        self.pushButton_2.setEnabled(False)
        self.movieImageLabel = QtWidgets.QLabel(selectVideo)
        self.movieImageLabel.setGeometry(QtCore.QRect(160, 240, 211, 201))
        self.movieImageLabel.setText("")
        self.movieImageLabel.setPixmap(QtGui.QPixmap("../camera.jpg"))
        self.movieImageLabel.setObjectName("movieImageLabel")

        self.video = QVideoWidget()
        self.video.resize(300, 300)
        self.video.move(0, 0)
        self.player = QMediaPlayer()
        self.player.setVideoOutput(self.video)

        self.retranslateUi(selectVideo)
        QtCore.QMetaObject.connectSlotsByName(selectVideo)
        self.widget = selectVideo

    def retranslateUi(self, selectVideo):
        _translate = QtCore.QCoreApplication.translate
        selectVideo.setWindowTitle(_translate("selectVideo", "Form"))
        self.label.setText(_translate("selectVideo", "Select a video"))
        self.pushButton.setText(_translate("selectVideo", "Select"))
        self.pushButton_2.setText(_translate("selectVideo", "Continue"))
예제 #10
0
class Ui_MainWindow(object):

    def __init__(self):
        self.timer_thread = TimerThread()
        self.timer_thread.update_signal.connect(self.update_lcd)

        self.rpi = revpimodio2.RevPiModIO(autorefresh=True)
        self.rpi.handlesignalend(self.cleanup_revpi)
        self.rpi.io.I_1.reg_event(toggle_input, prefire=True)
        self.rpi.io.I_1.reg_event(self.send_toggle_signal)

    def setup_ui(self, MainWindow):
        MainWindow.setObjectName("KnockOutMachine")

        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")

        self.main_picture = QtWidgets.QLabel(self.centralwidget)
        self.pixmap = QtGui.QPixmap("display/main_menu.png")
        self.scaledPixmap = self.pixmap.scaled(900, 900, QtCore.Qt.KeepAspectRatio)
        self.main_picture.setPixmap(self.scaledPixmap)

        self.pictures = QtWidgets.QLabel()
        self.pictures.setObjectName("pictures")
        self.pictures.setAlignment(QtCore.Qt.AlignCenter)
        self.pictures.setMinimumSize(500, 500)
        self.pictures.hide()

        self.player = QtMultimedia.QMediaPlayer(None, QMediaPlayer.VideoSurface)

        self.video_frame = QVideoWidget()
        self.video_frame.resize(960, 540)
        self.video_frame.hide()

        palette = QtGui.QPalette()
        palette.setColor(QtGui.QPalette.Text, QtCore.Qt.white)
        mfont = QtGui.QFont("Times", 80, QtGui.QFont.Bold)
        self.messages = QtWidgets.QLineEdit(self.centralwidget)
        self.messages.setObjectName("messages")
        self.messages.setAlignment(QtCore.Qt.AlignCenter)
        self.messages.setPalette(palette)
        self.messages.setReadOnly(True)
        self.messages.setFont(mfont)
        self.messages.setFixedSize(1400, 200)
        self.messages.hide()

        self.model = QtGui.QStandardItemModel(self.centralwidget)
        tableFont = QtGui.QFont("Times", 16)
        self.tableview = QtWidgets.QTableView(self.centralwidget)
        self.tableview.setObjectName("tableView")
        self.tableview.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustToContents)
        self.tableview.setMaximumWidth(500)
        self.tableview.setMaximumHeight(900)
        self.tableview.verticalHeader().setDefaultSectionSize(85)
        self.tableview.horizontalHeader().setSectionResizeMode(QtWidgets.QHeaderView.ResizeToContents)
        self.tableview.setFont(tableFont)
        self.tableview.setModel(self.model)
        self.tableview.hide()

        self.input_window = QtWidgets.QWidget()
        self.input_window.setWindowTitle("Bitte Namen eingeben")
        self.input_window.resize(300, 100)
        self.input_window.move(850, 820)
        # self.input_window.setWindowFlags(
        #     QtCore.Qt.Window | QtCore.Qt.CustomizeWindowHint | QtCore.Qt.WindowStaysOnTopHint)
        self.input_window.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint)

        self.input_layout = QtWidgets.QFormLayout()

        self.input_dialogue = QtWidgets.QLineEdit(self.centralwidget)
        self.input_dialogue.setMaxLength(30)

        buttonFont = QtGui.QFont("Times", 16, QtGui.QFont.Bold)
        self.startButton = QtWidgets.QPushButton(self.centralwidget)
        self.startButton.setFixedSize(191, 71)
        self.startButton.setFont(buttonFont)
        self.startButton.setObjectName("startButton")
        self.startButton.clicked.connect(lambda: self.on_start_button_clicked())

        self.inputButton = QtWidgets.QPushButton(self.centralwidget)
        self.inputButton.setObjectName("inputButton")
        self.inputButton.resize(self.inputButton.sizeHint())
        self.inputButton.setDisabled(True)

        self.highscoreButton = QtWidgets.QPushButton(self.centralwidget)
        self.highscoreButton.setFont(buttonFont)
        self.highscoreButton.setObjectName("highscoreButton")
        self.highscoreButton.setFixedSize(191, 71)
        self.highscoreButton.clicked.connect(lambda: self.on_high_score_button_clicked())

        self.cancelTimerButton = QtWidgets.QPushButton(self.centralwidget)
        self.cancelTimerButton.setFont(buttonFont)
        self.cancelTimerButton.setObjectName("cancelTimerButton")
        self.cancelTimerButton.setFixedSize(191, 71)
        self.cancelTimerButton.clicked.connect(lambda: self.exit_timer_function())
        self.cancelTimerButton.hide()

        self.cancelScoreButton = QtWidgets.QPushButton(self.centralwidget)
        self.cancelScoreButton.setFont(buttonFont)
        self.cancelScoreButton.setObjectName("cancelScoreButton")
        self.cancelScoreButton.setFixedSize(191, 71)
        self.cancelScoreButton.clicked.connect(lambda: self.exit_score_function())
        self.cancelScoreButton.hide()

        self.lcdCounter = QtWidgets.QLCDNumber(self.centralwidget)
        self.lcdCounter.setEnabled(False)
        self.lcdPalette = self.lcdCounter.palette()
        self.lcdCounter.setFixedSize(1350, 750)
        self.lcdCounter.setSmallDecimalPoint(False)
        self.lcdCounter.setDigitCount(5)
        self.lcdCounter.setObjectName("lcdCounter")
        self.lcdCounter.display("00.00")
        self.lcdCounter.hide()

        self.glass_not_set_timer, self.glass_set_timer = QtCore.QTimer(), QtCore.QTimer()

        self.glass_set_timer.setSingleShot(True)
        self.glass_set_timer.setInterval(100)
        self.glass_set_timer.timeout.connect(self.glass_set)

        self.glass_not_set_timer.setSingleShot(True)
        self.glass_not_set_timer.setInterval(100)
        self.glass_not_set_timer.timeout.connect(self.glass_not_set)

        self.vboxPictures = QtWidgets.QVBoxLayout()
        self.vboxPictures.addWidget(self.main_picture, 0, QtCore.Qt.AlignCenter)
        self.vboxPictures.addWidget(self.lcdCounter, 0, QtCore.Qt.AlignCenter)
        self.vboxPictures.addWidget(self.messages, 0, QtCore.Qt.AlignCenter)
        self.vboxPictures.addWidget(self.pictures, 1)
        self.vboxPictures.addWidget(self.video_frame, 0, QtCore.Qt.AlignCenter)
        self.vboxPictures.addWidget(self.tableview, 0, QtCore.Qt.AlignCenter)

        self.hboxButtons = QtWidgets.QHBoxLayout()
        self.hboxButtons.addWidget(self.startButton)
        self.hboxButtons.addWidget(self.highscoreButton)
        self.hboxButtons.addWidget(self.cancelTimerButton)
        self.hboxButtons.addWidget(self.cancelScoreButton)

        self.input_layout.addRow("", self.input_dialogue)
        self.input_layout.addRow("", self.inputButton)
        self.input_window.setLayout(self.input_layout)

        self.vbox = QtWidgets.QVBoxLayout()
        self.vbox.addLayout(self.vboxPictures)
        self.vbox.addStretch(1)
        self.vbox.addLayout(self.hboxButtons)
        self.vbox.addStretch(1)

        self.input_dialogue.textChanged.connect(self.enable_input_button)
        self.input_dialogue.returnPressed.connect(self.inputButton.click)
        self.inputButton.clicked.connect(lambda: self.update_scores(self.input_dialogue.text(), runTime))
        self.inputButton.clicked.connect(lambda: self.input_window.close())
        self.inputButton.clicked.connect(lambda: self.exit_timer_function())
        self.centralwidget.setLayout(self.vbox)
        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        locale.setlocale(locale.LC_ALL, '')

        self.retranslate_ui(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslate_ui(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("KnockOutMachine", "KnockOutMachine"))
        MainWindow.showFullScreen()
        MainWindow.setStyleSheet("background-color: #113f0c;")

        self.startButton.setText(_translate("KnockOutMachine", "Messung starten"))
        self.startButton.setStyleSheet("background-color: white;")
        self.inputButton.setText(_translate("KnockOutMachine", "Eingabe bestätigen"))
        self.messages.setStyleSheet("border: none;")
        self.highscoreButton.setText(_translate("KnockOutMachine", "Bestenliste"))
        self.highscoreButton.setStyleSheet("background-color: white;")
        # self.cancelButton.setText(_translate("KnockOutMachine", "Abbrechen"))
        self.cancelTimerButton.setIcon(QtGui.QIcon("display/cancel_button.png"))
        self.cancelTimerButton.setIconSize(QtCore.QSize(50, 50))
        self.cancelTimerButton.setStyleSheet("background-color: white;")
        self.cancelScoreButton.setIcon(QtGui.QIcon("display/cancel_button.png"))
        self.cancelScoreButton.setIconSize(QtCore.QSize(50, 50))
        self.cancelScoreButton.setStyleSheet("background-color: white;")
        self.lcdCounter.setStyleSheet("background-color: #113f0c;")
        self.lcdCounter.setStyleSheet("color: white;")
        self.tableview.setStyleSheet("background-color: white;")

    def enable_input_button(self):
        if len(self.input_dialogue.text()) > 0:
            self.inputButton.setDisabled(False)
        else:
            self.inputButton.setDisabled(True)

    def on_start_button_clicked(self):
        self.lcdCounter.display("00.00")
        self.movie = QtGui.QMovie("")
        self.lcdCounter.setEnabled(True)
        self.lcdCounter.show()
        self.cancelTimerButton.show()
        self.startButton.hide()
        self.highscoreButton.hide()
        self.main_picture.hide()
        self.rpi.mainloop(blocking=False)

        if Input_I1:
            self.glass_not_set()
        else:
            self.glass_set()

    def on_high_score_button_clicked(self):
        self.highscoreButton.hide()
        self.startButton.setDisabled(True)
        self.startButton.hide()
        self.main_picture.hide()
        self.video_frame.hide()
        self.cancelScoreButton.show()
        self.tableview.show()
        self.model.clear()
        self.model.setHorizontalHeaderLabels(['Name', 'Zeit in Sekunden'])
        self.model.setHeaderData(0, QtCore.Qt.Horizontal, QtCore.Qt.AlignJustify, QtCore.Qt.TextAlignmentRole)
        self.delimiter = ';'

        try:
            with open('timeList.csv', 'r') as timeFile:
                reader = csv.reader(timeFile, delimiter=self.delimiter)
                reader = [[x.replace(',', '.') for x in l] for l in reader]
                highscore_list_sorted = sorted(reader, key=lambda x: float(x[1]))[:10]

                for row in highscore_list_sorted:
                    times = [
                        QtGui.QStandardItem(field.replace(".", ","))
                        for field in row
                    ]
                    self.model.appendRow(times)
                    self.tableview.setColumnHidden(2, True)
        except FileNotFoundError:
            print("Timelist File does not exist")

    def glass_not_set(self):
        self.glass_not_set_timer.start()
        self.messages.show()
        self.messages.setText("Bitte Glas vor Sensor stellen!")
        if not Input_I1:
            self.glass_not_set_timer.stop()
            self.glass_set()

    def glass_set(self):
        self.glass_set_timer.start()
        self.messages.show()
        self.messages.setText("Glas erkannt, wenn bereit los!")
        if Input_I1:
            self.glass_set_timer.stop()
            self.start_timer()

    def start_timer(self):
        self.messages.hide()
        # self.pictures.setMovie(self.movie)
        # self.lcdCounter.display(runTime)
        self.timer_thread.start()

    def update_lcd(self):
        self.lcdCounter.display(runTime)

    def update_scores(self, inputName, runTime):
        self.datetime = QtCore.QDateTime.currentDateTime()
        self.delimiter = ';'
        row = [inputName, runTime.replace(".", ","), self.datetime.toString(QtCore.Qt.DefaultLocaleShortDate)]

        with open('timeList.csv', 'a', newline='') as timeFile:
            writer = csv.writer(timeFile, delimiter=self.delimiter)
            writer.writerow(row)
        self.input_dialogue.clear()

    def play_sound(self, fileName, playVideo):
        if playVideo:
            self.file_path = "/var/lib/revpipyload/KnockOutMachine/display/" + fileName
            self.video_frame.show()
            self.player.setVideoOutput(self.video_frame)
            self.player.setPosition(0)
        else:
            self.file_path = "/var/lib/revpipyload/KnockOutMachine/sounds/" + fileName
        self.url = QtCore.QUrl.fromLocalFile(self.file_path)
        self.content = QtMultimedia.QMediaContent(self.url)
        self.player.setMedia(self.content)
        self.player.play()

    def show_pictures(self, runTime):
        self.messages.hide()
        self.lcdCounter.setFixedSize(1050, 450)
        self.play_video = False
        if runTime <= 200:
            self.file_name = "cheering.mp3"
            self.rand = randint(0, 2)
            self.case = lambda x: self.rand < x
            #if self.case(1):
            self.pictures.show()
            self.movie = QtGui.QMovie("display/Trump.gif")
            #else:
                #self.file_name = "endlich_normale_leute.mp4"
                #self.play_video = True
            self.movie.start()
            self.pictures.setMovie(self.movie)
            self.play_sound(self.file_name, self.play_video)

        elif runTime <= 500:
            self.file_name = "applause-2.mp3"
            self.rand = randint(0, 6)
            self.case = lambda x: self.rand < x
            if self.case(1):
                self.pictures.show()
                self.movie = QtGui.QMovie("display/Bier.gif")
            elif self.case(2):
                self.pictures.show()
                self.movie = QtGui.QMovie("display/2.gif")
            elif self.case(3):
                self.pictures.show()
                self.movie = QtGui.QMovie("display/3.gif")
            elif self.case(4):
                self.pictures.show()
                self.movie = QtGui.QMovie("display/4.gif")
            elif self.case(5):
                self.pictures.show()
                self.movie = QtGui.QMovie("display/5.gif")
            else:
                self.pictures.show()
                self.movie = QtGui.QMovie("display/6.gif")
            self.movie.start()
            self.pictures.setMovie(self.movie)
            self.play_sound(self.file_name, self.play_video)

        elif runTime <= 800:
            self.file_name = "laughter-2.mp3"
            self.rand = randint(0, 2)
            self.case = lambda x: self.rand < x
            if self.case(1):
                self.pictures.show()
                self.movie = QtGui.QMovie("display/Bier2.gif")
            else:
                self.pictures.show()
                self.movie = QtGui.QMovie("display/1.jpeg")
            self.movie.start()
            self.pictures.setMovie(self.movie)
            self.play_sound(self.file_name, self.play_video)

        else:
            self.pictures.show()
            self.file_name = "laughter-2.mp3"
            self.movie = QtGui.QMovie("display/dog.gif")
            self.movie.start()
            self.pictures.setMovie(self.movie)
            self.play_sound(self.file_name, self.play_video)

    # TODO toggle outputs in certain pattern
    def change_output(self, highscore):
        # red leds
        if highscore:
            self.rpi.io.O_5 = True
            self.rpi.io.O_6 = True
            self.rpi.io.O_7 = True

        t_end = time.time() + 10
        while time.time() < t_end:
            self.rpi.io.O_1 = not self.rpi.io.O_1
            self.rpi.io.O_2 = not self.rpi.io.O_2
            self.rpi.io.O_3 = not self.rpi.io.O_3

    def send_toggle_signal(self, ioname, iovalue):
        self.timer_thread.toggle_signal.emit()

    def exit_score_function(self):
        self.tableview.hide()
        self.cancelScoreButton.hide()
        self.pictures.hide()
        self.highscoreButton.show()
        self.startButton.setEnabled(True)
        self.startButton.show()
        self.main_picture.show()

    def exit_timer_function(self):
        self.rpi.exit(full=False)
        self.timer_thread.stop_timer_signal.emit()
        self.glass_set_timer.stop()
        self.glass_not_set_timer.stop()
        self.player.stop()
        self.lcdCounter.setEnabled(False)
        self.lcdCounter.hide()
        self.lcdCounter.setFixedSize(1350, 750)
        self.tableview.hide()
        self.video_frame.hide()
        self.cancelTimerButton.hide()
        self.messages.hide()
        self.pictures.hide()
        self.highscoreButton.show()
        self.startButton.setEnabled(True)
        self.startButton.show()
        self.main_picture.show()

    # TODO add cleanup if necessary
    def cleanup_revpi(self):
        return None