지식메모/Python


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()




  File "C:\Users\NTS\Desktop\python\automation.py", line 19

    driver.find_element_by_id('setPwd').click()

                                              ^

TabError: inconsistent use of tabs and spaces in indentation


이러한 에러가 발생


검색해보니 들여쓰기 문제라고 한다.


겉으로 보기엔 아무  문제 없어 보이는 19번 라인



들여쓰기를 다시하기 위해 Shift + Tab 으로 해당 라인을 왼쪽 끝까지 붙여놓은 뒤 다시 탭을 눌러 알맞은 들여쓰기로 수정한다.



그리고 다시 실행하면 해결.


코드 복붙으로 자주 발생하는 현상으로 너무 많은 탭을 수정해야할 때는 사용 중인 에디터마다 일괄  수정 방법이 있으니 찾아보는게 좋다.



참고로 Atom 에디터에서 스페이스와 탭을 표시 하려면 

Package > Settings View > Show keybindings 에서 Editor 탭 아래로 내려가면



Show Indent Guide

Show Invisible


요 2개를 체크해준다. 이걸 해주게 되면


점으로 스페이스가 표현되고 4칸마다 선이 표시된다.

줄바꿈도 표시된다


  






사전 작업이 필요(환경변수에 파이썬도 추가되어있는 상태)


selenium 설치 
cmd 창에서 pip install selenium 으로 설치한다.

크롬드라이버 내려받기

https://sites.google.com/a/chromium.org/chromedriver/downloads


경로는 편한 곳으로 내려받기



절대 파일명은 selenium.py 로 하지 말것! 모듈명이 selenium이라 이름이 같으면 실행이 안된다고 한다

멋 모르고 파일명을 selenium으로 해놨다가 삽질함

from selenium import webdriver

driver = webdriver.Chrome('C://chromedriver.exe')
driver.implicitly_wait(3)
driver.get('http://www.naver.com')

위 코드를 작성하고 파이썬 실행








안드로이드 칼라배시 is not signed with any of the available keystores 


문제 해결하기


해결하기 앞서

필히 cmd 창에서 chch 65001 을 실행하여 변경해주어야 한다

그럼 다음과 같이 바뀐 다음에 실행해줘야 한다.




calabash-android run ~~~.apk를 실행하면


다음과 같은 문제가 발생하는 경우가 있다.




apk 사인이 되지 않았다고 하는데 사인을 해줘야 한다.

뭐.. 재서명 과정이라고 보면 될듯한데..




calabash-android resign [apk가 있는 경로]


또는 현재 위치가 apk가 있는 폴더라면 바로


calabash-android resign ~~~.apk


실행한다. 



아무 문제 없이 넘어가면 성공.




그렇지만 이렇게 호락호락하지 않을게 뻔하기 때문에 저대로 안될 수가 있다.


그럼 우선 사인을 하는데 필요한 파일


zipalign 


파일이 있는지 확인한다.



이 파일은 sdk 폴더에서 확인할 수 있는데


sdk > build-tools 폴더에 보면 설치된 API 레벨 마다 폴더가 있는데



각 폴더에 들어가 보면



맨 아래에 있는게 zipalign 파일이다.



만약 이 파일이 없다면


해결책이 될진 모르겠지만 꼼수로


https://developer.android.com/sdk/index.html#Other


위 링크에서 sdk를 다운 받아 설치 후 zipalign 파일을 찾아 각 API 폴더에 넣어준다.


혹시 몰라 첨부해놓음


zipalign.exe




그래도 안된다면 환경변수에 경로를 추가해주었는지 확인


시스템 변수에 ANDROID_HOME 이 없다면


ANDROID_HOME 을 추가하여 sdk 경로를 넣어주고







Path를 열어 zipalign 이 있는 경로를 추가해준다.


ex) ;%ANDROID_HOME%\build-tools\22.0.1





그리고 cmd 창을 새로 열고 chcp 65001 로 변경 후 


calabash-android resign [apk가 있는 경로] 를 실행하면


뭐가 쫙 나오면서 기기에 앱이 자동으로 설치될 것이다.



마지막 에러가 난 건 my_first.feature 파일의 스크립트를 아직 작성하지 못해 난거라

스크립트를 제대로 작성해야한다.


스크립트 작성법에 대해 알아봐야겠다.






보석 또는 핑클 노래인줄만 알았던

Ruby 

언어로 해야될게 있다고 해서 시도해보았다.


일단 툴이 중요한데 이클립스에서도 플러그인이 있다고 하여 다행이었다.


새로 툴 깔아서 그거 익히는 것보다는 훨씬 나을테니..


우선 이클립스 상단 Help > Install New Software 를 클릭


Add를 누른 후 다음 주소를 넣어준다.


http://download.aptana.com/studio3/plugin/install




그럼 Aptana Studio3 라고 나오는데 이걸 설치해준다.




설치가 끝나고 이클립스 재부팅을 한다.


그리고 프로젝트를 생성하는데



루비 프로젝트가 생겼다.

만약 없으면 밑에 Project...를 눌러 루비 프로젝트를 선택한다.



프로젝트를 생성 후 우클릭

New > File 을 선택




파일을 생성하는데 꼭 파일명 뒤에 ruby 확장자인

.rb 

를 붙여준다.





그럼 파일이 생긴다.


테스트 용으로 파일을 더블클릭해 연 뒤

puts "hello ruby"


입력 후 Run 하면 하단에 결과가 나타난다.





+번외


그리고 사실 RDT를 설치하면 된다고 했는데 설치해도 루비 프로젝트가 나오지 않아 Aptana를 설치했다.


혹시 Aptana를 설치하고도 안된다면 이걸 설치해볼 수 있다.


