Desligue automaticamente o PC com Python e PyQt5

3
Tomas 2020-06-25 08:09.

Sou um iniciante em programação com Python. Vou começar meu primeiro emprego nessa especialização. Posso usar este código para apresentar minhas habilidades em uma entrevista?

import os 
import time
import datetime
import sys
from PyQt5 import QtWidgets, QtGui, QtCore


class MainForm(QtWidgets.QMainWindow):

    # atribute to save variable from time-edit widget, which is passed to the second window.
    saved_time = None


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

        # settings of size and title
        self.setWindowTitle("TurnOff Aplikace")
        self.setGeometry(500, 300, 404, 280)
        self.setFixedSize(404, 280)

        # create stacked widget
        self.Qtstack = QtWidgets.QStackedWidget()
        self.setCentralWidget(self.Qtstack)

        # create two widget to stacked-widget
        self.stack1 = QtWidgets.QWidget()
        self.stack2 = QtWidgets.QWidget()

        # add widget to stacked widget
        self.Qtstack.addWidget(self.stack1)
        self.Qtstack.addWidget(self.stack2)

        # setting of layout to first stack
        self.layout_stack1 = QtWidgets.QVBoxLayout()
        self.stack1.setLayout(self.layout_stack1)

        # setting of layout to second stack
        self.layout_stack2 = QtWidgets.QVBoxLayout()
        self.stack2.setLayout(self.layout_stack2)

        # launch both windows
        self.show()
        self.front_window()
        self.back_window()
    

    def front_window(self):  
            
        # layout with text
        self.text = QtWidgets.QWidget()
        self.layout_text = QtWidgets.QHBoxLayout()
        self.text.setLayout(self.layout_text)
        self.layout_stack1.addWidget(self.text)
        self.layout_stack1.addStretch()

        # Layout to edit a checkboxs
        layout_edit = QtWidgets.QHBoxLayout()
        self.layout_stack1.addLayout(layout_edit)
        self.layout_stack1.addStretch()

        # Layout to error issue
        layout_error = QtWidgets.QHBoxLayout()
        self.layout_stack1.addLayout(layout_error)

        # Layout to pushbutton
        layout_button = QtWidgets.QHBoxLayout()
        self.layout_stack1.addLayout(layout_button)

        # widget with text
        self.text = QtWidgets.QLabel("Here you set how long it takes you to turn off the PC\nautomatically. You can also specify which monitor you want\nto switch to immediately. The minimum time is 15 minutes. \n\nNote: \nBefore turning off, the PC will automatically switch to the\nfirst monitor.")
        self.text.setFont(QtGui.QFont('Arial', 10))    
        self.layout_text.addWidget(self.text)

        # Widget with time-edite
        layout_edit.addStretch()
        self.time_edit = QtWidgets.QTimeEdit(self)
        self.time_edit.setFont(QtGui.QFont('Arial', 16))
        layout_edit.addWidget(self.time_edit)

        # save time from edit-time to class variables
        self.saved_time = self.time_edit    

        # Widget s checkboxes
        layout_edit.addStretch()
        self.checkbox1 = QtWidgets.QCheckBox("1. monitor", self)
        self.checkbox1.setFont(QtGui.QFont('Arial', 10))
        layout_edit.addWidget(self.checkbox1)
        layout_edit.addStretch()
        self.checkbox2 = QtWidgets.QCheckBox("2. monitor", self)
        self.checkbox2.setFont(QtGui.QFont('Arial', 10))
        layout_edit.addWidget(self.checkbox2)
        layout_edit.addStretch()

        #widget s error issue
        self.error = QtWidgets.QLabel(self)
        self.error.setText("<font color='red'>minimum time is 15 minutes</font>")
        self.error.setFont(QtGui.QFont('Arial', 14))
        layout_error.addWidget(self.error)
        self.error.hide()

        # Widget with pushbutton
        self.Push_button_FW = QtWidgets.QPushButton("Enter", self)
        layout_button.addWidget(self.Push_button_FW)

        # logic with pushbutton
        self.Push_button_FW.clicked.connect(self.check_minimum_edit_time)

        # logic with checkboxs
        self.checkbox1.clicked.connect(self.checkbox_1_clicked)
        self.checkbox2.clicked.connect(self.checkbox_2_clicked)

        
    def back_window(self):

        # layout with text and countdown timer
        self.text_countdown = QtWidgets.QWidget()
        layout_text_countdown = QtWidgets.QHBoxLayout()
        self.text_countdown.setLayout(layout_text_countdown)
        self.layout_stack2.addWidget(self.text_countdown)

        # Layout with pushbutton
        button_layout = QtWidgets.QHBoxLayout()
        self.layout_stack2.addLayout(button_layout)

        # widget with text
        layout_text_countdown.addStretch()
        self.text = QtWidgets.QLabel("Automatic turning off the PC !!")
        self.text.setFont(QtGui.QFont('Arial', 10))    
        layout_text_countdown.addWidget(self.text)
        layout_text_countdown.addStretch()

        # widget with countdown timer
        self.countdown = QtWidgets.QLabel(self)
        self.countdown.setFont(QtGui.QFont('Arial', 16))
        layout_text_countdown.addWidget(self.countdown)
        layout_text_countdown.addStretch()

        # Widget with pushbutton
        self.Push_button_BW = QtWidgets.QPushButton("Stop", self)
        button_layout.addWidget(self.Push_button_BW)

        # logic with pushbutton 
        self.Push_button_BW.clicked.connect(self.change_windows)
        self.Push_button_BW.clicked.connect(self.stop_countdown)
        

    def check_minimum_edit_time(self):
        """
        The function monitors whether the user has entered a minimum value in the countdown time.
        """
        given_time = self.time_edit.time()

        if given_time >= QtCore.QTime(0, 15):

            self.change_windows()
            self.start_countdown()
            self.change_monitor()
        else:
            self.error.show()


    def change_windows(self):
        """
        The function changes windows in the application.
        """
        if self.Qtstack.currentIndex() == 0:
            self.Qtstack.setCurrentIndex(1)
        elif self.Qtstack.currentIndex() == 1:
            self.Qtstack.setCurrentIndex(0)


    def change_monitor(self):
        """
        The function changes the output from the PC to the monitor.
        """
        if self.checkbox1.isChecked():
            os.system("DisplaySwitch.exe / internal")
        elif self.checkbox2.isChecked():
            os.system("DisplaySwitch.exe / external")

    
    def checkbox_1_clicked(self):
        """
        The function ensures that only one checkbox is unchecked at a time.
        """
        if self.checkbox1.isChecked():
            self.checkbox1.setChecked(True)
            self.checkbox2.setChecked(False)
        else:
            self.checkbox1.setChecked(False)


    def checkbox_2_clicked(self):
        """
        The function ensures that only one checkbox is unchecked at a time.
        """
        if self.checkbox2.isChecked():
            self.checkbox2.setChecked(True)
            self.checkbox1.setChecked(False)
        else:
            self.checkbox2.setChecked(False)
    

    def start_countdown(self):
        """
        The function starts the countdown when the ENTER button is clicked.
        """
        # create string from time
        string_time = self.saved_time.time().toString()


        # string pulls the time, but only in seconds, and stores a variable that is inserted into the function: timer_start ()
        x = time.strptime(string_time.split(',')[0],'%H:%M:%S')
        self.seconds = (datetime.timedelta(hours=x.tm_hour,minutes=x.tm_min,seconds=x.tm_sec).total_seconds())

        self.timer_start()

    def stop_countdown(self):
        """
        The function cancels the time countdown.
        """

        self.my_qtimer.stop()


    def timer_start(self):
        """
        The function sets the countdown.
        """

        self.time_left_int = self.seconds

        self.my_qtimer = QtCore.QTimer(self)
        self.my_qtimer.timeout.connect(self.timer_timeout)
        self.my_qtimer.start(1000)


    def timer_timeout(self):
        """
        The function sets the end of the countdown.
        """

        if self.time_left_int > 0:

            self.time_left_int -= 1
            self.update_number()
        else:
            self.my_qtimer.stop()
            os.system("shutdown / s / t 1")
            

    def update_number(self):
        """
        The function resets the number every second so that the user can see the countdown.
        """

        self.countdown.setText(str(datetime.timedelta(seconds=self.time_left_int)))



