지식메모




https://yonoo88.tistory.com/1210


위 링크에서 만들었던 로그인 창은 암호 입력시 암호가 가려지지 않는다.


암호를 가리기 위해서는 다음 코드가 필요하다.


self.lineEdit_PW.setEchoMode(QtWidgets.QLineEdit.Password)


이 코드를 암호 입력 코드에 추가해준다.





아니면 코드를 추가하지 않고 Qt designer 에서 GUI 를 구성할 때 속성을 변경해주면 자동으로 코드가 추가되어 있다.



echoMode를 password로 변경해주면 다음과 같이 암호가 가려진다.









다빈치 리졸브 15에서 특정 사물이나 얼굴에 모자이크가 따라다니게 하는 방법입니다.





다빈치 리졸브 14를 쓰다가 이제서야 15를 설치해보았다


설치하고 어떤 효과과 있나 살펴보았는데 타이틀 효과가 추가된게 있었다.


다양한 3D 효과도 제공되고 있어서 어떤 효과가 있는지 살펴보았다



먼저 

심플한 타이틀 효과 12가지



아래 자막이 타이틀 효과 이름이다.






Lower 3rd 텍스트 효과 10가지







3D Lower 3rd 텍스트 효과 9가지







3D 타이틀 효과 14가지





이처럼 다빈치 리졸브 15에서는 14에서는 없었던 많은 타이틀 및 텍스트 효과를 제공하고 있다


물론 세부 수치 조절로 글자 색상 및 효과를 조절 가능하다


하지만 나같은 초보자들에게는 어려운 작업이기 때문에 기본값으로만 써도 충분할 것으로 생각한다.


기본적으로 제공하는 도구를 잘 쓰는 것도 하나의 능력이라 생각되기 때문에 

무슨 기능이 있는지 잘 찾아보는 습관을 길러야겠다.


단 감안해야할 점은 

3D 효과의 경우 컴사양이 좋아야 한다. 사양이 딸리면 작업환경에서 영상효과가 끊겨서 눈으로 확인이 어렵다

위 영상도 1분남짓 영상인데 인코딩만 10분이 걸렸다..


영상편집시 좋은 컴 사양은 필수!







해외 고객센터에 전화를 걸 일이 생겨서 국제전화비용 때문에 이거저거 알아보았다

국제전화 카드를 사서하거나 핸드폰 00700 같은 국제전화 번호를 사용하는 방법이 있었지만

카드는 소액구매가 불가능하고 최소 2만원? 부터 구매가 가능했다.

00700은 SKT 고객센터에 물어보니 분당 천원꼴이지만 3분 통화시 3분 추가 무료통화가 가능하댄다

그래서 요금이 걱정되면 6분 통화 후 끊고 다시 걸어 3분+추가3분 의 혜택을 받는 식으로 해야한다고 한다.

넘나 번거로운 것..


그래서 뭐 없나 찾아보다 발견한 OTO무료국제전화


무료 라고 하지만 무료는 아니다


이말인 즉슨 국제전화를 국제전화 비용이 아닌 국내통화료로 이용할 수 있다는 뜻이다.

주요기능 설명이다



[주요기능]

★ 무료국제전화

- 한국에서는 미국, 캐나다, 중국, 일본 등 94개국에 대해서 무료로 국제전화를 사용하실 수 있습니다. 

(가입하신 통신사 요금제의 부가통화 분수가 차감되는 방식으로, 잔여 부가통화 분수가 없을 시 통신사 요금제에 따른 국내통화료가 발생할 수 있으며, 별도의 국제전화 요금은 발생하지 않습니다.)


★ 왜 OTO 무료국제전화여야 하는가?

1. OTO무료국제전화는 국제전화 비용이 절대로 발생하지 않아 무료국제전화입니다.

2. 국제전화를 내 휴대전화 국내음성통화료로 이용할 수 있으니 걱정이 없습니다. 

3. 주요 국가들만 무료인 다른 서비스와 달리, OTO무료국제전화는 94개국에 무료통화를 제공하고 있습니다. 


간단히 국제전화를 국내통화료로 이용할 수 있다고 한다.