RDT 설치는 똑같다.


http://download.aptana.com/tools/radrails/plugin/install/radrails-bundle



Rails 를 설치한다.



똑같이 설치해주면 된다.



  1. 잘보고가요 2015.10.29 02:26 신고

    정말 잘 보고 가요 자료가 너무 좋네요 ㅎㅎ




설치 환경

Windows 7 64bit


안드로이드 칼라배시 설치하기




그래서 루비 언어 설치부터 해야한다.


벌써부터 예감이 안 좋은게 설치하면서 삽질만 푸다 우물을 발견할 것만 같다.




이부분은 환경변수 설정 부분이지만

인터넷 찾다보니 서로 설치환경이 달라 이것저것 시도해 본 방법이므로

우선 무시하고

혹시나 밑에 과정에서 안되는 부분이 있다면 시도해볼 수 있다.



이미 이클립스와 자바가 설치되어 있다면 환경변수는 다 되어있다는 상태로 가정한다.


혹시 모르니 ANDROID_HOME 이라는 시스템 환경변수를 추가하여

변수 값은 sdk 폴더(또는 android-sdks 폴더) 경로로 지정해준다.




또 시스템 변수 Path 를 열어

;D:\backup\eclipse\adt-bundle-windows-x86_64-20140702\sdk\platform-tools




platform-tools 폴더 경로 추가해준다.

추가할 때 앞에 세미콜론 ; 필수



sdk 안 깔려 있다면

http://developer.android.com/sdk/index.html#Other


여기서


installer_r24.2-windows.exe(Recommended)


이걸 받는다.





우선 루비를 다운받아야 한다.


http://rubyinstaller.org/downloads/


위 링크로 들어간다.

그럼 아래와 같은 사이트가 나타나는데



우선 RubyInstaller 에서 최신 버전을 받는다.

윈도우 64비트이므로 64비트 버전을 다운로드


그리고 아래 쪽에 DEVELOPMENT KIT 도 다운받아야 한다.

이것도 최신버전으로 64비트로 다운로드 하였다.




다운받은 Ruby 2.2.2(x64) 를 실행시킨다.

그럼 중간에 아래와 같은 화면이 나타나는데 일단 다 체크했다.




그리고 쭉 install 한다.


cmd 창에서 

ruby -v

라고 치면 루비 버전이 나타날 것이다.

그럼 일단 루비 설치 끝




이제 DEVELOPMENT KIT 를 설치한다.

이건 설치가 아니라 그냥 압축이 풀릴 것이다.


C 드라이브에 DevKit 폴더를 만들어 풀어 놓았다.


임의의 폴더에 압축을 풀고 나서


cmd 창을 킨다.


그리고 해당위치로 이동

C:\Devkit


그리고 


ruby dk.rb init


을 입력한다.


그럼 어쩌구 저쩌구 나오고


ruby dk.rb install -f 


라고 입력한다


그런데!!



위 와 같이 나온다면 

Devkit 폴더로 가서 

config.yml

을 수정해주어야 한다.



파일을 메모장으로 열어보면 아마


# This configuration file contains the absolute path locations of all

# installed Rubies to be enhanced to work with the DevKit. This config

# file is generated by the 'ruby dk.rb init' step and may be modified

# before running the 'ruby dk.rb install' step. To include any installed

# Rubies that were not automagically discovered, simply add a line below

# the triple hyphens with the absolute path to the Ruby root directory.

#

# Example:

#

# ---

# - C:/ruby19trunk

# - C:/ruby192dev

#

---


이렇게 되어있을텐데


# - C:/ruby192dev


이걸 루비가 설치된 폴더 경로로 바꿔주어야 한다.





 위 사진 처럼 루비 폴더 경로로 바꿔준다.


앞에 # 표시 꼭 삭제해준다.

#이 있으면 주석으로 인식해서 적용되지 않는다.


그럼 다시 cmd 창으로 돌아와서

(기존 cmd 창 끄고 새로 킨다)

다시 시도 한다.


ruby dk.rb install -f



아까와는 다른 문구다! 아무래도 잘된거 같다.


루비 설치 끝!



Android calabash 설치 후 apk 실행하기


이제 칼라배시를 설치한다.


gem install calabash-android


입력



그럼 뭔가 주르르륵 나온다.


설치됐다.


혹시 Couldn't reserve space for cygwin's heap 에러가 뜬다면


 Ruby 설치 폴더의 bin 디렉토리의 msys-1.0.dll 파일을 url의  msys-1.0.zip 파일 다운 받아 덮어쓴 후 위 cmd 다시 실행하면 된다고 한다.


이제 아무 위치에 폴더를 생성한다.

D:/testapp 라고 생성했다 치면


cmd 창에서 D:/testapp 경로로 이동하여


calabash-android gen 


을 실행하면 



Question 문구 나오면 엔터치고 하면 features 폴더가 생성될 것이다.

실제로 testapp 폴더에 들어가면 생성되어 있을 것이다.


또 들어가면 my_first.feature 라는 파일이 있는데 거기다 스크립트를 작성하면 된다.


그리고 이제 테스트 해볼 apk 파일을 해당경로에 복사해놓자

testapp 폴더에 복사해놓고


calabash-android run ~~.apk 


를 실행하는데 잘되면 다행인데 CP949 어쩌구 에러가 뜬다면


chcp 65001 을 입력하여



위와 같이 변경 후 시도한다.


잘되면 다행인데 또 뭔가 터진다.


apk 서명 문제가 발생하는데 이건 링크로 첨부


http://yonoo88.tistory.com/670



일단 설치는 했고 이제 활용법을 알아야하는데 뭐가 뭔지 모르겠다..







+ Recent posts

티스토리 툴바