PyQt 예제 1.1

그 동안 썼던 PyQt 글을 대신하고자 한다. 공부하고 있는 PyQt 책을 이해해서 옮기다 시피 했기 때문이기도 하고, 최근에 다시 공부를 하고 있기 때문이다.

간단한 프로그램 하나에 배운 것들 붙여 넣는 방식으로 공부를 하고 있다. 그래서 이를 이용해서 글을 쓰고자 한다.

그리고 글을 써 나아가면서 프로그램 하나를 만들어 보겠다. 책에서 배운 내용들을 하나의 프로그램에 모두 넣어보는 것이다.

쓸모 있는 프로그램은 아니겠지만, 그래도 이후에 많은 도움이 될 것이라고 생각된다.

그래서 최근에 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')
??

댓글 없음:

댓글 쓰기