class App(QtWidgets.QApplication):

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

    def build(self):
        self.main_window = MainForm()
        sys.exit(self.exec_())



root = App()
root.build()

1 answers

2
Reinderien 2020-06-25 10:33.

Não misture localidades

"Aplikace" parece ser tcheco, onde todo o resto é inglês. Escolha um ou outro de forma consistente. Se você deseja alternar entre os dois com base na localidade do sistema, essa também é uma opção.

Troca de pilha

    if self.Qtstack.currentIndex() == 0:
        self.Qtstack.setCurrentIndex(1)
    elif self.Qtstack.currentIndex() == 1:
        self.Qtstack.setCurrentIndex(0)

pode ser

self.Qtstack.setCurrentIndex(
    1 - self.Qtstack.currentIndex()
)

Verificação no-op

Isso realmente tem algum efeito?

    if self.checkbox1.isChecked():
        self.checkbox1.setChecked(True)
    else:
        self.checkbox1.setChecked(False)

Acho que a única coisa que precisa ser preservada é a modificação de checkbox2.

Divisão de tempo

Isto:

time.strptime(string_time.split(',')[0],'%H:%M:%S')

é preocupante. Por que há uma vírgula nessa string? Se for realmente porque uma vírgula precede os segundos fracionários, não descarte essa seção da string usando um split; em vez disso, inclua ,%fno final da string de formato.