밑져야 본전 한번 해보기로 하였다.


앱 설치 후 국가선택을 하면 자동으로 국가번호가 적용되고 이어서 전화번호를 누르면 된다

(단 국제전화전용 번호여야 한다. 해당 국가의 국내번호는 불가능)



영어로 통화를 해야한다니 굉장히 긴장이 되었지만 심호흡을 한 후

번호를 누르고 통화를 누르면 아래와 같은 화면이 나온다



그리고 곧 국내 통화화면으로 바뀐다. 

안내에 따라 다이얼을 눌러야 한다면 이 화면에서 누르면 된다.



이제 남은 건 본인의 리스닝 실력이다.

내가 할 말은 번역기로 이미 다 적어놓았지만 문제는 듣는거다.


어림짐작으로 어케어케 통화를 마쳤다.

총 통화는 5분정도 되었다.

용케 알아 들어준 상담사에게 감사의 뜻을 전한다.


통화를 마치고 요금 확인을 해보았다.

망외 통화 100분에서 통화가 차감되었다.

실시간 요금을 봐도 국제전화 통화료는 나오지 않았다.

사실상 무료 국제전화를 한 셈이다.

무제한 전화요금제를 쓰거나 잔여 통화가 남아있다면 국제전화를 무료로 쓸 수 있는 것이다!




통화 품질 후기는

어떤 원리인지는 모르겠지만 초반에는 다이얼도 잘 안먹히는 것 같았고 끊김도 있었다.

겨우 상담사 연결을 했는데 내 목소리가 안들리는 것 같았다.

그래서 2번이나 전화를 끊겼다 (내가 끊은게 아님)

그러다보니 총 통화시간은 10분정도 되었다.


이후 통화에서는 잘들렸으나 약간의 딜레이가 있는 듯 하다.

딜레이를 고려해서 천천히 말하고 하면 무리없이 통화가 가능하다.


당장 급하고 짧은 시간만 통화할 일이 생긴다면 유용한 서비스라고 생각한다.

OS High Sierra 10.13.4

 Xcode 9.4.1


코드 한줄 삭제 단축키 만들기


Xcode > Preferences > key Bindings 진입 후 

"delete line"으로 검색하면 단축키가 설정되어 있지 않은데 설정할 수 있다.



습관대로 컨트롤 + D로 설정

맥 키 익히는 것도 일이다...



GUI 구성하기

Qt designer로 생성한 .ui 파일 파이썬 .py로 변환

http://yonoo88.tistory.com/1209


GUI 구성상태


기능 : ID와 PW 입력 후 시작버튼을 누름 > 동작 완료 후 listWidget에 로그인 성공 표시


아래 코드를 보면 UI 객체 명 별로 코드가 구성되어 있다

핵심은 시작 버튼에 이벤트 처리를 해주는 것. 시작 버튼 객체명은  startButton  이다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
 
from PyQt5 import QtCore, QtGui, QtWidgets
from selenium import webdriver
import time
 
class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(180234)
 
        self.listWidget = QtWidgets.QListWidget(Dialog)
        self.listWidget.setGeometry(QtCore.QRect(2016014161))
        self.listWidget.setObjectName("textBrowser")
 
        self.label = QtWidgets.QLabel(Dialog)
        self.label.setGeometry(QtCore.QRect(80101616))
        self.label.setObjectName("label")
 
        self.label_2 = QtWidgets.QLabel(Dialog)
        self.label_2.setGeometry(QtCore.QRect(80702116))
        self.label_2.setObjectName("label_2")
 
        self.startButton = QtWidgets.QPushButton(Dialog)
        self.startButton.setGeometry(QtCore.QRect(501307523))
        self.startButton.setObjectName("startButton")
 
        self.lineEdit_ID = QtWidgets.QLineEdit(Dialog)
        self.lineEdit_ID.setGeometry(QtCore.QRect(303011320))
        self.lineEdit_ID.setObjectName("lineEdit_ID")
 
        self.lineEdit_PW = QtWidgets.QLineEdit(Dialog)
        self.lineEdit_PW.setGeometry(QtCore.QRect(309011320))
        self.lineEdit_PW.setObjectName("lineEdit_PW")
 
        self.retranslateUi(Dialog)
        QtCore.QMetaObject.connectSlotsByName(Dialog)
 
