Python Forum
[PyQt] [Solved]How to Run GUI MsgBox From Terminal Properly
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
[PyQt] [Solved]How to Run GUI MsgBox From Terminal Properly
#2
I don't really understand what you want to do there.
But here is an old reminder I once made. Maybe it helps a little.

You can display a reminder at a specific time and execute a command if you want.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from  PyQt5.QtCore import Qt, QTimer, QMetaObject, QSettings, QProcess, QSize, QRect
from PyQt5.QtWidgets import (QMessageBox, QApplication, QMainWindow, QPushButton, QGridLayout, 
                                QTextEdit, QLineEdit, QComboBox, QLabel, QWidget, QVBoxLayout)
from PyQt5.QtMultimedia import QSound
from PyQt5.QtGui import QIcon
import sys, datetime
import subprocess

class Message(QWidget):
    def __init__(self, title, message, parent=None):
        QWidget.__init__(self, parent)
        self.setLayout(QGridLayout())
        self.titleLabel = QLabel(title, self)
        self.titleLabel.setStyleSheet("color: #729fcf; font-size: 18px; font-weight: bold; padding: 0;")
        self.messageLabel = QLabel(message, self)
        self.messageLabel.setStyleSheet("color: #729fcf; font-size: 12px; font-weight: normal; padding: 0;")
        self.buttonClose = QPushButton(self)
        self.buttonClose.setIcon(QIcon.fromTheme("window-close"))
        self.buttonClose.setFlat(True)
        self.buttonClose.setFixedSize(32, 32)
        self.buttonClose.setIconSize(QSize(16, 16))
        self.layout().addWidget(self.titleLabel)
        self.layout().addWidget(self.messageLabel, 2, 0)
        self.layout().addWidget(self.buttonClose, 0, 1)

class Notification(QWidget):
    def __init__(self, parent = None):        
        super(QWidget, self).__init__(parent = None)
        self.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint)      
        self.setStyleSheet("background: #000000; padding: 0;")
        self.mainLayout = QVBoxLayout(self)

    def setNotify(self, title, message, timeout):
        self.m = Message(title, message)
        self.mainLayout.addWidget(self.m)
        self.m.buttonClose.clicked.connect(self.onClicked)
        self.show()
        QTimer.singleShot(timeout, 0, self.closeMe)
        
    def closeMe(self):
        self.close()
        self.m.close()
    
    def onClicked(self):
        self.close()
        
