Computer Science/Python

Python GUI PyQt4 vs WxPython

Taewon Heo 2017. 5. 20. 23:40

[Python GUI PyQt4 vs WxPython]



Python으로 GUI Application을 만드는데에는 몇 가지 선택지가 있다.


Mobile이면 Kivy도 좋은 선택지라고 생각한다. 

Kivy는 터치가 가능한 어플리케이션을 만들기 좋고 멀티터치도 가능하다.


반면, Desktop Application을 만들거라면 PyQt4와 WxPython으로 좁혀진다.


둘 다 멋진 라이브러리이고, 만들고자하는 것의 대부분을 만족 시킬 수 있을 것이다.


나는 PyQt4를 먼저 사용해보고 WxPython으로 넘어간 케이스이다.


PyQt 이하 Qt를 사용하며 느낀점은, UI Component를 배치하는 방식이 쉽다. 복잡하고 정교하게도 가능하다. 

self.layout = QtGui.QGridLayout()
self.label_currentDB = QtGui.QLabel("Current Database : ")
self.label_currentDB.setFixedWidth(130)
self.label_newDB = QtGui.QLabel("New Database : ")
self.label_newDB.setFixedWidth(130)
self.Edit_currentDB = QtGui.QLineEdit()
self.Edit_currentDB.setFixedWidth(130)
self.Edit_currentDB.setText(ChangeDB.currentDB)
self.Edit_newDB = QtGui.QLineEdit()
self.Edit_newDB.setFixedWidth(130)
self.button_change = QtGui.QPushButton("Change")
self.button_change.clicked.connect(self.changeDB)
self.Edit_newDB.returnPressed.connect(self.changeDB)
self.button_cancel = QtGui.QPushButton("Cancel")
self.button_cancel.clicked.connect(self.close)
self.myQMenuBar = QtGui.QMenuBar(self)
self.layout.addWidget(self.label_currentDB, 0, 0, 1, 1)
self.layout.addWidget(self.label_newDB, 1, 0, 1, 1)
self.layout.addWidget(self.Edit_currentDB, 0, 1, 1, 1)
self.layout.addWidget(self.Edit_newDB, 1, 1, 1, 1)
self.layout.addWidget(self.button_change, 4, 0, 1, 1)
self.layout.addWidget(self.button_cancel, 4, 1, 1, 1)
self.setLayout(self.layout)

Wx는 느낌이 아래와 같이 Boxsizer라는 것을 사용해서 배치를 한다.
Qt도 레이아웃이라는 개념을 사용해서 레이아웃 안에 레이아웃과 같이 배치를 정교하게 할 수 있다.
vbox = wx.BoxSizer(wx.VERTICAL)
box = wx.StaticBox(panel, -1, 'Change DB')
bsizer = wx.StaticBoxSizer(box, wx.VERTICAL)
nmbox = wx.BoxSizer(wx.HORIZONTAL)
fn = wx.StaticText(panel, -1, "Input IP :")
nmbox.Add(fn, 0, wx.ALL | wx.CENTER, 5)
self.nm1 = wx.TextCtrl(panel, -1, style=wx.ALIGN_LEFT)
nmbox.Add(self.nm1, 0, wx.ALL | wx.CENTER, 5)
bsizer.Add(nmbox, 0, wx.ALL | wx.CENTER, 10)
hbox = wx.BoxSizer(wx.HORIZONTAL)
okButton = wx.Button(panel, -1, 'Change')
hbox.Add(okButton, 0, wx.ALL | wx.LEFT, 10)
cancelButton = wx.Button(panel, -1, 'Cancel')
hbox.Add(cancelButton, 0, wx.ALL | wx.LEFT, 10)
vbox.Add(bsizer, 0, wx.ALL | wx.CENTER, 5)
vbox.Add(hbox, 0, wx.ALL | wx.CENTER, 5)
panel.SetSizer(vbox)
self.Centre()
panel.Fit()
self.Show()
okButton.Bind(wx.EVT_BUTTON, self.OnOk)
cancelButton.Bind(wx.EVT_BUTTON, self.OnCancel)

사용해본 바로는 내가 구현하고 싶은 방법으로 구현하는 데에는 Wx가 낫다고 평가하고 싶다.
Staticbox와 같은 컴포넌트나, 몇 가지 세부적인 UI 컴포넌트가 좀더 있었다.
그리고 dialog창에서 OK를 눌렀을 때 parent에서 어떻게 동작하는지 정하기도 그렇고,
Wx를 좀 더 깊게 파서 그런지 몰라도 나는 Wx가 더 풍부하게 활용 가능하다고 생각한다.

처음에 Qt를 사용할지 Wx를 사용할지 고민 많이하다가 둘다 사용해 본 바로는 Wx에 손을 들어주고 싶다.