#startButton 클릭시 autoExcute 함수 수행
        self.startButton.clicked.connect(self.autoExcute)
 
    def retranslateUi(self, Dialog):
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog""Naver Login"))
        self.label.setText(_translate("Dialog""ID"))
        self.label_2.setText(_translate("Dialog""PW"))
        self.startButton.setText(_translate("Dialog""시작"))
 
 #셀레니움 동작 코드 함수 autoExcute 생성
    def autoExcute(self):
        driver  = webdriver.Chrome('C://chromedriver.exe')
        driver.implicitly_wait(3)
        driver.get('http://www.naver.com')
        driver.maximize_window()
        id = self.lineEdit_ID.text()
        pw = self.lineEdit_PW.text()
        driver.find_element_by_class_name('lg_local_btn').click()
        driver.find_element_by_id('id').send_keys(id)
        driver.find_element_by_id('pw').send_keys(pw)
        driver.find_element_by_class_name('btn_global').click()
        time.sleep(3)
        driver.close()
#listWidget에 로그인 성공 표시
        self.listWidget.addItem('로그인 성공')
        # self.addItem()
 
 
if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    Dialog = QtWidgets.QDialog()
    ui = Ui_Dialog()
    ui.setupUi(Dialog)
    Dialog.show()
    sys.exit(app.exec_())
 

cs


코드를 실행시킨 후 아이디와 암호 입력 > 시작을 누르면 로그인 자동화가 진행되고 끝나면 로그인 성공 텍스트가 나타난다






아래와 같은 ui를 만든 후 naver.ui로 저장

UI 구조 - 각 클래스와 객체명 


naver.ui 를 열어보면 xml형태로 작성되어 있음


이 파일을 파이썬 .py 파일로 변환하기

파일있는 폴더경로로 이동해서 cmd 창에서 pyuic5 -x naver.ui -o naver.py  실행

그럼 naver.py 생성

naver.py를 열어보면

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# -*- coding: utf-8 -*-
 
# Form implementation generated from reading ui file 'naver.ui'
#
# Created by: PyQt5 UI code generator 5.11.2
#
# WARNING! All changes made in this file will be lost!
 
from PyQt5 import QtCore, QtGui, QtWidgets
 
class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(158234)
        self.textBrowser = QtWidgets.QListWidget(Dialog)
        self.textBrowser.setGeometry(QtCore.QRect(1016014161))
        self.textBrowser.setObjectName("textBrowser")
        self.label = QtWidgets.QLabel(Dialog)
        self.label.setGeometry(QtCore.QRect(70101616))
        self.label.setObjectName("label")
        self.label_2 = QtWidgets.QLabel(Dialog)
        self.label_2.setGeometry(QtCore.QRect(70702116))
        self.label_2.setObjectName("label_2")
        self.pushButton = QtWidgets.QPushButton(Dialog)
        self.pushButton.setGeometry(QtCore.QRect(401307523))
        self.pushButton.setObjectName("pushButton")
        self.lineEdit_ID= QtWidgets.QLineEdit(Dialog)
        self.lineEdit_ID.setGeometry(QtCore.QRect(203011320))
        self.lineEdit_ID.setObjectName("lineEdit")
        self.lineEdit_PW= QtWidgets.QLineEdit(Dialog)
        self.lineEdit_PW.setGeometry(QtCore.QRect(209011320))
        self.lineEdit_PW.setObjectName("lineEdit_2")
 
        self.retranslateUi(Dialog)
        QtCore.QMetaObject.connectSlotsByName(Dialog)
 
    def retranslateUi(self, Dialog):
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog""Dialog"))
        self.label.setText(_translate("Dialog""ID"))
        self.label_2.setText(_translate("Dialog""PW"))
        self.pushButton.setText(_translate("Dialog""시작"))
 
 