class MyWindow(QMainWindow):
    def __init__(self, parent=None):
        super(MyWindow, self).__init__(parent)

        self.entry = ""
        self.settings = QSettings("myReminder", "reminder")
        self.setObjectName("MainWindow")
        self.setFixedSize(250, 240)
        self.setWindowTitle("Reminder")

        self.setAttribute(Qt.WA_DeleteOnClose)
        self.setStyleSheet(stylesheet(self))

        self.statusBar().showMessage("choose Time")
        
        self.process = QProcess()
        self.process.started.connect(lambda: print("process started"))
        self.process.finished.connect(lambda: print("process finished"))
        self.process.errorOccurred.connect(lambda: print("process eror"))

        self.hour = QComboBox()
        self.hour.addItem("00")
        self.hour.addItem("01")
        self.hour.addItem("02")
        self.hour.addItem("03")
        self.hour.addItem("04")
        self.hour.addItem("05")
        self.hour.addItem("06")
        self.hour.addItem("07")
        self.hour.addItem("08")
        self.hour.addItem("09")
        for x in range(10, 24):
            self.hour.addItem(str(x))

        self.minute = QComboBox()
        self.minute.addItem("00")
        self.minute.addItem("01")
        self.minute.addItem("02")
        self.minute.addItem("03")
        self.minute.addItem("04")
        self.minute.addItem("05")
        self.minute.addItem("06")
        self.minute.addItem("07")
        self.minute.addItem("08")
        self.minute.addItem("09")
        for x in range(10, 60):
            self.minute.addItem(str(x))

        h = str(datetime.datetime.now().time().strftime('%H'))
        m = str(datetime.datetime.now().time().strftime('%M'))

        self.hour.setCurrentIndex(self.hour.findText(h))
        self.minute.setCurrentIndex(self.minute.findText(m)+1)

        self.lblT = QLabel("Reminder at:   ")
        self.lbl = QLabel(":")

        self.cwid = self.addToolBar("Time")
        self.cwid.setMovable(False)
        self.cwid.addWidget(self.lblT)
        self.cwid.addWidget(self.hour)
        self.cwid.addWidget(self.lbl)
        self.cwid.addWidget(self.minute)

        btn_start = QPushButton(self)
        btn_start.setGeometry(10, 180, 80, 26)
        btn_start.setIcon(QIcon.fromTheme("player-play"))
        btn_start.setText("Start")
        btn_start.setObjectName("btn")
        btn_start.clicked.connect(self.button_start_clicked)

        btn_stop = QPushButton(self)
        btn_stop.setGeometry(160, 180, 80, 26)
        btn_stop.setIcon(QIcon.fromTheme("player-stop"))
        btn_stop.setText("Stop")
        btn_stop.setObjectName("btn_stop")
        btn_stop.clicked.connect(self.button_stop_clicked)

        self.message_entry = QTextEdit(self)
        self.message_entry.setAcceptRichText(True)
        self.message_entry.setGeometry(10, 40, 230, 100)
        self.message_entry.setPlaceholderText("Message")

        self.app_entry = QLineEdit(self)
        self.app_entry.setGeometry(10, 150, 230, 26)
        self.app_entry.setPlaceholderText("set command to start")
        self.app_entry.setToolTip("set command to start")

        self.msound = QSound(None)
        self.mysound = '/usr/share/sounds/speech-dispatcher/test.wav' 

        self.mymessage = ""

        self.timer = QTimer()
        self.timer.timeout.connect(self.update_label)

        self.readSettings()

        QMetaObject.connectSlotsByName(self)

    def updateEntry(self):
        mleft = self.hour.currentText()
        mright = self.minute.currentText()
        mtext = mleft + ":" + mright + ":00"
        self.entry = mtext
        self.message_entry.setFocus()

    def update_label(self):
        current_time = str(datetime.datetime.now().time().strftime('%H:%M:%S'))
        self.statusBar().showMessage(current_time + " / " + self.entry)
        if current_time == self.entry:
            self.timer.stop()
            self.msound.play(self.mysound)
            self.statusBar().showMessage("Reminder")          
            myapp = self.app_entry.text()
            if not myapp == "":
                print("starting", myapp)
                subprocess.Popen(myapp, stdout=subprocess.PIPE, shell=True)
            self.showNotification(self.message_entry.toPlainText())
            self.statusBar().showMessage("Timer gestoppt")
                
    def showNotification(self, message):
        self.notification = Notification()
        self.notification.setNotify("Reminder", message, 5000)
        r = QRect(self.x() + round(self.width() / 2) - round(self.notification.width() / 2), 
                                        self.y() + 26, self.notification.m.messageLabel.width() + 30, self.notification.m.messageLabel.height())
        self.notification.setGeometry(r)


    def button_start_clicked(self):
        self.updateEntry()
        self.statusBar().showMessage("Timer started ...")
        self.timer.start(1000)  #  1 second
        self.showMinimized()

    def button_stop_clicked(self):
        self.timer.stop()
        self.statusBar().showMessage("Timer stopped")
        self.msound.play(self.mysound)

    def msgbox(self, message):
        QMessageBox.information(None, "Information", "<h2>Reminder:</h2>\n\n" + message)
        self.showMaximized()

    def readSettings(self):
        print("reading settings")
        if self.settings.contains("geometry"):
            self.setGeometry(self.settings.value('geometry'))
        if self.settings.contains("message"):
            self.message_entry.setText(self.settings.value("message"))
        if self.settings.contains("myapp"):
            self.app_entry.setText(self.settings.value("myapp"))

    def saveSettings(self):
        print("saving settings")
        self.settings.setValue('geometry', self.geometry())
        self.settings.setValue('message', self.message_entry.toPlainText())
        self.settings.setValue('myapp', self.app_entry.text())

    def closeEvent(self,event):
        self.saveSettings()
        print("Goodbye ...")
        event.accept()

def stylesheet(self):
    return """

        QPushButton
        {
            font-size: 9pt;
            background: #729fcf;
        } 

        QPushButton::hover
        {
            color: #f3f3f3; 
        } 
        QTextEdit
        {
            font-size: 9pt;
            background: #729fcf;
            border: 1px solid #d3d7cf;
        } 

        QLineEdit
        {
            font-size: 9pt;
            background: #729fcf;
            border: 1px solid #d3d7cf;
        } 

        QToolBar
        {
            margin-left: 10px;
            margin-right: 10px;
            margin-top: 4px;
            font-size: 9pt;
            background: #729fcf;
            border: 1px solid #d3d7cf;
        } 

        QLabel
        {
            margin-left: 10px;
            margin-top: 4px;
        }

        QComboBox
        {
            width: 17px;
            padding-left: 5px;
            margin-top: 4px;
            font-size: 9pt;
            background: #729fcf;
        }

        QStatusBar
        {
            font-size: 7pt;
            color: #f3f3f3;
            padding-left: 10px;
         }
        QMainWindow
        {
            background: #729fcf;
        }
    """

if __name__ == "__main__":

    app = QApplication(sys.argv)
    main = MyWindow()
    main.show()
    sys.exit(app.exec_())
Reply


Messages In This Thread
RE: How to Run GUI From Terminal Properly - by Axel_Erfurt - Oct-02-2022, 08:39 PM

Possibly Related Threads…
Thread Author Replies Views Last Post
  [PyQt] [Solved]Add a SpinBox to MsgBox or Carry Variable Over? Extra 6 3,192 Jun-05-2022, 09:32 PM
Last Post: Extra

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020