반응형
이번에도 역시 저번처럼 메뉴 바와 툴 바를 추가할 예정입니다. 다만 이번에 추가할 동작은 계산기로, 단순한 함수보다 어떤 클래스를 이용하여 구현된 함수를 통하여 계산기 기능을 추가하도록 하겠습니다.
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 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 | from PyQt4.QtGui import * from PyQt4.QtCore import* import sys class MyWindow(QMainWindow): def __init__(self): QMainWindow.__init__(self) ### 윈도우 특성 설정 ### self.setWindowTitle('PEDU') self.setGeometry(400,200,1500,600) #self.setWindowIcon(QIcon('')) self.statusBar().showMessage('ready') self.creat_menubar_child() self.creat_menubar() self.show() def creat_menubar_child(self): ### 메뉴바 설정 ### #load file self.fileAction1 = QAction("load file",self) self.fileAction1.setShortcut("Ctrl+O") self.fileAction1.setStatusTip("Load the file in local place")# 밑에서 상태를 알려줌 self.fileAction1.triggered.connect(self.open_file) #exit self.fileAction2 = QAction("Exit",self) self.fileAction2.setShortcut("Ctrl+C") self.fileAction2.setStatusTip("Exit the App") self.fileAction2.triggered.connect(self.close_window) #change font self.fileAction3 = QAction("Change Font",self) self.fileAction3.setShortcut("Ctrl+T") self.fileAction3.setStatusTip("Change the string font in application") self.fileAction3.triggered.connect(self.change_font) #calculater self.fileAction4 = QAction("Calculater", self) self.fileAction4.setShortcut("Ctrl+E") self.fileAction4.setStatusTip("Pop up the calculater") self.fileAction4.triggered.connect(self.popCalc) def creat_menubar(self): ### MenuBar ### mainMenu = self.menuBar() #File fileMenu1 = mainMenu.addMenu('File') fileMenu1.addAction(self.fileAction1) fileMenu1.addAction(self.fileAction2) #Option fileMenu2 = mainMenu.addMenu('Options') fileMenu2.addAction(self.fileAction3) #Tool fileMenu3 = mainMenu.addMenu('Tools') fileMenu3.addAction(self.fileAction4) ### toolbar 설정 ### #open_file # openIcon = QIcon() # openIcon.addFile('openFileImage2.png', QSize(16,16)) # openAction = QAction(toolIcon, 'open_file', self) openAction = QAction(QIcon('file_open.png'), 'Open', self) openAction.triggered.connect(self.open_file) #exit_file exitAction = QAction(QIcon('exit.png'), 'Exit', self) exitAction.triggered.connect(self.close_window) #change_font setFontAction = QAction(QIcon('option.png'), 'Setting', self) setFontAction.triggered.connect(self.change_font) #pop_calculater calcAction = QAction(QIcon('calculater.png'), 'Calculater', self) calcAction.triggered.connect(self.popCalc) #open_file2 self.openToolBar = self.addToolBar("Open") self.openToolBar.addAction(openAction) #exit_file2 self.exitToolBar = self.addToolBar("Exit") self.exitToolBar.addAction(exitAction) #change_font2 self.setToolBar = self.addToolBar("Setting") self.setToolBar.addAction(setFontAction) #pop_calculater2 self.calcToolBar = self.addToolBar("Calculater") self.calcToolBar.addAction(calcAction) def open_file(self): global filename filename = QFileDialog.getOpenFileName(self, "Select file") global Pfile Pfile = pefile.PE(filename) def close_window(self): result = QMessageBox.question(self, 'Message',"Are you sure you leave?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No) if result == QMessageBox.Yes: sys.exit() else: pass def change_font(self): font, valid = QFontDialog.getFont() if valid: self.styleChoice.setFont(font) def popCalc(self): form = calculater() form.show() class calculater(QDialog): # 창 초기화 def __init__(self, parent=None): super().__init__(parent) self.old = '' self.new = '0' self.operator = '' layout = QGridLayout() self.label = QLabel() self.label.setText('<p align="right"><font size=30><b>' + self.new + '</b></font></p>') layout.addWidget(self.label, 0, 0, 1, 4) # 0, 0 위치에서 행으로 1칸, 열로 4칸의 크기를 갖도록 함. # 버튼 생성과 위치 지정 for index, value in enumerate(['7', '8', '9', '/', '4', '5', '6', '*', '1', '2', '3', '-', '0', '.', '=', '+']): button = QPushButton(value) layout.addWidget(button, index // 4 + 1, index % 4) self.setLayout(layout) self.setWindowTitle('계산기') for index, value in enumerate(['7', '8', '9', '/', '4', '5', '6', '*', '1', '2', '3', '-', '0', '.', '=', '+']): button = QPushButton(value) layout.addWidget(button, index // 4 + 1, index % 4) if value in ['/', '*', '-', '+', '=']: self.connect(button, SIGNAL('clicked()'), lambda who=value: self.calculate(who)) else: self.connect(button, SIGNAL('clicked()'), lambda who=value: self.num_input(who)) # 레이블 업데이트 def updateResult(self, text): self.label.setText('<p align="right"><font size=30><b>' + text + '</b></font></p>') # 항상 현재 값을 표시. # 계산 메소드 def calculate(self, who): try: # = 버튼 처리 if who == '=': # 이전 값과 연산자가 있을 때만 계산 if self.old != '' and self.operator != '': self.new = str(eval(self.old + self.operator + self.new)) self.old = '' self.operator = who # 연산자 처리 else: # 이전 값이 있을 경우 이전 값과 현재 값을 계산 후 연산자 대입. if self.old != '': self.new = str(eval(self.old + self.operator + self.new)) self.old = '' self.operator = who except: self.new = '오류!' self.old = '' self.operator = '' self.updateResult(self.new) # 숫자와 소수점 처리 def num_input(self, who): # 오류가 발생한 경우 초기화 if self.new == '오류!': self.new = '0' self.old = '' self.operator = '' # 계산 후 숫자를 누르면 초기화 if self.operator == '=': self.new = '0' self.operator = '' # 이전 값은 없고, 연산자가 있을 경우 이전 값에 현재 값을 대입하고, 현재 값 새로 입력. if self.old == '' and self.operator != '': self.old = self.new if who == '.': self.new = '0.' else: self.new = who # 일반적인 경우 else: # 소수점일 경우 현재 값에 소수점이 없을 때만 소수점 입력. if who == '.': if '.' not in self.new: self.new = self.new + who else: # 현재 값이 0일 경우 숫자를 누르면 그 숫자가 바로 입력. if self.new == '0': self.new = who else: self.new = self.new + who self.updateResult(self.new) if __name__ == '__main__': app = QApplication(sys.argv) ex = MyWindow() sys.exit(app.exec_()) | cs |
실행 화면은 다음과 같습니다.
단순히 계산기를 과정이었습니다만, 조금 복잡한 클래스를 사용하기 때문에 추가적으로 집필하였습니다. 이 과정을 통해서 한가지 기능을 추가할 때 어떤 어떤 것을 추가해야 할 지 파악하는데 도움이 될 것 같습니다.
반응형
'Side Project# > PEDU' 카테고리의 다른 글
Develop PEDU with pyqt4 - 4 (0) | 2018.06.27 |
---|---|
Develop PEDU with pyqt4 - 2 (0) | 2018.06.27 |
Develop PEDU with pyqt4 - 1 (0) | 2018.06.27 |
Develop PEDU with pyqt4 (0) | 2018.06.26 |