Subprocesso

Substitua as chamadas para os.systempor chamadas para subprocess.

MORE COOL STUFF

Jana Duggar: tudo o que ela disse sobre o amor e sua janela de 5 anos para encontrar o 'escolhido'

Jana Duggar: tudo o que ela disse sobre o amor e sua janela de 5 anos para encontrar o 'escolhido'

Jana Duggar foi aberta sobre sua busca pelo amor. Aqui está tudo o que ela disse sobre o assunto e sua janela de cinco anos para o casamento.

Sam Heughan sabe exatamente o que vai tirar do set de 'Outlander' - 'Eu me sinto como Jamie quando os coloco'

Sam Heughan sabe exatamente o que vai tirar do set de 'Outlander' - 'Eu me sinto como Jamie quando os coloco'

O astro de 'Outlander', Sam Heughan, revelou recentemente o que vai levar do set para relembrar Jamie Fraser, o papel que o tornou uma estrela.

A música dos primeiros Beatles que foi uma das 'apresentações mais emocionantes' da banda, de acordo com um Fab Four Insider

A música dos primeiros Beatles que foi uma das 'apresentações mais emocionantes' da banda, de acordo com um Fab Four Insider

'She Loves You' foi escrita em uma hora, gravada em um dia, e foi a música dos Beatles com uma de suas melhores apresentações de sua carreira.

Dolly Parton ajudou sua avó 'inválida' quando nenhum dos outros netos o faria - ela também pregaria uma peça nela

Dolly Parton ajudou sua avó 'inválida' quando nenhum dos outros netos o faria - ela também pregaria uma peça nela

Dolly Parton e sua avó Bessie tiveram um relacionamento especial. Vovó Parton estava muito doente, mas isso não impediu Dolly de pregar uma peça nela.

Qual é a madeira mais dura do mundo?

Qual é a madeira mais dura do mundo?

Você pode achar que o carvalho ou a nogueira são madeiras resistentes, mas quando se trata da madeira mais dura do mundo, elas nem chegam perto.

10 das criaturas marinhas mais assustadoras que espreitam nas profundezas do oceano

10 das criaturas marinhas mais assustadoras que espreitam nas profundezas do oceano

O oceano é repleto de beleza, mas também esconde algumas das criaturas marinhas mais assustadoras do planeta. Muitos desses animais espreitam nas profundezas do oceano, no mundo escuro e de alta pressão do fundo do mar.

10 Melhores Encantamentos de Espada no Minecraft

10 Melhores Encantamentos de Espada no Minecraft

Se você está enfrentando criaturas hostis ou se preparando para cenários PvP, conhecer os melhores encantamentos de espada no Minecraft pode te dar uma grande vantagem. Encantar espadas permite causar mais dano, aumentar a quantidade de itens obtidos de criaturas e prolongar a durabilidade da sua espada.

13 países socialistas muito diferentes entre si

