ããŒã«ãå¿
èŠã§ããã ã·ã£ãŒããå®çšçãå€çšéã å¿
èŠã«å¿ããŠãã¹ãŠã®èŠä»¶ãæºãããæ¡åŒµå¯èœã§ãã
ããããã·ã³ãã«ã§äŸ¿å©ã§ãã äž»ãªä»äºã§ã¯éçºè
ã§ã¯ãªããããäœæ¥äžã®ã³ã³ãã¥ãŒã¿ãŒã«æ°žç¶çãªããã°ã©ãã³ã°ç°å¢ã¯ãªããå¿
èŠã«å¿ããŠãMSOfficeã®batãJScriptãVBAïŒã¯ããããã¯WindowsãäŒæ¥ã·ã¹ãã ããããbashãšperlããã®ãŸãŸãïŒãç°ãªããœãããŠã§ã¢ã®ãã¯ããªã©ã ãããã¯ãã¹ãŠçŸåšã®åé¡ã®è§£æ±ºã«åœ¹ç«ã¡ãŸãããã¬ãã«ãšæ©èœã¯ç§ãæãã§ãããã®ã§ã¯ãããŸããã
èŠããã«ããã¡ã€ã«ã®è§£æãšå€æãããŒã¿ããŒã¹ãžã®ç»ããã¬ããŒãã®åä¿¡ãWebãµãŒãã¹ã®åŒã³åºããdirã§ã®ãªã¯ãšã¹ãã®çæãªã©ãå¯èœãªãçµã¿èŸŒã¿ããã°ã©ãã³ã°èšèªãåããçµ±åç°å¢ãå¿
èŠã§ãã
ããªãã¯ä»ããã¹ãŠã®å³ãšè²ã®ããã®ããŒã«ããããšèšãã§ãããããã éžæããŠãã ããã Oracleã®å¥åTOADã«ãšã«ããã¹ã®SoapUIããã®ä»ãã¹ãŠã®GNUããã³Apache補åã
ãããåé¡ã¯ããããã¯ãã¹ãŠ1ã€ã®ã¢ã¯ãã£ããã£ã«ç¹åãããŠããããäžæ¹ã§ãããŸãã«ãæ®éçã§ãããšããããšã§ãã æ©äŒã補åã«ãªãå Žåãè¿œå ããããšã¯ã§ããŸããã 補åãéããŠãããããã©ã°ã€ã³ãéçº/賌å
¥ãããããœãŒã¹ãããŠã³ããŒãããŠç解ããå¿
èŠããããŸãã ããããåçŽãªã¢ã¯ã·ã§ã³ãåçŽã«å®è¡ããããŒã«ãå¿
èŠã§ããããè€éãªã¢ã¯ã·ã§ã³ã«å°ãæéãè²»ããããã¹ãŠãç°¡åã«ãªããŸããã
ãããã£ãŠãå¿
èŠãªã¢ãžã¥ãŒã«ãèµ·åããæãåçŽãªã·ã§ã«ãèªåã§æ§ç¯ããããšã«ããŸããã ã·ã§ã«ã¯æ¡åŒµå¯èœã§ãããã¢ãžã¥ãŒã«ã¯ã·ã³ãã«ã§ãã·ã§ã«ããå¯èœãªéãç¬ç«ããŠããŸãã
ããã°ã©ãã³ã°èšèªãšããŠãç¹å®ã®ã¿ã¹ã¯ã®ããã«ç°¡åã«åæ§ç¯ã§ããããã«ãã³ã³ãã€ã«ãå¿
èŠãšããªãããŸãã¯æå°éã®ã³ã¹ãã§äœããåãå¿
èŠããããŸãã
Javascriptã¯å°ããªã¹ã¯ãªããã«é©ããŠããŠé©åã§ããããŠã£ã³ããŠã€ã³ã¿ãŒãã§ã€ã¹ã¯ãããŸããããŸããWindowsåãã«NodeJSãããŒã«ã«ã§äœæãããã©ãŠã¶ãšæŠãããšã¯ç§ã«ãšã£ãŠèå³ã®ãªãããšã§ãã
PerlãPHPãåãåé¡ã§ãã
Visual BasicãšVBScript-ãŸããããã¯Windowsã®äžã«ãããŸãã ã¯ããç§ãä»äºãããåèªã®ãããšã³ã¿ãŒãã©ã€ãºITã·ã¹ãã ã®ã»ãšãã©ã¯Windowsã§ãã ãããŠããããã«Officeãããããããã£ãŠVBAããããŸãã ããããåžžã«äœ¿ãããããšããããªããã¯ãã¹ãã©ãããã©ãŒã ã§ãã
éžæè¢ã¯Python + PyQt5ã«ãããŸããã Pythonãããªã€ã³ã¹ããŒã«ãããŠããRaspberry Raspberry PiãããïŒãã¡ããHabrã«å ããŠïŒèšèªã®ååšã«ã€ããŠåŠã³ãŸããã ãã³ã®å
èš³ã¯Telegramã®ãããã§ããã¬ãŒãºã®å矩èªãæ¢ããŠããŸããïŒ
pymorphy2ãšYARNã§ãèå³ãããã°èª¬æããŸãïŒã ãããŠãç§ã¯ãã§ã«Qtãç¥ã£ãŠããŸããã
pip3 install pyqt5
æåã«ãããŒã¿ããŒã¹ãç
§äŒããããã®æ±çšã¢ãžã¥ãŒã«ãäœæããŸãã ãããŠããªã¯ãšã¹ããšãã®ãã©ã¡ãŒã¿ãŒãã¢ãžã¥ãŒã«ã®å€åŽãiniãã¡ã€ã«ã§å®çŸ©ãããã¢ãžã¥ãŒã«ãã€ã³ã¿ãŒãã§ãŒã¹ãšã®ãã¹ãŠã®äœæ¥ãããŒã¿ããŒã¹ãšã®äœæ¥ãããŒã¿ã®è¡šç€ºã«åŸäºããããã«ã
PyQtãæ¥ç¶ããŸãã Qtã®åœåèŠåã¯å³å¯ã§ããããããã¹ãŠãé£ç¶ããŠã€ã³ããŒãããŸãããå¹²æžããŸããã
from PyQt5.QtCore import * from PyQt5.QtWidgets import * from PyQt5.QtSql import *
Qtã®ãšã©ãŒã¡ãã»ãŒãžãšèŠåã倱ãããªãããã«ã
ããã§ææ¡ããããã«ãã¢ãžã¥ãŒã«ãã¡ãã»ãŒãžãã³ãã©ãŒã«æ¥ç¶ããŸãã
import meshandler
ããã§è©°ãŸããªãããã«ãå¥ã®ã¢ãžã¥ãŒã«ã§ããŒã¿ããŒã¹ã«æ¥ç¶ããŸã
import dbpool
QDialogã«åºã¥ããŠã¯ã©ã¹ãäœæããŸãããïŒQWidgetãé©ããŠããŸãããããã©ã«ãã§ã¯ãã¿ã³ã¯æ©èœããŸããïŒ
class PyExecutor(QDialog): def __init__(self, iniFile, parent=None): super(PyExecutor, self).__init__(parent) self.setWindowFlags(self.windowFlags() | Qt.WindowMinimizeButtonHint | Qt.WindowMaximizeButtonHint )
ãŠã£ã³ããŠãäžããäžã«åãã
self.topLay = QVBoxLayout(self) self.topLay.setContentsMargins(6,6,6,6)
ãã©ã¡ãŒã¿ãšãã¿ã³ãå
¥åããããã®ã¹ããŒã¹ã®ããã¬ã€ã¢ãŠã
self.lay = QFormLayout() self.topLay.addLayout(self.lay)
åºåã®å Žæ
self.resultLay = QVBoxLayout() self.topLay.addLayout(self.resultLay)
ãããŠã¹ããŒã¿ã¹ããŒã¯
self.bar = QStatusBar(self) self.topLay.addWidget(self.bar)
iniãã¡ã€ã«ãããŠã³ããŒãããŸãã å¿
èŠã«å¿ããŠåŸã§ãããã¯ã§ããããã«ãå¥ã®æ¹æ³ã§è² è·ãåãé€ããŸãã
self.loadIni(iniFile) def loadIni(self, iniFile):
iniãã¡ã€ã«ãæäœããã«ã¯ããã®æ¹æ³ãç¥ã£ãŠãããšããçç±ã ãã§QtããŒã«ã䜿çšããŸãã Pythonã«ãããããæ¹æ³ããããŸãããç§ã¯æããŸããã§ããã ãã·ã¢èªã«é¢ããå°æ¥ã®åé¡ãåé¿ããããã«ããã¹ãŠã®ãã¡ã€ã«ã§UTF-8ã§äœæ¥ããŸãã
ini = QSettings(iniFile, QSettings.IniFormat) ini.setIniCodec("utf-8")
å
¥åã»ã¯ã·ã§ã³ãããªã¯ãšã¹ããã©ã¡ãŒã¿ãŒãããŒãããŸã
ini.beginGroup("Input") for key in sorted(ini.childKeys()):
ãã©ã¡ãŒã¿ãŒã¯ããName = LabelïŒdefault valueããšããè¡ã§å®çŸ©ãããŸã
ååã¯ã³ãã³ãšäžç·ã«çç¥ã§ããã€ã³ã¿ãŒãã§ãŒã¹ã¯ååã«ãªããŸãã
v = ini.value(key).split(':') if len(v)>1: paramTitle = v[0] paramValue = v[1] else: paramTitle = key paramValue = v[0]
ãã©ã¡ãŒã¿ãŒããšã«ãå
¥åè¡ãäœæãã貯éç®±ã«å
¥ããŠãã€ã³ã¿ãŒãã§ã€ã¹ã«ã©ãã«ãšãšãã«æ¿å
¥ããŸã
self.params.append([key, paramTitle, paramValue]) if paramTitle != '': le = QLineEdit() self.inputs[key] = le le.setText(paramValue) le.paramTitle = paramTitle self.lay.addRow(paramTitle, le) ini.endGroup()
DBã»ã¯ã·ã§ã³ããããŒã¿ããŒã¹æ¥ç¶ãã©ã¡ãŒã¿ãŒãèªã¿åããŸã
ini.beginGroup("DB") self.dbini = ini.value("DBConnect") if self.dbini == "this": self.dbini = iniFile ini.endGroup()
æåŸã«ãSQLã¯ãšãªã®ããã¹ããèªã¿ãŸãã
ãå®è¡ãã»ã¯ã·ã§ã³ã«ã¯ãã¯ãšãªããã¹ãèªäœãå«ããSQLãããŒïŒåŒçšç¬Šã§å²ãæ¹ãè¯ãïŒãããããã¯ãšãªãå«ãsqlãã¡ã€ã«ãæžã蟌ãŸãããSQLScriptãããŒããããŸããããã«ãããè€æ°è¡ã®ã¯ãšãªãäœæã§ããŸãã ããã«ããã¡ã€ã«å
ã®ãªã¯ãšã¹ãã¯ãColorerãã€ã©ã€ãã䜿çšããŠFARã§ç·šéããæ¹ã䟿å©ã§ãã
iniã®ããã«ãsqlãã¡ã€ã«ã¯UTF-8ã§ãšã³ã³ãŒããããŠãããšä¿¡ããŠããŸãããã©ã³ã¹ã³ãŒãã£ã³ã°ã®å Žåã®ã¿ã 'utf-8-sig'ã䜿çšããŠãã¡ã€ã«ã®å
é ã®
BOMãåãé€ããŸãã
ini.beginGroup("Run") if ini.contains("SQL"): self.sql = ini.value("SQL") else: f = QFile(ini.value("SQLScript")) f.open(QIODevice.ReadOnly) self.sql = str(f.readAll(),'utf-8-sig') ini.endGroup()
æåŸã®ä»äžã-éå§ãã¿ã³ãè¿œå ããããŸãé
眮ããŸãã
self.runBtn = QPushButton("Run") self.runBtn.setDefault(True) self.btnLay = QHBoxLayout() self.btnLay.addStretch() self.btnLay.addWidget(self.runBtn) self.lay.addRow(self.btnLay)
ãã¿ã³ã«ã¯ãå®è¡èŠæ±ãå®è¡ããã¡ãœãããå²ãåœãŠãããŸã
self.runBtn.clicked.connect(self.run)
å®éã«èµ·åããæ¹æ³
def run(self): self.runBtn.setEnabled(False)
ããŒã¿ããŒã¹ãæäœããŠã¿ãŸãããã
QSqlDatabaseãªããžã§ã¯ããååŸããŸããããã¯æå¹ã§éãããŠããå¿
èŠããããŸãã ãããŠããã§ãªãå Žå-ãã£ãšãããããäœãèµ·ãããŸããã
self.db = dbpool.openDatabase(self.dbini) if self.db == None or not self.db.isValid() or not self.db.isOpen(): print("No opened DB", self.dbini) self.endRun() return
Qtã§ã¯ãåºæ¬çã«ããŒã¿ããŒã¹ã¯ãšãªãæäœãã1ã€ã®æ¹æ³ã¯QSqlQueryã§ã
self.query = QSqlQuery(self.db)
Parsim sql-queryããã©ã¡ãŒã¿ãŒãå
¥åè¡ããã®å€ã§åããŸã
self.query.prepare(self.sql) for p in self.params: key = p[0] if key in self.inputs: le = self.inputs[key] par = ':'+key self.query.bindValue(par, le.text())
ãªã¯ãšã¹ããå®è¡ããããŸã§åŸ
ããªãããã«ããã®å®è¡ãå¥ã®ã¹ã¬ããã«é
眮ããŸãã
self.tr = QueryRunner(self.query) self.tr.finished.connect(self.showQueryResult) self.tr.start();
ã¹ã¬ãããå®äºãããšããã®ã¡ãœãããå®è¡ãããŸã
def showQueryResult(self):
å¿
èŠã«å¿ããŠQTableViewã©ãã«ãäœæããŸããã
w = self.createTableView()
ãã ããã¯ãšãªçµæãå«ãã¢ãã«ãããã«è¡šç€ºããã®ã§ã¯ãªãããããã·ãä»ããŠæž¡ããŸããããã«ãããåãã¯ãªãã¯ããŠãã¬ãŒãããœãŒãããå¿
èŠã«å¿ããŠæ€çŽ¢ãè¡ãããšãã§ããŸãã
w.sqlModel = QSqlQueryModel(w) w.sqlModel.setQuery(self.query) w.proxyModel = QSortFilterProxyModel(w) w.proxyModel.setSourceModel(w.sqlModel) w.setModel(w.proxyModel) self.resultLay.addWidget(w) self.endRun()
ã·ã§ã«ãªãã§ãã§ãã¯ããããšã®å®è¡ãå§ããŸããã
if __name__ == '__main__':
ãããŠå®éã«æã¡äžã
app = QApplication(sys.argv) ex = PyExecutor("artists.ini") ex.show() sys.exit(app.exec_())
Artists.iniãã¡ã€ã«
[Common] Title= [Input] Name= ():%r% [DB] DBConnect=sqlite.ini [Run] SQL="SELECT * FROM artists where :Name = '' or artist like :Name"
ãã§ãã¯æžã¿-åäœããŸã
次ã«ãèµ·åã·ã§ã«èªäœãå¿
èŠã§ãã
ã·ã§ã«ã§ã¯ãæ§æããããã¹ãŠã®æ©èœã®ããªãŒã衚瀺ããããããå¥ã
ã®ãŠã£ã³ããŠã§å®è¡ããŸãã ãããŠããŠã£ã³ããŠãã¢ãŒãã«ã§ã¯ãªãããã«ãããªãã¡ ããããåãæ¿ããŠæ°ãããã®ãèµ·åã§ããŸãã
ç°¡åã«ããããã«ãQtã«ã¯ãã¹ãŠã®æ©èœããããããMDIãŠã£ã³ããŠã䜿çšããŸãã ããªãŒã®èªã¿åããšè¡šç€ºã¯
PyQtã®äŸããå®å
šã«åãããŠããã®ã§ãããã§ã¯è©³ãã説æããŸããã
æåã®åã«ã¯é¢æ°ã®ååãããªãŒã®è¡ã«è¡šç€ºããã2çªç®ã«ã¯-é¢æ°ã®èª¬æã«ã3çªç®ã«-ã¢ãžã¥ãŒã«ã«æž¡ãããiniãã¡ã€ã«ãããããšã確èªããã ãã§ãã
artists.ini
QMainWindowã§ã¡ã€ã³ãŠã£ã³ããŠãäœæããæ¹æ³ã瀺ããŸã
class MainWindow(QMainWindow): def __init__(self, parent=None): super(MainWindow, self).__init__(parent)
MDIãŠã£ã³ããŠã®äž»èŠéšåã¯ãç¹å¥ãªQMdiAreaãŠã£ãžã§ããã§ãã èµ·åãããã¢ãžã¥ãŒã«ã®ãŠã£ã³ããŠã¯ãã®äžã«ååšããŸãã
self.mdiArea = QMdiArea(self) self.setCentralWidget(self.mdiArea)
ãããŸã§ã§ã1ã€ã®ã¢ã€ãã ã§ã¡ã€ã³ã¡ãã¥ãŒãäœæããŸãããã
self.mainMenu = QMenuBar(self) self.setMenuBar(self.mainMenu) m = self.mainMenu.addMenu("Window") a = m.addAction("Cascade windows") a.triggered.connect(self.mdiArea.cascadeSubWindows)
ããªãŒã¯å·ŠåŽã®ããã¯ããã«ã«ãããŸãã
self.treePanel = QDockWidget(" ", self) w = QWidget(self.treePanel) self.treePanel.setWidget(w) lay = QVBoxLayout(w) lay.setSpacing(1) lay.setContentsMargins(1,1,1,1) w.setLayout(lay) self.tree = TreeWidget(self.treePanel) lay.addWidget(self.tree)
æ©èœã®èª¬æãäžéšã«è¡šç€ºãããŸãïŒåŸïŒ
edit = QTextEdit(w) lay.addWidget(edit)
ããªãŒãããã«ã¯ãªãã¯ããŠããã³ãã©ãŒãå²ãåœãŠãããã«ãã¡ã€ã³ãŠã£ã³ããŠã«é
眮ããŸãã
self.tree.activated.connect(self.handle_dblclick) self.addDockWidget(Qt.LeftDockWidgetArea, self.treePanel)
ããã«ã¯ãªãã¯ãã³ãã©ãŒã¯ãããªãŒã¢ãã«ããiniãã¡ã€ã«ã®ååãååŸããã¢ãžã¥ãŒã«ã䜿çšããŠããããã¯ã©ã¹ãäœæããŸãã ãã®ã¯ã©ã¹ã¯ãŠã£ãžã§ããã§ãããMDIãŠã£ã³ããŠã®ã¯ã©ã€ã¢ã³ãéšåã«æ¿å
¥ããŸãã
def handle_dblclick(self, index): proc = index.data(Qt.UserRole) if proc != None: proc = proc.strip() ex = PyExecutor(proc) self.mdiArea.addSubWindow(ex) ex.show()
ç§ãã¡ã¯ãã§ãã¯ããŸã-ããã¯åäœããŸãïŒ
ãœãŒã¹ã¯MITã©ã€ã»ã³ã¹ã®äžã§
githubã«æçš¿ãããŸãã ãªã³ã¯ã¯èšäºã«äœ¿çšããããœãŒã¹ã«ã€ãªããã
ã«ãŒãããææ°ããŒãžã§ã³ãååŸã§ããŸãã
ãã³ãïŒ1. PyQtã¯ãQtãšåæ§ã«ãOracleãžã®ã¢ã¯ã»ã¹ã«å¿
èŠãªQOCIãã€ããªãã©ã€ããŒãå«ã¿ãŸããã ãã©ã€ããŒã¯ãQtã§æäŸããããœãŒã¹ïŒC ++ïŒããã¢ã»ã³ãã«ããPyQt5 \ Qt \ plugins \ sqldriversã«é
眮ããå¿
èŠããããŸãã ãã«ãããã«ã¯ãOracle Clientã®dllãå¿
èŠã§ãã
2. Pythonãžã®ãã¹ã«ã¯ããªã«æåãå«ãŸããªãããã«èšå®ããããšããå§ãããŸãã ããããªããšãPyQtã®å±æ ¹ãå°ãã¹ã©ã€ããããã¡ã€ã«ãèŠã€ãããŸããã
ç¶ç¶ïŒ
-PyQtã®ããŒã«ããŒãã¹ã«ã«ããããããŒã¿ãExcelãšHTMLã«ãšã¯ã¹ããŒãããŸã-XQueryããŒã¯ã¢ããã§XMLãã«ããããŸã-Pythonããã°ã©ã ã§ããã¥ã¡ã³ãããã¬ãã¥ãŒãã