Program_Light

KMS12 : Python PyQt5를 이용한 줌 반자동 참가기 (source)

KMS studio 2021. 6. 5. 13:00

KMS12 - Zoom auto Join

이번에 온라인 수업을 하게 되면서, 줌 방에 접속하기 위한 과정이 매우 불편하다는 것을 알아내었습니다.

매번 시간표 확인 -> ID, PW확인, -> 줌 실행 -> 접속은 너무 번거로운 과정이 아닙니까?

 

그래서 이번에는 실제로 실생활에 사용하기 위한 프로그램을 하나 만들어보았습니다.

원래 제 특기는 C이지만, 어렴풋이 친구에게 C언어로는 GUI하기가 빡세다는 말을 들어서, 파이썬을 새로 배웠습니다.

정식으로 파이썬을 배운적은 없지만 이전에도 파이썬을 이용해서 프로그램을 한 2번? 만들어 보았기 떄문에 그렇게 어렵지는 않았습니다.

 


<소스>

source,py (줌 초대 URL은 모두 정보 보호를 위해 바꾸었습니다)

import datetime
import sys
import time
import webbrowser

from PyQt5.QtWidgets import QApplication, QMainWindow, QAction, qApp, QLabel, QComboBox, QPushButton, QMessageBox
from PyQt5.QtGui import QIcon

cnt = -1
rec = -1
roomNo = -1
subName = ["담임 조종례", "국어", "수학", "영어", "통합사회", "통합과학", "과학탐구", "기술가정", "미술", "한국사", "체육", "진로", "담임창체", "동아리"]
subURL = ["줌 초대 URL 1",
          "줌 초대 URL 2",
          "줌 초대 URL 3",
          "줌 초대 URL 4",
          "줌 초대 URL 5",
          "줌 초대 URL 6",
          "줌 초대 URL 7",
          "줌 초대 URL 8",
          "줌 초대 URL 9",
          "줌 초대 URL 10",
          "줌 초대 URL 11",
          "줌 초대 URL 12",
          "줌 초대 URL 13",
          "줌 초대 URL 14",
          ]
subTimeTable = [
    [0, 2, 4, 9, 3, 10, 1, 5],
    [0, 3, 2, 4, 9, 1, 7, 11],
    [0, 5, 7, 1, 2, 3, 6],
    [0, 1, 8, 8, 7, 4, 2, 9],
    [0, 5, 3, 10, 8, 12, 13],
    [0],
    [0],
]

def logicA(a, num, b):
    if((a <= num) and (num <= b)):
        return 1
    else:
        return 0

def calcSubTime(dayT, hour, minute):
    if(dayT >= 5):
        return -1

    num = hour * 100 + minute #hour의 십진법 표기. 60진법이 더 효율적임
    if(hour <= 7):
        return -1
    elif(logicA(800, num, 856)):
        return 0
    elif(logicA(857, num, 954)): # 910 ~ 1000
        return 1
    elif(logicA(955, num, 1054)): # 1010 ~ 1100
        return 2
    elif(logicA(1055, num, 1154)): # 1110 ~ 1200
        return 3
    elif(logicA(1155, num, 1314)): # 1210 ~ 1300
        return 4
    elif(logicA(1315, num, 1329)): # 1300 ~ 1400
        return -1
    elif(logicA(1330, num, 1444)): # 1400 ~ 1450
        return 5
    elif(logicA(1445, num, 1544)): # 1500 ~ 1550
        return 6
    else:
        if((dayT == 2) or (dayT == 4)):
            if(logicA(1545, num, 1609)):
                return 0
            else:
                return -1
        else:
            if(logicA(1545, num, 1644)): # 1600 ~ 1650
                return 7
            elif(logicA(1645, num, 1709)):
                return 0
            else:
                return -1