13 países socialistas muito diferentes entre si

Quando as pessoas falam sobre países socialistas, geralmente imaginam o controle total do governo e a ausência de propriedade privada. Mas, na prática, as economias socialistas variam muito.

Recapitulação do Urso: Marcus é o homem mais gentil, gentil e sincero de Chicago?

Recapitulação do Urso: Marcus é o homem mais gentil, gentil e sincero de Chicago?

“Children” traz uma participação especial de grande nome e algumas notícias devastadoras

Por US $ 9.800, você os colocaria neste Toyota RAV4 2008 de sete lugares?

Por US $ 9.800, você os colocaria neste Toyota RAV4 2008 de sete lugares?

Este RAV4 está em excelentes condições e está preparado para um jogo de cadeiras musicais.

Van de entrega da Amazon pega fogo em explosão de fogo durante o calor do verão em Houston

Van de entrega da Amazon pega fogo em explosão de fogo durante o calor do verão em Houston

Imagens de drone capturaram bombeiros parecendo lutar para apagar o incêndio.

O programa dos Panteras Negras da Marvel será o programa de animação mais importante até agora

O programa dos Panteras Negras da Marvel será o programa de animação mais importante até agora

Eyes of Wakanda está diretamente relacionado ao MCU, além de atualizações sobre X-Men '97, What If..., Demolidor e muito mais.

Tudo sobre o deslumbrante anel de noivado de safira de Kate Middleton (e a herança real que o inspirou!)

Tudo sobre o deslumbrante anel de noivado de safira de Kate Middleton (e a herança real que o inspirou!)

O anel de noivado de Kate Middleton pertenceu à Princesa Diana antes do Príncipe William pedi-la em casamento. Descubra tudo o que há para saber sobre a peça histórica aqui.

Quem é a esposa de John Cleese? Tudo sobre Jennifer Wade

Quem é a esposa de John Cleese? Tudo sobre Jennifer Wade

John Cleese se casou com sua esposa, Jennifer Wade, em 2012. Aqui está tudo o que você precisa saber sobre a esposa de John Cleese, Jennifer Wade.

Quem é a esposa de Patton Oswalt? Tudo sobre Meredith Salenger

Quem é a esposa de Patton Oswalt? Tudo sobre Meredith Salenger

Patton Oswalt se casou com sua esposa, a também atriz Meredith Salenger, em 2017. Aqui está tudo o que você precisa saber sobre a esposa de Patton Oswalt, Meredith Salenger.

Quem é o marido de Mena Suvari? Tudo sobre Michael Hope

Quem é o marido de Mena Suvari? Tudo sobre Michael Hope

Mena Suvari é casada com o marido Michael Hope desde 2018. Aqui está tudo o que você precisa saber sobre o marido de Mena Suvari.

pronomes são super assustadores

Isso me atinge De repente, como tantas vezes acontece É o meio do caminho tudo de novo <Não, não aquele no Pacífico, seu marrom, aquele no carnaval> Todas as manchetes em voz alta…..

3 maneiras comprovadas de melhorar sua habilidade de escrita

Os benefícios de escrever e estratégias para ajudá-lo a fazê-lo

3 maneiras comprovadas de melhorar sua habilidade de escrita

Em 2022, com o lançamento do GPT-3, a habilidade de escrita parece se tornar menos importante. Com a IA, pessoas com redação ruim também podem gerar funcionários de qualidade.

A lenta erosão: revelando como as pessoas desperdiçam em suas carreiras

A lenta erosão: revelando como as pessoas desperdiçam em suas carreiras

No mundo acelerado e competitivo de hoje, a carreira desempenha um papel significativo no crescimento pessoal, na estabilidade financeira e na satisfação geral com a vida. No entanto, muitos indivíduos encontram-se presos em um ciclo implacável de estagnação e insatisfação, definhando gradualmente em suas vidas profissionais.

O que torna um podcast influente?

O que torna um podcast influente?

Na semana passada, notei um comunicado de imprensa, enviado via PressGazette (um site de notícias da mídia britânica). O artigo anunciava que a Acast, a empresa de publicidade e hospedagem de podcast Scandi, lideraria um consórcio de "provavelmente os editores mais influentes" em podcasting.

Language