본문 바로가기

전체 글

티스토리 에버노트 글 불러오기 무한 로딩 에버노트를 주로 사용하여 블로그를 하는데 아래와 같은 로딩화면이 계속 나온적이 있었다. 아무 오류 메시지도 안나오지만 크롬 개발자도구로 보면 아래 이미지같은 내용을 확인할 수 있다. 브레이크 포인트를 걸고 새로 고침을 해보자. 에러코드 내용을 화면에 넣게끔 서버에서 주는데 예외처리가 빠진것 같다. ERROR_CODE내용을 보면 인증 만료로 보인다. 최근에 에버노트 인증 정보를 바꾼적이 있었어서 그런 것 같으니 다시 인증하자. 위 같은 경우는 그냥 계정 다시연결하기로 하면 안된다. 해제 했다가 다시 해야한다. 만약 브라우저에 이미 에버노트에 로그인되어있으면 그냥 되는 것 처럼 나오는데, 이 후 글쓰기 화면을 새로 고침해도 안된다면, 아에 새로 로그인해보자. 크롬이면 시크릿 탭을 통해서 새로 로그인 하는 것.. 더보기
PyQt5 QtTableWidget 값 변경 후 값 너비로 컬럼 크기 조정 테이블 위젯 내에 값들을 할당하고 해당 값들의 너비로 컬럼을 자동으로 resize하는 기능을 정리했다. 핵심은 테이블위젯의 setSizeAdjustPolicy()와 resizeColumnsToContents() 함수의 실행이다. QTableWidget에 해당하는 내용으로 대상의 값들을 임의로 채우고 테스트 해보자. 일반적으로는 이런식으로 너비가 QtDesigner에서 그린 너비로 처음에 나오게 된다. 위 같은 형태로 만들어보자.테이블은 testTable로 object name을 할당했다. table의 내용을 모두 채우는 동작을 하고 아래와 같이 정책을 설정하고 resize를 실행하자. self.testTable.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.Ad.. 더보기
logging을 이용한 ui 내 로그 출력 QtDesiger로 그린 화면에 프로그램의 로그를 출력해보자. 핵심은 logging.handler를 상속받은 사용자 정의 핸들러를 이용하는 것이다. 우선 핸들러를 하나 만들자. class LogStringHandler(logging.Handler): def __init__(self, target_widget): # 포맷터 및 레벨, 출력할 대상 위젯 설정 super(LogStringHandler, self).__init__() self.target_widget = target_widget def emit(self, record): # 대상 위젯에 로그 내용을 추가한다. self.target_widget.append(record.asctime + ' -- ' + record.getMessage())​ 생성.. 더보기
QtDesigner로 작성한 ui파일 로드 후 이벤트 주입 및 다루기 테스트로 작성한 윈도우에 신규 버튼과 이 버튼을 통한 테이블 제어, 상태바, 라벨, 텍스트 필드를 다뤄보려 한다. 버튼과 테이블, 상태바, 라벨, 텍스트 필드를 가진 윈도우화면은 아래와 같다. 테이블은 GroupBox 하위, ScrollBox 하위에 속하게 했고 버튼은 그룹 밖에 있다. 이 버튼과 테이블을 접근하기 위해서는 QtDesigner의 속성에서 objectName 잘 정해줘야 한다. 버튼은 testButton 테이블은 testTable 이제 각각에 함수를 만들어서 접근해보자. import sys from PyQt5.QtWidgets import * from PyQt5 import uic test_ui_class= uic.loadUiType("../ui/test_window.ui")[0] clas.. 더보기
QtDesigner로 만든 .ui파일을 .py로 바꾸지 않고 사용하기 QtDesigner로 만든 파일을 매번 python을 위해 바꾸는 건 고통스러운이다. 과거에 UI 바꾸고 컴파일하고 주입하고 하면서 노가다를 했었는데 정말 번거로웠다. 만든 ui파일을 넣고 그대로 사용하는 방법을 찾았다. 핵심은 uic를 import하고, 상속받은 클래스에서 ui 설정함수를 호출하는 것이다. import sys from PyQt5.QtWidgets import * from PyQt5 import uic test_ui_class = uic.loadUiType("../ui/test_window.ui")[0] class TestWindow(QMainWindow, test_ui_class): def __init__(self): super().__init__() self.setupUi(self) .. 더보기
직접코딩으로 PyQt 윈도우를 구성해보자 보통 PyQt QApplication를 인스턴스화 하고 이벤트 루프를 만들어서 UI와의 상호작용을 준비한다. 이제 상호작용할 UI를 만들어 보자. 이전에 클릭보다 더 다양하게 만들어서 쓸 수 있게 판을 깔고 시작하자. PyQt의 판을 위해 QMainWindow을 상속받은 클래스를 만들어서 이용하자. import sys from PyQt5.QtWidgets import * class TestWindow(QMainWindow): def __init__(self): super().__init__() if __name__ == "__main__": app = QApplication(sys.argv) app.exec_()​ 부모 클래스의 생성자를 super().__init__()으로 반드시 실행하도록 작성해야한다.. 더보기
python dictionary의 키만 복사 사용 딕셔너리를 다루는 작업을 하다가 딕셔너리 내 데이터가 변화로 인해 에러가 발생하는 경우가 있었다. 딕셔너리 전체를 다루지 않고 키만 참조해서 사용하는 반복문에서 이같은 문제가 발생해서 키만 복사하는 방법을 이용하였다. 키에 대해서만 정적으로 사용하고자 복사해서 사용하려는게 핵심이라 아래와 같이 진행했다. test_dict = {'a':{}, 'b':{}, 'c': {}} print('test_dict keys() %s' % (test_dict.keys())) temp_keys = set(test_dict.keys()) print('temp_keys copy from test_dict %s' % (temp_keys)) test_dict.update({'d': {}}) print('test_dict keys.. 더보기
pandas의 DataFrame개체 다루기 2차원형태의 자료구조를 만들 때 유용한 자료구조 0,1,2를 행 a,b,c를 열로 구성해보자 a b c 0 a0 b0 c0 1 a1 b1 c1 2 a2 b2 c2 위 같은 형태의 자료구조를 만들 때 사용하면 편하다. 우선 딕셔너리를 만든다. from pandas import DataFrame dict_temp = {'a': ['a0', 'a1', 'a2'], 'b':['b0', 'b1', 'b2'], 'c':['c0', 'c1', 'c2']} df_temp = DataFrame(dict_temp) print(df_temp) 위같은 결과가 나온다. 배열의 index에 따라 자동으로 번호가 할당되었다. 열에 접근할 때는 원래 python에서 하는 딕셔너리 접근 방식과 동일하다. df_temp['a'] Dat.. 더보기