So i wanted a (very simple) GUI for my python program .. and i want it to run on Linux but also windows..
Looking at the choices (Kivy, PyQt, pygtk) I found PyQt to be the most complete toolkit (I want a treeview with more columns later on which is something that kivy doesn'T seem to have). - PyGTK has that too but under windows that is a bit more of a pain to get running (from prior experience).
So I went and tried PyQt5 for the first time (last time I used PyQt it was Version 4 still so been a while ..)
It's fairly easy to get running with PYCharm (Community Edition) just go to the project settings and install the PyQt5 module -- don'T forget the stubs (for some reason installing from the popup hint did not work for me so I did it manually).
I installed qtdesigner too, but couldn'T figure out how to best use it with pycharm immediately so I just put together my (very simple) GUI the old way for now.
The purpose is simple:
so just for anyone wanting to just get a basic idea of how to do this here some source code without much explaination (fairly self explainatory if you are familiar with python and GUI toolkits imho):
import sys
# from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import (QApplication, QLabel, QWidget, QPushButton, QGridLayout, QLineEdit, QFileDialog,
QPlainTextEdit, QTreeWidget) # QErrorMessage)
from file_find_compare import FileFindCompare
DEBUG = False
class PyFindFileCompare(QWidget):
# widgets
base_dir = None
inp_file = None
out_text = None
btn_base_dir = None
btn_inp_file = None
btn_start = None
tv_out = None
_out_file = None
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
layout = QGridLayout()
layout.addWidget(QLabel(text='Basisordner: '), 0, 0)
self.base_dir = QLineEdit()
self.base_dir.setReadOnly(True)
self.base_dir.setText('//server/Daten')
layout.addWidget(self.base_dir, 0, 1)
self.btn_base_dir = QPushButton('Basisordner auswählen: ')
layout.addWidget(self.btn_base_dir, 0, 2)
self.btn_base_dir.clicked.connect(self.get_basedir)
layout.addWidget(QLabel(text='Eingabedatei: '), 1, 0)
self.inp_file = QLineEdit()
self.inp_file.setReadOnly(True)
self.inp_file.setText('//server/Daten')
layout.addWidget(self.inp_file, 1, 1)
self.btn_inp_file = QPushButton('Eingabedatei auswählen')
self.btn_inp_file.setDisabled(True)
layout.addWidget(self.btn_inp_file, 1, 2)
self.btn_inp_file.clicked.connect(self.get_inp_file)
self.btn_start = QPushButton('Start')
self.btn_start.setDisabled(True)
layout.addWidget(self.btn_start, 2, 2)
self.btn_start.clicked.connect(self.start_search)
self.out_text = QPlainTextEdit()
self.out_text.setReadOnly(True)
layout.addWidget(self.out_text, 3, 0, 1, 3)
self.tv_out = QTreeWidget()
self.tv_out.hide()
layout.addWidget(self.tv_out, 4, 0, 1, 3)
self.setLayout(layout)
self.setFixedWidth(900)
self.setMinimumHeight(500)
self.show()
def get_basedir(self):
bdir = str(QFileDialog.getExistingDirectory(self,
"Basisordner auswählen",
self.base_dir.text()
))
if bdir:
self.base_dir.setText(bdir)
# we got a valid input path so enable the input file button
self.btn_inp_file.setDisabled(False)
if DEBUG:
self.out_text.appendPlainText('got base dir: %s' % self.base_dir.text())
if self.inp_file.text() != '':
self.inp_file.setText(self.base_dir.text())
def get_inp_file(self):
# stop the user from changing the base dir to avoid weird issues
# TODO: make it more user friendly later
self.btn_base_dir.setDisabled(True)
infile = str(QFileDialog.getOpenFileName(self,
"Eingabedatei auswählen",
self.inp_file.text(),
'*.txt'
)[0]
)
if infile:
if infile.find(self.base_dir.text()) != 0:
self.out_text.appendPlainText('Fehler: Die Eingabedatei muß im Basisverzeichnis oder unterordner liegen!')
return
else:
self.btn_start.setDisabled(False)
self.inp_file.setText(infile)
self._out_file = self.inp_file.text().replace('.txt', '_output.txt')
if DEBUG:
self.out_text.appendPlainText('got input file: %s' % self.inp_file.text())
self.out_text.appendPlainText('output filename: %s' % self._out_file)
def start_search(self):
# just to be save disable both other buttons
self.btn_inp_file.setDisabled(True)
self.btn_inp_file.setDisabled(True)
ffc = FileFindCompare(self.inp_file.text(), self._out_file, self.base_dir.text())
self.out_text.appendPlainText('Liste der Dateien: %s' % self.inp_file.text())
self.out_text.appendPlainText('Basisordner: %s' % self.base_dir.text())
ffc.find_compare()
self.out_text.appendPlainText('Ausgabe wird gespeichert als %s' % self._out_file)
self.out_text.appendPlainText('Ausgabe als text:')
self.out_text.appendPlainText(ffc.generate_output())
ffc.save_output()
def populate_tv(self):
# TODO: populate the treeview
self.tv_out.show()
if __name__ == '__main__':
app = QApplication([])
win = PyFindFileCompare()
sys.exit(app.exec_())
I made some assumptions / simpilifications for the sake of usability / userfriendliness for now since I was in a rush .. so I am aware there are some issues / not very pretty things but it works and for now that was what mattered -- and to be honest it is such a short / simple program that I am going to be using myself for like 80% of the time if not 100% so whatever ^^
Share on Twitter Share on Facebook
Comments
There are currently no comments
New Comment