if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    Dialog = QtWidgets.QDialog()
    ui = Ui_Dialog()
    ui.setupUi(Dialog)
    Dialog.show()
    sys.exit(app.exec_())
cs

위와 같이 자동으로 코드로 변환되어 있음. 이 코드 안에서 이벤트를 연결하여 기능을 구현할 수 있음





파이썬에서 윈도우 프로그램을 만들고자 GUI 를 구성해야 했는데 찾아보니 대부분 Qt designer를 사용하고 있었다.

C:\Users\Administrator\AppData\Local\Programs\Python\Python37-32\Lib\site-packages

그래서 나도 설치를 해보려고 했는데 설치가 안된다.  파일도 내려받아 설치시도를 해보았지만 아래와 같은 메시지만 나온다.

Collecting pyqt5-tools

  Could not find a version that satisfies the requirement pyqt5-tools (from versions: )

No matching distribution found for pyqt5-tools

pyqt5_tools-5.7.dev10-cp35-none-win_amd64.whl is not a supported wheel on this platform.


버전이 지원하지 않는단다. 수소문 해보니 파이썬 최신 버전에서는 지원이 안된다고 한다.

파이썬 3.5? 버전까지만 되는 것 같았다. 하지만 이미 설치한 버전은 3.7.0 버전.. 


왜 최신 버전은 지원하지 않는 것인가? 방법이 있을 것 같아 검색해보니 pyside2 를 설치하면 Qt designer가 설치된다고 한다.

해당 링크

https://doc-snapshots.qt.io/qtforpython/gettingstarted.html

 cmd에서 다음을 설치한다

python -m pip install --index-url=http://download.qt.io/snapshots/ci/pyside/5.11/latest pyside2 --trusted-host download.qt.io

명령어가 안 먹힌다면 파일을 다운로드 받아서 직접 설치를 시도해볼 수 있다. 

파일링크 http://download.qt.io/snapshots/ci/pyside/5.11/latest/pyside2/


환경변수에 파이썬이 추가되었다면 pip install 부터 쳐도 상관없다. 그럼 설치가 진행된다.

설치가 끝나면 파이썬이 설치된 다음 경로로 이동한다.  

C:\Users\Administrator\AppData\Local\Programs\Python\Python37-32\Lib\site-packages\PySide2

그럼 designer.exe 파일을 볼 수 있다

구 버전이었다면 C:\Users\Administrator\AppData\Local\Programs\Python\Python37-32\Lib\site-packages 요 경로에 designer.exe 가 존재할 것이다.

하지만 파이썬 3.7.0 버전에서는 pyside2 를 설치해야 qt designer를 설치할 수 있는 것으로 보인다

파일을 실행하면 qt designer가 실행된다.





사전 작업은 링크 참고


파이썬에서 selenium을 이용하여 크롬 브라우저 띄우기

http://yonoo88.tistory.com/1200 





1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from selenium import webdriver
import time
 
driver = webdriver.Chrome('C://chromedriver.exe')
driver.implicitly_wait(3)
driver.get('http://www.naver.com')
 
driver.maximize_window()
 
 
driver.find_element_by_class_name('lg_local_btn').click()
driver.find_element_by_id('id').send_keys('아이디')
driver.find_element_by_id('pw').send_keys('비번')
driver.find_element_by_class_name('btn_global').click()
 
time.sleep(3)
driver.close()
cs






JAVA

driver.manage().window().maximize(); //브라우저 확장

Python

driver.maximize_window()


JAVA

Thread.sleep(500); //단위 ms

Python

import time #(import 필요)

time.sleep(0.5)     # 단위 s


JAVA

Alert alert = driver.switchTo().alert(); //얼럿 창으로 스위칭

Python

alert = driver.switch_to_alert()


JAVA

alertText = alert.getText(); //얼럿 창 메시지 추출

Python

alertText = alert.text


JAVA

driver.find_element_by_id('user_id').sendKeys('id'); //id 요소 찾기와 입력값 채우기

Python

driver.find_element_by_id('user_id').send_keys('id')


JAVA

driver.quit();

Python

driver.close()

+ Recent posts

티스토리 툴바