간단한 프로그램 하나에 배운 것들 붙여 넣는 방식으로 공부를 하고 있다. 그래서 이를 이용해서 글을 쓰고자 한다.
그리고 글을 써 나아가면서 프로그램 하나를 만들어 보겠다. 책에서 배운 내용들을 하나의 프로그램에 모두 넣어보는 것이다.
쓸모 있는 프로그램은 아니겠지만, 그래도 이후에 많은 도움이 될 것이라고 생각된다.
그래서 최근에 github 에 이 프로그램에 대한 프로젝트를 열었다. (첫 공개 프로젝트가 되었다...)
git의 주소는 아래와 같다.
https://github.com/bluekyu/PyQt-Examples
여기서 프로젝트 젠체를 가져올 수도 있고, 마지막 프로그램만 가져올 수도 있다. 가져오는 방법은 간단히, git https://github.com/bluekyu/PyQt-Examples.git 을 하면 된다. 옆의 다운로드는 마지막 커밋한 내용을 받는 것이다.
----------------------------------------------------------------------------------------------------------
일단, 지난 글에 적어두었던 Python 2 버전 기준의 내용을 옮겨는 두겠다.
그리고 Python 3 에서는 아래 내용을 염두해둘 필요가 없다. Python3 부터 유니코드를 지원하기 때문에 QString과 Python3의 문자열이 호환된다.
참고 문헌: Rapid GUI Programming with Python and Qt
PyQt 의 GUI 프로그래밍을 하기 전에 알아 두어야 할게 있다.
PyQt 에는 QString 이라는 새로운 문자열 타입이 있다. 원래 Qt 가 C++ 로 부터 나왔기 때문에 C++ 에는 유니코드가 존재하지 않았으므로 Qt 내에 다국어 지원을 위한 QString 을 두게 된 것이다.
그러나 파이썬은 유니코드를 지원하므로 QString 을 쓸 필요가 없을 것 같지만 PyQt 함수가 QString 을 사용하므로 자동적으로 문자열을 QString 타입으로 바꾸게 될 것이다.
이렇게 되면 문자열 인코딩에 혼동이 생기게 되므로 나중에 프로그램을 만들었을 때 어떤 오류가 발생할지 알 수가 없다. 따라서 일정한 규정이 필요하다.
책에 따르면 아래와 같은 규정을 두었다.
1. 오직 7비트 ASCII 문자열을 사용한다면 str 타입을 사용한다.
2. 오직 PyQt 에 의해 사용되는 문자열은 QString 타입을 유지한다.
3. 그 외에 문자열은 유니코드를 사용하고, QString 을 파이썬 함수 내에서 사용하게 되면 유니코드로 즉각 바꾼다.
이러한 규정을 둔 이유는 파이썬 함수가 QString 타입에서는 에러를 일으킬 수 있기 때문이다.
>>> from PyQt4.QtCore import * >>> a = QString('한글') >>> b = QString('English') >>> a PyQt4.QtCore.QString(u'\xed\x95\x9c\xea\xb8\x80') >>> b PyQt4.QtCore.QString(u'English') >>> print a Traceback (most recent call last): File "<pyshell#5>", line 1, in <module> print a UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-5: ordinal not in range(128) >>> print b English위에서 처럼 QString 에 영문을 넣었을 때는 잘 되지만 한글을 입력하면 잘 안된다.
(다만, IDLE 의 디폴트 인코딩이 ASCII 가 아닌 mbcs 나 cp949 로 되어 있다면 문제 없이 실행된다.)
그리고 주의할 점으로 QString 에 한글을 사용할 때 위에서는 유니코드를 사용하지 않았다. 그래서 인코딩이 유니코드가 아닌 utf-8 인코딩이 되었다.
그런데 문자열 앞에 u 가 자동으로 붙어버림으로써 유니코드로 인식이 되어 버렸다. 이로 인해 QString 이 저장된 변수 a 를 유니코드로 변환하면 잘못된 변환이 이루어진다.
따라서 QString 에 한글을 쓸 때는 미리 유니코드로 변환을 시켜야 한다.
>>> a = QString(unicode('한글', 'utf-8')) >>> a PyQt4.QtCore.QString(u'\ud55c\uae00') >>> print a Traceback (most recent call last): File "<pyshell#11>", line 1, in <module> print a UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128) >>> print unicode(a) 한글
위에 글을 다시 읽게 되었는데, 읽고 나서 스스로 이해를 못하겠다... 따라서 추가 코드를 아래에 추가해두었다.
>>> from PyQt4.QtCore import * >>> a = QString('한글') >>> a PyQt4.QtCore.QString(u'\xed\x95\x9c\xea\xb8\x80') >>> print a Traceback (most recent call last): File "", line 1, in UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-5: ordinal not in range(128) >>> print unicode(a) íê¸ >>> print unicode(a, 'utf-8') 한글 >>> b = QString(unicode('한글', 'utf-8')) >>> b PyQt4.QtCore.QString(u'\ud55c\uae00') >>> print b Traceback (most recent call last): File " ", line 1, in UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128) >>> print unicode(b) 한글 >>> print unicode(b, 'utf-8') ??
댓글 없음:
댓글 쓰기