class MyApp(QMainWindow):

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

    def initUI(self):
        global cnt
        cnt = 0

        # manu bar
        exitAction = QAction(QIcon('logo.png'), 'Exit', self)
        exitAction.setShortcut('Ctrl+Shift+E')
        exitAction.setStatusTip('Exit application')
        exitAction.triggered.connect(qApp.quit)

        joinAction = QAction(QIcon('logo.png'), 'Join', self)
        joinAction.setShortcut('Ctrl+J')
        joinAction.setStatusTip('Join selected subject')
        joinAction.triggered.connect(self.onClicked)

        self.statusBar()

        menubar = self.menuBar()
        menubar.setNativeMenuBar(False)
        filemenu = menubar.addMenu('&Cmd')
        filemenu.addAction(exitAction)
        filemenu.addAction(joinAction)

        #subject recommand lable
        self.lbl = QLabel('lable for reccommanding subject', self)
        self.lbl.move(100, 200)
        self.lbl.resize(200, 40)

        font1 = self.lbl.font()
        font1.setPointSize(12)
        font1.setBold(True)
        self.lbl.setFont(font1)

        self.lbl.adjustSize()

        # select combo box
        cb = QComboBox(self)
        for i in subName:
            cb.addItem(i)
        cb.activated[str].connect(self.onActivated)
        cb.resize(200, 30)
        cb.move(100, 65)\

        # join button
        bt1 = QPushButton("선택된\n과목", self)
        bt1.clicked.connect(self.onClicked)
        bt1.resize(75, 60)
        bt1.move(125, 110)

        #autojoin button
        bt2 = QPushButton("현재 시각의\n추천과목", self)
        bt2.clicked.connect(self.onClicked2)
        bt2.resize(75, 60)
        bt2.move(200, 110)

        #refresh button
        bt3 = QPushButton("추천 과목 새로고침", self)
        bt3.clicked.connect(self.refreshSub)
        bt3.move(7, 20)
        font1 = bt3.font()
        font1.setPointSize(8)
        bt3.setFont(font1)
        bt3.adjustSize()

        self.refreshSub()

        #Activate
        self.setWindowIcon(QIcon('logo.png'))
        self.setWindowTitle('Che Jang ill ban')
        self.setGeometry(300, 300, 400, 270)
        self.show()

    def onActivated(self, text):
        global cnt
        cnt = 0
        for i in subName:
            if text == i:
                break
            cnt += 1

        print('combobox selected : ' + str(cnt) + 'th subject')

    def onClicked(self):
        global cnt, roomNo
        roomNo = cnt
        self.joinRoom()

    def onClicked2(self):
        global rec, roomNo
        self.refreshSub()
        roomNo = rec
        self.joinRoom()

    def joinRoom(self):
        global roomNo
        print("join button was clicked")
        if (roomNo == 13):
            # reply = QMessageBox.question(self, '주의!', '동아리는 프로그램 구조상 JA code 동아리의\nzoom room에 들어가도록 설계되었습니다.\n진행하시겠습니까?', QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
            QMessageBox.question(self, '주의!',
                                         '동아리는 구조상 모든 학생들의 room이 다르므로 \n단일 프로그램으로는 구현할 수 없는 기능입니다.\n자세한 내용은 개발자에게 문의하십시오',
                                         QMessageBox.Ok, QMessageBox.Ok)
        elif (roomNo != -1):
            reply = QMessageBox.question(self, '안내', subName[roomNo] + ' 줌 교실에 참가합니다',
                                         QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes)
            if reply == QMessageBox.No:
                return
            print("push webbrowser open command")
            webbrowser.open(subURL[roomNo])
        else:
            QMessageBox.question(self, '안내', '현재 추천과목이 없습니다.',
                                 QMessageBox.Ok, QMessageBox.Ok)

    def refreshSub(self):
        global rec
        dayT = datetime.datetime.today().weekday()
        now = time.localtime()
        hour = now.tm_hour
        minute = now.tm_min
        T = calcSubTime(dayT, hour, minute)
        print('refresh / ' + str(T) + ' class of ' + str(dayT + 1) + 'th day : ' + subName[subTimeTable[dayT][T]])
        if(T == -1):
            rec = -1
        else:
            rec = subTimeTable[dayT][T]
        if(T == -1):
            self.lbl.setText('추천 과목: NONE')
        else:
            self.lbl.setText('추천 과목 : (' + str(T) + ' 교시) ' + subName[subTimeTable[dayT][T]])
        self.lbl.adjustSize()
        self.lbl.move(200 - int(self.lbl.size().width() / 2), 200)

        self.statusBar().showMessage('updated at ' + str(now.tm_hour) + 'h ' + str(now.tm_min) + 'min ' + str(now.tm_sec) + 'sec')

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = MyApp()
    sys.exit(app.exec_())


<실행파일>

사실상 이 글에서 줌 URL을 일시적으로 다른 문자열로 바꾸어놓았고, 애초에 사람들마다 시간표, 선생님 줌 초대 링크마다 소스코드에서 상수로 사용하는 값이 달라지므로 실행파일을 올려드리는건 의미가 없다 생각했습니다.

 

그래서, 자신에게 맞춰 수정한 파이썬 파일을 .exe파일로 변경할 수 있는 방법을 알 수 있는 사이트를 알려드리겠습니다

wikidocs.net/21952

 

위키독스

온라인 책을 제작 공유하는 플랫폼 서비스

wikidocs.net

+ 참고 : 실행화면

 

이상으로 KMS 였습니다. 감사합니다.