class App(QWidget): def __init__(self): super().__init__() self.title = "PyQt5 file system view - pythonspot.com" self.left = 100 self.top = 300 self.width = 640 self.height = 480 self.initUI() def initUI(self): self.setWindowTitle(self.title) self.setGeometry(self.left, self.top, self.width, self.height) self.model = QFileSystemModel() self.model.setRootPath("C:\\") self.tree = QTreeView() self.tree.setModel(self.model) self.tree.setAnimated(False) self.tree.setIndentation(20) self.tree.setSortingEnabled(True) self.tree.setWindowTitle("Dir View") self.tree.resize(640, 480) windowLayout = QVBoxLayout() windowLayout.addWidget(self.tree) self.setLayout(windowLayout) self.show()
class FilesHierarchyViewer(QWidget): def __init__(self): # super().__init__() super(FilesHierarchyViewer, self).__init__() self.title = 'File system viewer' self.left = 0 self.top = 0 self.width = 640 self.height = 480 self.initUI() def initUI(self): self.setWindowTitle(self.title) # self.setGeometry(self.left, self.top, self.width, self.height) self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.model = QFileSystemModel() self.model.setRootPath(glb.DIRECTORY_VIEWER_ROOT_PATH) print(glb.DIRECTORY_VIEWER_ROOT_PATH) self.tree = QTreeView() self.tree.setModel(self.model) self.tree.setAnimated(False) self.tree.setIndentation(20) self.tree.setSortingEnabled(True) self.tree.setWindowTitle("Dir View") self.tree.resize(640, 480) windowLayout = QVBoxLayout() windowLayout.addWidget(self.tree) self.setLayout(windowLayout) self.show()
class ExploradorArchivos(QWidget): def __init__(self): super().__init__() self.inicializarGui() def inicializarGui(self): self.setWindowTitle('Explorador Archivos') self.setFixedSize(600, 600) self.modelo = QFileSystemModel() self.modelo.setRootPath('') self.explorador = QTreeView() self.explorador.setModel(self.modelo) self.explorador.setAnimated(False) self.explorador.setIndentation(20) self.explorador.setSortingEnabled(True) self.layout = QVBoxLayout() self.layout.addWidget(self.explorador) self.setLayout(self.layout) self.show()
class FileBrowserWidget(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.model = QFileSystemModel() self.model.setRootPath('') self.tree = QTreeView() self.tree.setModel(self.model) idx = self.model.index(BASE_DIR) self.tree.setRootIndex(idx) self.tree.setAnimated(False) self.tree.setIndentation(20) self.tree.setSortingEnabled(True) self.tree.hideColumn(2) self.tree.header().resizeSection(0,200) windowLayout = QVBoxLayout() windowLayout.addWidget(self.tree) self.setLayout(windowLayout)
class App(QWidget): def __init__(self): super().__init__() self.title = 'Android File Transfer' self.left = 20 self.top = 30 self.width = 640 self.height = 480 self.initUI() def initUI(self): self.setWindowTitle(self.title) self.setGeometry(self.left, self.top, self.width, self.height) self.model = QFileSystemModel() self.model.setRootPath('/Volumes/RV/') self.tree = QTreeView() self.tree.clicked.connect(self.onClicked) self.tree.setModel(self.model) self.tree.setAnimated(False) self.tree.setIndentation(20) self.tree.setSortingEnabled(True) self.tree.setWindowTitle("Dir View") self.tree.resize(640, 480) windowLayout = QVBoxLayout() windowLayout.addWidget(self.tree) self.setLayout(windowLayout) def onClicked(self, index): path = self.sender().model().filePath(index) print(path)
class App(QWidget): def __init__(self): super().__init__() self.title = 'PyQt5 file system view - pythonspot.com' self.left = 100 self.top = 100 self.width = 940 self.height = 480 self.initUI() time.sleep(5) #self.hideUI() def initUI(self): self.setWindowTitle(self.title) self.setGeometry(self.left, self.top, self.width, self.height) self.model = QFileSystemModel() self.model.setRootPath('') self.tree = QTreeView() self.tree.setModel(self.model) self.tree.setAnimated(True) self.tree.setIndentation(20) self.tree.setSortingEnabled(True) self.tree.setWindowTitle("Dir View") self.tree.resize(1280, 960) windowLayout = QVBoxLayout() windowLayout.addWidget(self.tree) self.setLayout(windowLayout) self.show() def hideUI(self): self.hide()
class App(QWidget): def __init__(self): super().__init__() self.title = 'PyQt5 file system view - pythonspot.com' self.left = 10 self.top = 10 self.width = 640 self.height = 480 self.initUI() def initUI(self): self.setWindowTitle(self.title) self.setGeometry(self.left, self.top, self.width, self.height) self.model = QFileSystemModel() r_inx = self.model.setRootPath(".") self.tree = QTreeView() self.tree.setModel(self.model) self.tree.setAnimated(False) self.tree.setIndentation(15) self.tree.setSortingEnabled(True) self.tree.setWindowTitle("Dir View") self.tree.resize(640, 480) windowLayout = QVBoxLayout() windowLayout.addWidget(self.tree) self.setLayout(windowLayout) print(self.model.rootPath()) print(self.model.filePath(self.model.parent(r_inx))) index_temp = self.model.index(0, 0, QModelIndex()) print(self.model.fileName(index_temp)) self.show()
class MyGridFilesWidget(QWidget): def __init__(self, parent): super(QWidget, self).__init__(parent) start_dir = QStringListModel() start_dir = 'C:/ROBOCZY' self.model = QFileSystemModel() self.model.setFilter(QDir.AllDirs | QDir.NoDotAndDotDot | QDir.AllEntries) self.model.setNameFilters() self.model.setNameFilterDisables(0) #self.model.setRootPath(start_dir) #self.model.setRootPath(start_dir) self.tree = QTreeView() self.tree.setRootIndex(self.model.index(start_dir)) self.tree.setModel(self.model) self.tree.setAnimated(False) self.tree.setIndentation(20) self.tree.setSortingEnabled(True) self.tree.setWindowTitle("Dir View") self.tree.resize(640, 480) windowLayout = QVBoxLayout() windowLayout.addWidget(self.tree) self.setLayout(windowLayout)
class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): def __init__(self, *args, **kwargs): # QtWidgets.QMainWindow.__init__(self, *args, **kwargs) super().__init__() self.model = QFileSystemModel() self.tree = QTreeView() self.setupUi(self) self.title = 'Env Manager 1.0' self.left = 500 self.top = 150 self.width = 1024 self.height = 840 self.initUI() def initUI(self): self.setWindowTitle(self.title) self.setGeometry(self.left, self.top, self.width, self.height) self.model.setRootPath('') self.tree.setModel(self.model) self.tree.setAnimated(False) self.tree.setIndentation(20) self.tree.setSortingEnabled(True) self.tree.setGeometry(25, 150, 975, 800) self.tree.setWindowTitle("Dir View") # self.tree.resize(1000, 480) windowLayout = QVBoxLayout() windowLayout.addWidget(self.tree) self.setLayout(windowLayout) # self.label.setText("Selecciona el directorio donde quieres crean el env") self.show()
class App(QWidget): def __init__(self): super().__init__() self.title = 'PyQt5 file system view' self.left = 100 self.top = 100 self.width = 1140 self.height = 480 self.initUI() def initUI(self): self.setWindowTitle(self.title) self.setGeometry(self.left, self.top, self.width, self.height) self.model = QFileSystemModel() self.model.setRootPath(QDir.rootPath()) self.tree = QTreeView() self.tree.setModel(self.model) self.tree.setRootIndex(self.model.index(config['rgb_img_path'])) self.tree.setAnimated(False) self.tree.setIndentation(20) self.tree.setSortingEnabled(True) self.tree.setWindowTitle("Dir View") self.tree.resize(640, 480) self.tree.doubleClicked.connect(self.plot) windowLayout = QVBoxLayout() windowLayout.addWidget(self.tree) self.setLayout(windowLayout) self.m = PlotCanvas(self, width=5, height=4) self.m.move(640, 0) self.show() def plot(self, signal): file_path = self.tree.model().filePath(signal) sample_id = re.search(r'\d+', file_path.split('/')[-1]).group() self.m.plot(str(sample_id))
class BinaryDetailsDialog(QDialog): def __init__(self, data, *args, title=None, **kwargs): super().__init__(*args, **kwargs) self.setWindowFlag(Qt.WindowContextHelpButtonHint, False) self._data = data if not title: self.setWindowTitle(f"{self._data.binaries[0].binary_name} ({self._data.release_name})") self.setup_interface() def setup_interface(self): self.resize(600, 380) self.layout = QVBoxLayout() self.layout.setContentsMargins(0, 0, 0, 0) self.details_tree_model = BinaryDetailsTreeModel(self._data) self.details_tree_view = QTreeView() self.details_tree_view.setEditTriggers(QAbstractItemView.NoEditTriggers) self.details_tree_view.setAnimated(True) self.details_tree_view.setModel(self.details_tree_model) self.details_tree_view.expandAll() self.details_tree_view.resizeColumnToContents(0) self.details_tree_view.doubleClicked.connect( lambda index: QApplication.clipboard().setText( self.details_tree_model.data(index, Qt.DisplayRole) ) ) self.layout.addWidget(self.details_tree_view) self.setLayout(self.layout)
class FileTree(QWidget): def __init__(self, defaultfolder=r'c:\Zen_Output'): super(QWidget, self).__init__() filter = ['*.czi', '*.ome.tiff', '*ome.tif' '*.tiff' '*.tif'] # define the style for the FileTree via s style sheet self.setStyleSheet(""" QTreeView::item { background-color: rgb(38, 41, 48); font-weight: bold; } QTreeView::item::selected { background-color: rgb(38, 41, 48); color: rgb(0, 255, 0); } QTreeView QHeaderView:section { background-color: rgb(38, 41, 48); color: rgb(255, 255, 255); } """) self.model = QFileSystemModel() self.model.setRootPath(defaultfolder) self.model.setFilter(QtCore.QDir.AllDirs | QDir.Files | QtCore.QDir.NoDotAndDotDot) self.model.setNameFilterDisables(False) self.model.setNameFilters(filter) self.tree = QTreeView() self.tree.setModel(self.model) self.tree.setRootIndex(self.model.index(defaultfolder)) self.tree.setAnimated(True) self.tree.setIndentation(20) self.tree.setSortingEnabled(False) header = self.tree.header() header.setSectionResizeMode(QtWidgets.QHeaderView.ResizeToContents) windowLayout = QVBoxLayout() windowLayout.addWidget(self.tree) self.setLayout(windowLayout) self.tree.clicked.connect(self.on_treeView_clicked) @pyqtSlot() def on_treeView_clicked(self, index): indexItem = self.model.index(index.row(), 0, index.parent()) filename = self.model.fileName(indexItem) filepath = self.model.filePath(indexItem) # open the file when clicked print('Opening ImageFile : ', filepath) open_image_stack(filepath)
def __initFileTreeView(self, model): treeView = QTreeView() treeView.setModel(model) treeView.setRootIndex(model.index(r'C:')) treeView.hideColumn(1) treeView.hideColumn(3) treeView.setAnimated(True) treeView.setIndentation(20) treeView.setSortingEnabled(True) treeView.setMinimumWidth(100) return treeView
class DirectoryTree(QWidget): def __init__(self): super().__init__() self.title = 'PyQt5 file system view' self.left = 10 self.top = 10 self.width = 640 self.height = 480 self.initUI() def initUI(self): self.setWindowTitle(self.title) self.setGeometry(self.left, self.top, self.width, self.height) self.model = QFileSystemModel() self.model.setRootPath(QDir.rootPath()) self.model.setFilter(QDir.AllDirs | QDir.NoDotAndDotDot) self.tree = QTreeView() self.tree.setModel(self.model) self.tree.hideColumn(1) self.tree.hideColumn(2) self.tree.hideColumn(3) self.tree.setAnimated(False) self.tree.setIndentation(20) self.tree.setSortingEnabled(True) self.tree.setWindowTitle("Dir View") self.tree.resize(640, 480) self.fileModel = QFileSystemModel() self.fileModel.setRootPath(QDir.rootPath()) self.list = QTableView() self.list.setModel(self.fileModel) self.list.setShowGrid(False) self.list.verticalHeader().setVisible(False) self.list.setSelectionBehavior(QTableView().SelectRows) self.tree.clicked.connect(self.onClicked) windowLayout = QHBoxLayout() windowLayout.addWidget(self.tree) windowLayout.addWidget(self.list) self.setLayout(windowLayout) self.show() def onClicked(self, index): path = self.model.fileInfo(index).absoluteFilePath() self.list.setRootIndex(self.fileModel.setRootPath(path))
def directory(app): #app = QApplication(sys.argv) QCoreApplication.setApplicationVersion(QT_VERSION_STR) parser = QCommandLineParser() parser.setApplicationDescription("File Directory") parser.addHelpOption() parser.addVersionOption() dontUseCustomDirectoryIconsOption = QCommandLineOption( 'C', "Set QFileIconProvider.DontUseCustomDirectoryIcons") parser.addOption(dontUseCustomDirectoryIconsOption) parser.addPositionalArgument('', "The directory to start in.") parser.process(app) try: rootPath = parser.positionalArguments().pop(0) except IndexError: rootPath = None model = QFileSystemModel() model.setRootPath('') filter = ['*.db'] #filtering out just by db model.setNameFilters(filter) model.setNameFilterDisables(0) #Only show the filtered .db paths #filename = model.filePath() #print(filename) if parser.isSet(dontUseCustomDirectoryIconsOption): model.iconProvider().setOptions( QFileIconProvider.DontUseCustomDirectoryIcons) tree = QTreeView() tree.setModel(model) if rootPath is not None: rootIndex = model.index(QDir.cleanPath(rootPath)) if rootIndex.isValid(): tree.setRootIndex(rootIndex) # Demonstrating look and feel features. tree.setAnimated(False) tree.setIndentation(20) tree.setSortingEnabled(True) availableSize = QApplication.desktop().availableGeometry(tree).size() tree.resize(availableSize / 2) tree.setColumnWidth(0, tree.width() / 3) tree.setWindowTitle("Directory View") tree.show() sys.exit(app.exec_())
class DIR_WINDOW(QtWidgets.QMainWindow): def __init__(self): super().__init__() self.title = "Convex" self.top = 100 self.left = 100 self.width = 800 self.height = 400 self.icon_name = "NIT-Silchar-Logo.png" self.path = '' self.initApp() def initApp(self): self.setWindowIcon(QtGui.QIcon(self.icon_name)) self.setWindowTitle(self.title) self.setGeometry(self.left, self.top, self.width, self.height) self.model = QFileSystemModel() self.model.setRootPath("C:") self.tree = QTreeView() self.tree.setModel(self.model) self.tree.setAnimated(False) self.tree.setIndentation(20) self.tree.setSortingEnabled(True) self.tree.setWindowTitle("Explorer") self.tree.resize(640, 480) self.tree.move(20, 20) self.tree.clicked.connect(self.selectPath) self.select_button = QPushButton("Select", self) self.select_button.setToolTip("Click to select image") self.select_button.setMinimumHeight(40) self.select_button.clicked.connect(self.obtainPath) #windowLayout = QVBoxLayout() #windowLayout.addWidget(self.tree) #windowLayout.addWidget(select_button) #self.setLayout(windowLayout) self.show() def selectPath(self, index): self.path = self.sender().model().filePath(index) def obtainPath(self): print("obtain path:" + self.path)
def _init_ui(self): self.setWindowTitle(self.title) self.setGeometry(self.left, self.top, self.width, self.height) model = QFileSystemModel(self) model.setRootPath('') view = QTreeView() view.setModel(model) view.setAnimated(False) view.setIndentation(20) view.setSortingEnabled(True) layout = QVBoxLayout() layout.addWidget(view) self.setLayout(layout)
class App(QWidget): def __init__(self): print("xx") #QMainWindow.__init__(self) super(App,self).__init__() #QtWidgets.QWidget.__init__(self) self.title = 'select file' self.left = 10 self.top = 10 self.width = 640 self.height = 480 self.initUI() def initUI(self): self.setWindowTitle(self.title) self.setGeometry(self.left, self.top, self.width, self.height) self.model = QFileSystemModel() self.model.setRootPath('') self.tree = QTreeView() self.tree.clicked.connect(self.onClicked) self.tree.setModel(self.model) self.fileSystemModel = QFileSystemModel(self.tree) self.fileSystemModel.setReadOnly(True) self.fileSystemModel.setRootPath('') self.tree.setAnimated(False) self.tree.setIndentation(20) self.tree.setSortingEnabled(True) self.tree.setWindowTitle("Dir View") self.tree.resize(640, 480) windowLayout = QVBoxLayout() windowLayout.addWidget(self.tree) self.setLayout(windowLayout) self.show() def onClicked(self, index): global path path = self.sender().model().filePath(index) #path1=self.sender().model().filePath() print(path) self.close() Ui_MainWindow.display1(self)
class App(QWidget): def __init__(self): super().__init__() self.title = 'PyQt5 file system view - pythonspot.com' self.left = 10 self.top = 10 self.width = 640 self.height = 480 self.initUI() def initUI(self): self.setWindowTitle(self.title) self.setGeometry(self.left, self.top, self.width, self.height) self.model = QFileSystemModel() self.model.setRootPath('/home/rob/Muziek') filter = ["*.wav", "*.ogg"] self.model.setNameFilters(filter) self.model.setNameFilterDisables(0) root = self.model.setRootPath('/home/rob/Muziek') #print(root) self.tree = QTreeView() self.tree.setModel(self.model) self.tree.setRootIndex(root) self.tree.setAnimated(False) self.tree.setIndentation(20) self.tree.setSortingEnabled(True) self.tree.doubleClicked.connect(self.test) self.tree.setWindowTitle("Dir View") self.tree.resize(640, 480) windowLayout = QVBoxLayout() windowLayout.addWidget(self.tree) self.setLayout(windowLayout) self.show() def test(self, signal): file_path = self.model.filePath(signal) print(file_path)
class view(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setGeometry(0, 0, 800, 600) self.model = QFileSystemModel() self.model.setReadOnly(False) self.model.setRootPath("") self.tree = QTreeView() self.tree.setModel(self.model) self.tree.setAnimated(True) self.tree.setIndentation(10) self.tree.setSortingEnabled(True) self.tree.setWindowTitle("Dir View") self.tree.resize(640, 480) windowLayout = QVBoxLayout() windowLayout.addWidget(self.tree) self.setLayout(windowLayout) self.show()
class SearchDir(QWidget): def __init__(self): super().__init__() self.title = '' self.initUI() def initUI(self): self.model = QFileSystemModel() self.model.setRootPath('') self.tree = QTreeView() self.tree.setModel(self.model) self.tree.setAnimated(False) self.tree.setIndentation(20) self.tree.setSortingEnabled(True) windowLayout = QVBoxLayout() windowLayout.addWidget(self.tree) self.setLayout(windowLayout) self.show() def getPath(self): index = self.tree.currentIndex() return self.model.filePath(index)
class AddToProject(QDialog): """Dialog to let the user choose one of the folders from the opened proj""" def __init__(self, projects, parent=None): super(AddToProject, self).__init__(parent) #pathProjects must be a list self._projects = projects self.setWindowTitle(translations.TR_ADD_FILE_TO_PROJECT) self.pathSelected = '' vbox = QVBoxLayout(self) hbox = QHBoxLayout() self._list = QListWidget() for project in self._projects: self._list.addItem(project.name) self._list.setCurrentRow(0) self._tree = QTreeView() #self._tree.header().setHidden(True) self._tree.setSelectionMode(QTreeView.SingleSelection) self._tree.setAnimated(True) self.load_tree(self._projects[0]) hbox.addWidget(self._list) hbox.addWidget(self._tree) vbox.addLayout(hbox) hbox2 = QHBoxLayout() btnAdd = QPushButton(translations.TR_ADD_HERE) btnCancel = QPushButton(translations.TR_CANCEL) hbox2.addWidget(btnCancel) hbox2.addWidget(btnAdd) vbox.addLayout(hbox2) btnCancel.connect(self.close) btnAdd.connect(self._select_path) self._list.currentItemChanged['QTreeWidgetItem*', 'QTreeWidgetItem*'].connect(self._project_changed) def _project_changed(self, item, previous): #FIXME, this is not being called, at least in osx for each_project in self._projects: if each_project.name == item.text(): self.load_tree(each_project) def load_tree(self, project): """Load the tree view on the right based on the project selected.""" qfsm = QFileSystemModel() qfsm.setRootPath(project.path) load_index = qfsm.index(qfsm.rootPath()) qfsm.setFilter(QDir.AllDirs | QDir.NoDotAndDotDot) qfsm.setNameFilterDisables(False) pext = ["*{0}".format(x) for x in project.extensions] qfsm.setNameFilters(pext) self._tree.setModel(qfsm) self._tree.setRootIndex(load_index) t_header = self._tree.header() t_header.setHorizontalScrollMode(QAbstractItemView.ScrollPerPixel) t_header.setSectionResizeMode(0, QHeaderView.Stretch) t_header.setStretchLastSection(False) t_header.setClickable(True) self._tree.hideColumn(1) # Size self._tree.hideColumn(2) # Type self._tree.hideColumn(3) # Modification date #FIXME: Changing the name column's title requires some magic #Please look at the project tree def _select_path(self): """Set pathSelected to the folder selected in the tree.""" path = self._tree.model().filePath(self._tree.currentIndex()) if path: self.pathSelected = path self.close()
class ftp_client_GUI(QtWidgets.QWidget): def __init__(self): super(ftp_client_GUI, self).__init__() self.initGUI() def initGUI(self): qr = self.frameGeometry() cp = QtWidgets.QDesktopWidget().availableGeometry().center() qr.moveCenter(cp) self.move(qr.topLeft()) self.setWindowTitle("FTP Client") #label self.title_label = QtWidgets.QLabel(self) self.title_label.resize(300, 40) self.title_label.move(300, 20) self.title_label.setText("FTP Client End") self.title_label.setStyleSheet("border-color: rgb(170, 150, 163);" "font: 75 20pt;" "color: rgb(126, 120, 46);") # ip_edit self.ip_edit = QLineEdit(self) self.ip_edit.resize(230, 40) self.ip_edit.move(100, 80) self.ip_edit.setPlaceholderText("ip like 127.0.0.1") #port_edit self.port_edit = QLineEdit(self) self.port_edit.resize(130, 40) self.port_edit.move(370, 80) self.port_edit.setPlaceholderText("port like 3000") # connect_btn self.connect_btn = QtWidgets.QPushButton('connect', self) self.connect_btn.resize(150, 40) self.connect_btn.move(550, 80) self.connect_btn.clicked.connect(self.on_connect_btn) # cmd edit self.sentence_editor = QLineEdit(self) self.sentence_editor.resize(400, 40) self.sentence_editor.move(100, 130) self.sentence_editor.setPlaceholderText( "input command and argument, like 'USER anonymous'") # cmd btn self.cmd_btn = QtWidgets.QPushButton('push command', self) self.cmd_btn.resize(150, 40) self.cmd_btn.move(550, 130) self.cmd_btn.clicked.connect(self.on_cmd_btn) # text browser self.text_browser = QTextBrowser(self) self.text_browser.resize(450, 160) self.text_browser.move(730, 20) # file tree self.file_model = QFileSystemModel(self) dir_path = os.path.dirname(os.path.abspath(__file__)) self.file_model.setRootPath(dir_path) self.tree = QTreeView(self) self.tree.setModel(self.file_model) self.tree.setRootIndex(self.file_model.index(dir_path)) self.tree.setAnimated(True) self.tree.setIndentation(20) self.tree.setSortingEnabled(True) self.tree.setWindowTitle("Dir View") self.tree.resize(500, 370) self.tree.move(830, 200) # timer self.timer = QBasicTimer() self.timer.start(1000, self) # internet speed display self.width = 200 self.height = 20 self.bias = 1200 self.cur_load_volume = 0 self.pre_load_volume = 0 self.internet_speed_label = QLabel(self) self.internet_speed_label.move(110, 600) self.internet_speed_label.resize(300, 20) self.internet_speed_label.setStyleSheet( "border-color: rgb(170, 150, 163);" "font: 30 12pt;" "color: rgb(126, 120, 46);") # file total load self.file_total_upload = 0 self.file_total_download = 0 self.file_total_upload_num = 0 self.file_total_download_num = 0 self.file_total_upload_label = QLabel(self) self.file_total_upload_num_label = QLabel(self) self.file_total_download_label = QLabel(self) self.file_total_download_num_label = QLabel(self) self.file_total_upload_label.move(self.bias, self.height + 40) self.file_total_upload_num_label.move(self.bias, self.height + 60) self.file_total_download_label.move(self.bias, self.height + 80) self.file_total_download_num_label.move(self.bias, self.height + 100) self.file_total_upload_label.resize(self.width, self.height) self.file_total_upload_num_label.resize(self.width, self.height) self.file_total_download_label.resize(self.width, self.height) self.file_total_download_num_label.resize(self.width, self.height) self.file_total_upload_label.setStyleSheet( "border-color: rgb(170, 150, 163);" "font: 30 12pt;" "color: rgb(126, 120, 46);") self.file_total_upload_num_label.setStyleSheet( "border-color: rgb(170, 150, 163);" "font: 30 12pt;" "color: rgb(126, 120, 46);") self.file_total_download_label.setStyleSheet( "border-color: rgb(170, 150, 163);" "font: 30 12pt;" "color: rgb(126, 120, 46);") self.file_total_download_num_label.setStyleSheet( "border-color: rgb(170, 150, 163);" "font: 30 12pt;" "color: rgb(126, 120, 46);") # tabel widget self.TableWidget = QTableWidget(self) self.TableWidget.resize(710, 370) self.TableWidget.move(100, 200) self.TableWidget.setRowCount(0) self.TableWidget.setColumnCount(3) self.TableWidget.setHorizontalHeaderLabels(['name', 'info', 'code']) self.TableWidget.setColumnWidth(0, 80) self.TableWidget.setColumnWidth(1, 560) self.TableWidget.setColumnWidth(2, 65) # progress bar self.step = 0 self.retr_file_size = 0 self.pbar = QProgressBar(self) self.pbar.resize(700, 15) self.pbar.move(110, 580) self.pbar.setValue(self.step) self.resize(1400, 650) self.show() self.client_command_socket = 1 self.client_file_socket = 1 self.server_file_socket = 1 self.file_port = 3000 self.file_addr = "127.0.0.1" self.server_port = 3000 self.server_addr = "127.0.0.1" self.reply_sentence = "" self.req_sentence = "" self.client_command = "" self.client_argument = "" self.client_state = 0 self.offset_read = 0 self.transfer_file_path = "" self.common_command = { "USER", "PASS", "TYPE", "MKD", "RNFR", "RMD", "RNTO", "PWD", "CWD", "SYST", "REST" } self.parti_command = {"QUIT", "PORT", "PASV", "RETR", "LIST", "STOR"} def timerEvent(self, *args, **kwargs): volume = self.cur_load_volume - self.pre_load_volume byte_volume = volume % 1024 kbyte_volume = volume / 1024 self.internet_speed_label.setText("load file rate : " + str(kbyte_volume) + " kb/s") self.pre_load_volume = self.cur_load_volume self.file_total_upload_label.setText( "upload : " + str(int(self.file_total_upload / 1024)) + " kb") self.file_total_upload_num_label.setText( "upload : " + str(int(self.file_total_upload_num)) + " files") self.file_total_download_label.setText( "download : " + str(int(self.file_total_download / 1024)) + " kb") self.file_total_download_num_label.setText( "download : " + str(self.file_total_download_num) + " files") if self.step == 100: self.step = 0 self.pbar.setValue(0) return # send client connect msg def on_connect_btn(self): port = self.port_edit.text() ip = self.ip_edit.text() try: self.client_command_socket = socket(AF_INET, SOCK_STREAM) self.client_command_socket.connect((ip, int(port))) self.reply_sentence = str( self.client_command_socket.recv(4096).decode()) self.add_item("server " + str(self.reply_sentence)) self.client_state = 1 except: self.client_state = 1 sent = "system 0 already connect!" self.add_item(sent) # receive client input and push def on_cmd_btn(self): sentence = self.sentence_editor.text() cmd_arg = sentence.split(' ') cmd_arg[0] = cmd_arg[0].upper() # according to rfc959 temp = "" if self.client_state == 0: sent = "system 0 not connect!" self.add_item(sent) elif self.client_state == 1 or self.client_state == 2 or self.client_state == 3: if cmd_arg[0] in self.common_command: if cmd_arg[0] == "REST": sentence = sentence + " " + str(self.offset_read) sentence = sentence + "\r\n" self.client_command_socket.send(sentence.encode()) senten = self.client_command_socket.recv(4096) self.reply_sentence = senten.decode() self.add_item("server " + self.reply_sentence) elif cmd_arg[0] in self.parti_command: if cmd_arg[0] == "QUIT": sentence = sentence + "\r\n" self.client_command_socket.send(sentence.encode()) self.reply_sentence = str( self.client_command_socket.recv(4096).decode()) self.add_item("server " + str(self.reply_sentence)) self.client_command_socket.close() return elif cmd_arg[0] == "PORT": port_addr = cmd_arg[1].split(',') if len(port_addr) < 6: self.text_browser.append( "system : invalid PORT addr!\r\n") self.text_browser.moveCursor( self.text_browser.textCursor().End) return else: addr = port_addr[0] + '.' + port_addr[ 1] + '.' + port_addr[2] + '.' + port_addr[3] port = int(port_addr[4]) * 256 + int(port_addr[5]) self.client_file_socket = socket(AF_INET, SOCK_STREAM) self.client_file_socket.bind((addr, port)) self.client_file_socket.listen(10) sentence = sentence + "\r\n" self.client_command_socket.send(sentence.encode()) self.reply_sentence = str( self.client_command_socket.recv(4096).decode()) self.add_item("server " + str(self.reply_sentence)) self.client_state = 2 elif cmd_arg[0] == "PASV": sentence = sentence + "\r\n" self.client_command_socket.send(sentence.encode()) self.reply_sentence = str( self.client_command_socket.recv(4096).decode()) self.add_item("server " + self.reply_sentence) li = 1 li = re.search(r"\(.*\)", self.reply_sentence) addr = li.group()[1:-1] addr = addr.split(',') port = int(addr[-2]) * 256 + int(addr[-1]) addr = addr[0] + '.' + addr[1] + '.' + addr[ 2] + '.' + addr[3] self.file_addr = addr[0:] self.file_port = port self.client_state = 3 self.client_file_socket = socket(AF_INET, SOCK_STREAM) elif cmd_arg[0] == "RETR": if self.client_state == 2: sentence = sentence + "\r\n" self.client_command_socket.send(sentence.encode()) self.server_file_socket, temp = self.client_file_socket.accept( ) self.reply_sentence = str( self.client_command_socket.recv(4096).decode()) self.add_item("server " + str(self.reply_sentence)) if self.reply_sentence.split( ' ')[0] != "550" and self.reply_sentence.split( ' ')[0] != "503": self.retr_file_size = self.get_retr_file_size( self.reply_sentence) self.transfer_file_path = cmd_arg[1][:] self.recv_data() self.server_file_socket.close() self.client_file_socket.close() self.server_file_socket = -1 self.client_file_socket = -1 elif self.client_state == 3: sentence = sentence + "\r\n" self.client_command_socket.send(sentence.encode()) self.client_file_socket.connect( (self.file_addr, self.file_port)) self.reply_sentence = str( self.client_command_socket.recv(4096).decode()) self.add_item("server " + str(self.reply_sentence)) self.server_file_socket = self.client_file_socket if self.reply_sentence.split( ' ')[0] != "550" and self.reply_sentence.split( ' ')[0] != "503": self.retr_file_size = self.get_retr_file_size( self.reply_sentence) self.transfer_file_path = cmd_arg[1][:] self.recv_data() self.server_file_socket.close() else: self.add_item("system 0 require PASV/PORT mode") if self.reply_sentence.split(' ')[0] != "550" and len( self.reply_sentence.split("\r\n")[1] ) == 0 and self.step == 100 and self.reply_sentence.split( ' ')[0] != "503" and self.client_state != 1: self.reply_sentence = str( self.client_command_socket.recv(4096).decode()) self.add_item("server " + str(self.reply_sentence)) self.client_state = 1 elif cmd_arg[0] == "LIST": if self.client_state == 2: sentence = sentence + "\r\n" self.client_command_socket.send(sentence.encode()) self.server_file_socket, temp = self.client_file_socket.accept( ) self.reply_sentence = str( self.client_command_socket.recv(4096).decode()) self.add_item("server " + str(self.reply_sentence)) if self.reply_sentence.startswith("150"): self.print_list(self.server_file_socket) self.server_file_socket.close() self.client_file_socket.close() self.server_file_socket = -1 self.client_file_socket = -1 elif self.client_state == 3: sentence = sentence + "\r\n" self.client_command_socket.send(sentence.encode()) self.client_file_socket.connect( (self.file_addr, self.file_port)) self.reply_sentence = str( self.client_command_socket.recv(4096).decode()) self.add_item("server " + str(self.reply_sentence)) if self.reply_sentence.startswith("150"): self.server_file_socket = self.client_file_socket self.print_list(self.server_file_socket) self.server_file_socket.close() else: self.add_item("system 0 require PASV/PORT mode") if self.reply_sentence.startswith( "150") and self.client_state != 1: self.reply_sentence = str( self.client_command_socket.recv(4096).decode()) self.add_item("server " + str(self.reply_sentence)) self.client_state = 1 elif cmd_arg[0] == "STOR": if self.get_file_size(cmd_arg[1]) == 0: self.add_item("system 0 file not found") return if self.client_state == 2: sentence = sentence + "\r\n" self.client_command_socket.send(sentence.encode()) self.server_file_socket, temp = self.client_file_socket.accept( ) self.reply_sentence = str( self.client_command_socket.recv(4096).decode()) self.add_item("server " + str(self.reply_sentence)) self.send_data(cmd_arg[1], self.server_file_socket) self.server_file_socket.close() self.client_file_socket.close() self.server_file_socket = -1 self.client_file_socket = -1 elif self.client_state == 3: sentence = sentence + "\r\n" self.client_command_socket.send(sentence.encode()) self.client_file_socket.connect( (self.file_addr, self.file_port)) self.reply_sentence = str( self.client_command_socket.recv(4096).decode()) self.add_item("server " + str(self.reply_sentence)) self.server_file_socket = self.client_file_socket self.send_data(cmd_arg[1], self.server_file_socket) self.server_file_socket.close() else: self.add_item("system 0 require PASV/PORT mode") if self.client_state != 1: self.reply_sentence = str( self.client_command_socket.recv(4096).decode()) self.add_item("server " + str(self.reply_sentence)) self.client_state = 1 else: self.text_browser.append("system : invalid command") self.text_browser.moveCursor( self.text_browser.textCursor().End) else: sent = "system 0 not connect!" self.add_item(sent) def recv_data(self): file_path = self.transfer_file_path[:] sock = self.server_file_socket if self.offset_read == 0: fp = open(file_path, "wb") else: fp = open(file_path, "ab") fp.seek(self.offset_read - 1, 0) self.retr_file_size = self.retr_file_size - self.offset_read data_stream = sock.recv(4096) self.pre_load_volume = 0 self.cur_load_volume = 0 count = 0 time1 = int(time.time() * 10000) time2 = int(time.time() * 10000) while data_stream: self.cur_load_volume += len(data_stream) self.step = (self.cur_load_volume / self.retr_file_size) * 100 self.pbar.setValue(self.step) fp.write(data_stream) data_stream = '' data_stream = sock.recv(4096) count += 1 if count == 20: volume = self.cur_load_volume - self.pre_load_volume byte_volume = volume % 1024 kbyte_volume = volume / 1024 time2 = int(time.time() * 10000) interval = (time2 - time1) / 10000 if interval != 0: self.internet_speed_label.setText( "load file rate : " + str(round(kbyte_volume / interval, 1)) + " kb/s") self.pre_load_volume = self.cur_load_volume time1 = time2 count = 0 else: continue if self.step == 100: self.offset_read = 0 else: self.offset_read = self.cur_load_volume fp.close() self.file_total_download += self.cur_load_volume self.file_total_download_num += 1 self.pre_load_volume = 0 self.cur_load_volume = 0 return def send_data(self, file_path, sock): fp = open(file_path, "rb") n = 2 buf = "" file_size = int(self.get_file_size(file_path)) self.pre_load_volume = 0 self.cur_load_volume = 0 count = 0 time1 = int(time.time() * 10000) time2 = int(time.time() * 10000) while n > 0: buf = fp.read(4096) n = len(buf) self.cur_load_volume += n self.step = (self.cur_load_volume / file_size) * 100 self.pbar.setValue(self.step) count += 1 if count == 20: volume = self.cur_load_volume - self.pre_load_volume byte_volume = volume % 1024 kbyte_volume = volume / 1024 time2 = int(time.time() * 10000) interval = (time2 - time1) / 10000 if interval != 0: self.internet_speed_label.setText( "load file rate : " + str(round(kbyte_volume / interval, 1)) + " kb/s") self.pre_load_volume = self.cur_load_volume time1 = time2 count = 0 sock.send(buf) fp.close() self.file_total_upload += self.cur_load_volume self.file_total_upload_num += 1 self.pre_load_volume = 0 self.cur_load_volume = 0 return def print_list(self, sock): n = 2 data_stream = sock.recv(4096) while n > 0: self.text_browser.setText(data_stream.decode()) self.text_browser.moveCursor(self.text_browser.textCursor().End) data_stream = sock.recv(4096) n = len(data_stream) return def recv_info(self): self.reply_sentence = self.client_command_socket.recv(4096).decode() self.text_browser.append("server : " + self.reply_sentence) self.text_browser.moveCursor(self.text_browser.textCursor().End) return def add_item(self, sentence): spl = sentence.split(' ') name = spl[0] code = spl[1] info = "" for i in spl[2:]: info += i + ' ' self.TableWidget.setRowCount(self.TableWidget.rowCount() + 1) newItem = QTableWidgetItem(name) self.TableWidget.setItem(self.TableWidget.rowCount() - 1, 0, newItem) newItem = QTableWidgetItem(info) self.TableWidget.setItem(self.TableWidget.rowCount() - 1, 1, newItem) newItem = QTableWidgetItem(code) self.TableWidget.setItem(self.TableWidget.rowCount() - 1, 2, newItem) def get_file_size(self, file_path): try: size = os.path.getsize(file_path) return size except Exception as err: return 0 def get_retr_file_size(self, sentence): li = re.search(r"\(.*\)", self.reply_sentence) if li.group() != None: temp = li.group()[1:-1] cv = re.search(r"\d+", temp) return int(cv.group()) else: return 99999999
class mainWindow(QMainWindow):# || def __init__(self):# || QMainWindow.__init__(self)# || pxcfg = here+'/gui.yaml' self.config = monk.stone(pxcfg). self.setAttribute(Qt.WA_DeleteOnClose)# || self.setWindowTitle("Pyffice 0.0.0.0.0.0")# || self.setStyleSheet(open(qss, "r").read())# || self.setAutoFillBackground(True)# || self.loadMenu()# || self.setLayout()# || self.loadApp()# || def buildMenu(): pass def desktopMenu(self, application, cfg=None): #dynamically build menu from config file dtmcfg = self.config['menu'] for item in cfg.keys(): self.menu = QMenu(dtmcfg[item]['name'], application) def loadMenu(self):# || menu = self.desktopMenu(self)# this sends the desktop object (self) to the menu object for mu in menu.__dir__():# ||dynamically add obj = getattr(menu, mu)# ||menu items to the if isinstance(obj, QMenu):# ||layout self.menuBar().addMenu(obj)# || def setLayout(self):# || self.main_widget = QWidget(self) self.l = QHBoxLayout(self.main_widget) # tbar = docAddBar() # l.addWidget(tbar.toolbar) def loadApp(self):# || '' app = alpr.App() self.formulaBar() self.createLayout() self.l.addWidget(app) self.main_widget.setFocus() self.setCentralWidget(self.main_widget) windowLayout = QBoxLayout(QBoxLayout.LeftToRight) self.treeview.setFixedWidth=200 windowLayout.addWidget(self.treeview) windowLayout.addWidget(self.tabwidget) self.setLayout(windowLayout) self.show() return self self.functionBar = QToolBar() self.addToolBar(self.functionBar) self.functionInput = QLineEdit() self.functionBar.addWidget(self.functionInput) self.formulaBar = QToolBar() self.addToolBar(self.formulaBar) self.formulaInput = QLineEdit() self.formulaBar.addWidget(self.formulaInput) self.statusBar().showMessage('Pyffice is about to Live') def fileQuit(self): self.close() def closeEvent(self, ce): self.fileQuit() def treeView(self,): self.treeview = QTreeView() self.treeview.setModel(model) self.treeview.setRootIndex(model.index(QDir.homePath())) self.treeview.setColumnWidth(0,50) self.treeview.setColumnHidden(1, True) self.treeview.setColumnHidden(2, True) self.treeview.setColumnHidden(3, True) self.treeview.setFixedWidth(200) self.treeview.setAnimated(False) self.treeview.setIndentation(20) self.treeview.setSortingEnabled(True) return self def setupContextMenu(self): 'I believe this should setup the right click menu' self.addAction(self.cell_addAction) self.addAction(self.cell_subAction) self.addAction(self.cell_mulAction) self.addAction(self.cell_divAction) self.addAction(self.cell_sumAction) self.addAction(self.firstSeparator) self.addAction(self.colorAction) self.addAction(self.fontAction) self.addAction(self.secondSeparator) self.addAction(self.clearAction) self.setContextMenuPolicy(Qt.ActionsContextMenu) return self def formulaBar(self): return self def functionBar(self): return self
try: rootPath = parser.positionalArguments().pop(0) except IndexError: rootPath = None model = QFileSystemModel() model.setRootPath('') if parser.isSet(dontUseCustomDirectoryIconsOption): model.iconProvider().setOptions( QFileIconProvider.DontUseCustomDirectoryIcons) tree = QTreeView() tree.setModel(model) if rootPath is not None: rootIndex = model.index(QDir.cleanPath(rootPath)) if rootIndex.isValid(): tree.setRootIndex(rootIndex) # Demonstrating look and feel features. tree.setAnimated(False) tree.setIndentation(20) tree.setSortingEnabled(True) availableSize = QApplication.desktop().availableGeometry(tree).size() tree.resize(availableSize / 2) tree.setColumnWidth(0, tree.width() / 3) tree.setWindowTitle("Dir View") tree.show() sys.exit(app.exec_())
class PyCommonist(QWidget): tool = None def __init__(self): super(PyCommonist, self).__init__() self.initUI() self.threads = [] self.workers = [] def initUI(self): self.currentDirectoryPath = "" self.generateSplitter() self.generateLeftTopFrame() self.generateLeftBottomFrame() self.showMaximized() self.setWindowTitle("PyCommonist - Wikimedia Commons") self.show() """ onSelectFolder """ def onSelectFolder(self, selected, deselected): try: currentIndex = selected.indexes()[0] self.currentDirectoryPath = self.modelTree.filePath(currentIndex) print(self.currentDirectoryPath) self.statusBar.setText("") self.exifImageCollection = [] list_dir = os.listdir(self.currentDirectoryPath) files = [ f for f in sorted(list_dir) if isfile(join(self.currentDirectoryPath, f)) ] for file in files: fullFilePath = os.path.join(self.currentDirectoryPath, file) if fullFilePath.endswith(".jpeg") or fullFilePath.endswith( ".jpg") or fullFilePath.endswith(".png"): currentExifImage = EXIFImage() currentExifImage.fullFilePath = fullFilePath currentExifImage.filename = file tags = None try: """ EXIF """ f_exif = open(fullFilePath, "rb") tags = exifread.process_file(f_exif) # print(tags) except: print("A problem with EXIF data reading") """ Location""" # 'GPS GPSLatitude', 'GPS GPSLongitude'] # [45, 49, 339/25] [4, 55, 716/25] # 'GPS GPSImgDirection' 'GPS GPSLatitudeRef' lat = "" long = "" heading = "" try: currentExifImage.lat, currentExifImage.long, currentExifImage.heading = get_exif_location( tags) except: print("A problem with EXIF data reading") dt = None try: """ Date Time """ dt = tags[ "EXIF DateTimeOriginal"] # 2021:01:13 14:48:44 except: print("A problem with EXIF data reading") print(dt) dt = str(dt) indexSpace = dt.find(" ") currentExifImage.date = dt[0:indexSpace].replace(":", "-") currentExifImage.time = dt[indexSpace + 1:] self.exifImageCollection.append(currentExifImage) print(currentExifImage) self.generateRightFrame() except: print("Something bad happened inside onSelectFolder function") traceback.print_exc() """ cbImportNoneStateChanged """ def cbImportNoneStateChanged(self): print(self.cbImportNone.isChecked()) print(len(self._currentUpload)) if self.cbImportNone.isChecked() and len(self._currentUpload) > 0: for element in self._currentUpload: element.cbImport.setCheckState(False) """ cbImportAllStateChanged """ def cbImportAllStateChanged(self): print(self.cbImportAll.isChecked()) print(len(self._currentUpload)) if self.cbImportAll.isChecked() and len(self._currentUpload) > 0: for element in self._currentUpload: element.cbImport.setCheckState(True) """ onClickImport """ def onClickImport(self): if self.tool == None: self.tool = UploadTool() ret = self.tool.uploadImages(self) """ cleanThreads """ def cleanThreads(self): try: print("Clean properly threads") for thread in self.threads: print("Current thread proper deletion") thread.quit() thread.wait() except: print("A problem with cleanThreads") """ generateSplitter """ def generateSplitter(self): vbox = QVBoxLayout() hbox = QHBoxLayout() self.leftTopFrame = QFrame() self.leftTopFrame.setFrameShape(QFrame.StyledPanel) self.rightWidget = QWidget() self.rightWidget.resize(300, 300) self.layoutRight = QVBoxLayout() self.rightWidget.setLayout(self.layoutRight) self.scroll = QScrollArea() self.layoutRight.addWidget(self.scroll) self.scroll.setWidgetResizable(True) self.scrollContent = QWidget(self.scroll) self.scrollLayout = QVBoxLayout(self.scrollContent) self.scrollContent.setLayout(self.scrollLayout) self.scroll.setWidget(self.scrollContent) self.splitterLeft = QSplitter(Qt.Vertical) self.leftBottonFrame = QFrame() self.leftBottonFrame.setFrameShape(QFrame.StyledPanel) self.splitterLeft.addWidget(self.leftTopFrame) self.splitterLeft.addWidget(self.leftBottonFrame) self.splitterLeft.setSizes([VERTICAL_TOP_SIZE, VERTICAL_BOTTOM_SIZE]) """ Horizontal Splitter """ self.splitterCentral = QSplitter(Qt.Horizontal) self.splitterCentral.addWidget(self.splitterLeft) self.splitterCentral.addWidget(self.rightWidget) self.splitterCentral.setSizes( [HORIZONTAL_LEFT_SIZE, HORIZONTAL_RIGHT_SIZE]) hbox.addWidget(self.splitterCentral) vbox.addLayout(hbox) """ Status Bar """ self.statusBar = QLabel() self.statusBar.setStyleSheet(STYLE_STATUSBAR) vbox.addWidget(self.statusBar) self.setLayout(vbox) """ generateLeftTopFrame """ def generateLeftTopFrame(self): self.layoutLeftTop = QFormLayout() self.layoutLeftTop.setFormAlignment(Qt.AlignTop) self.lblUserName = QLabel("Username: "******"Password: "******"Source: ") self.lblSource.setAlignment(Qt.AlignLeft) self.lineEditSource = QLineEdit() self.lineEditSource.setFixedWidth(WIDTH_WIDGET) self.lineEditSource.setText(LeftFrameConfig.source) self.lineEditSource.setAlignment(Qt.AlignLeft) self.layoutLeftTop.addRow(self.lblSource, self.lineEditSource) self.lblAuthor = QLabel("Author: ") self.lblAuthor.setAlignment(Qt.AlignLeft) self.lineEditAuthor = QLineEdit() self.lineEditAuthor.setFixedWidth(WIDTH_WIDGET) self.lineEditAuthor.setText(LeftFrameConfig.author) self.lineEditAuthor.setAlignment(Qt.AlignLeft) self.layoutLeftTop.addRow(self.lblAuthor, self.lineEditAuthor) self.lblCategories = QLabel("Categories: ") self.lblCategories.setAlignment(Qt.AlignLeft) self.lineEditCategories = QLineEdit() self.lineEditCategories.setText(LeftFrameConfig.categories) self.lineEditCategories.setFixedWidth(WIDTH_WIDGET) self.lineEditCategories.setAlignment(Qt.AlignLeft) self.layoutLeftTop.addRow(self.lblCategories, self.lineEditCategories) self.lblLicense = QLabel("License: ") self.lblLicense.setAlignment(Qt.AlignLeft) self.lineEditLicense = QLineEdit() self.lineEditLicense.setFixedWidth(WIDTH_WIDGET) self.lineEditLicense.setText(LeftFrameConfig.licence) self.lineEditLicense.setAlignment(Qt.AlignLeft) self.layoutLeftTop.addRow(self.lblLicense, self.lineEditLicense) self.lblDescription = QLabel("Description: ") self.lblDescription.setAlignment(Qt.AlignLeft) self.lineEditDescription = QPlainTextEdit() self.lineEditDescription.setFixedWidth(WIDTH_WIDGET) self.layoutLeftTop.addRow(self.lblDescription, self.lineEditDescription) separationLeftTopFrame = QLabel() self.layoutLeftTop.addWidget(separationLeftTopFrame) """ Button Import & None/All checkboxes""" importWidget = QWidget() importLayout = QHBoxLayout() importWidget.setLayout(importLayout) self.cbImportNone = QCheckBox("None") self.cbImportNone.stateChanged.connect(self.cbImportNoneStateChanged) self.cbImportAll = QCheckBox("All") self.cbImportAll.stateChanged.connect(self.cbImportAllStateChanged) self.btnImport = QPushButton("Import!") self.btnImport.clicked.connect(self.onClickImport) importLayout.addWidget(self.cbImportNone) importLayout.addWidget(self.cbImportAll) importLayout.addWidget(self.btnImport) self.layoutLeftTop.addWidget(importWidget) importWidget.setStyleSheet("border:1px solid #808080;") self.cbImportNone.setStyleSheet("border:0px;") self.cbImportAll.setStyleSheet("border:0px;") self.btnImport.setStyleSheet(STYLE_IMPORT_BUTTON) """ Layout Association of the Left Top Frame""" self.leftTopFrame.setLayout(self.layoutLeftTop) """ generateLeftBottomFrame """ def generateLeftBottomFrame(self): self.layoutLeftBottom = QVBoxLayout() """Model for QTreeView""" self.modelTree = QFileSystemModel() self.modelTree.setRootPath(QDir.currentPath()) self.modelTree.setFilter(QDir.Dirs) # Only directories """ QTreeView """ self.treeLeftBottom = QTreeView() self.treeLeftBottom.setModel(self.modelTree) self.treeLeftBottom.setAnimated(False) self.treeLeftBottom.setIndentation(10) self.treeLeftBottom.setColumnWidth(0, 300) self.treeLeftBottom.expandAll() self.treeLeftBottom.selectionModel().selectionChanged.connect( self.onSelectFolder) self.layoutLeftBottom.addWidget(self.treeLeftBottom) self.leftBottonFrame.setLayout(self.layoutLeftBottom) """ generateRightFrame """ def generateRightFrame(self): self._currentUpload = [] layout = self.scrollLayout print(layout) print(layout.count()) while layout.count(): print("destroy") child = layout.takeAt(0) if child.widget(): child.widget().deleteLater() for currentExifImage in self.exifImageCollection: """ Current image """ localWidget = ImageUpload() localLayout = QHBoxLayout() localLayout.setAlignment(Qt.AlignRight) localWidget.setLayout(localLayout) self.scrollLayout.addWidget(localWidget) self._currentUpload.append(localWidget) """Local Left Widget""" localLeftWidget = QWidget() localLeftLayout = QFormLayout() localLeftLayout.setAlignment(Qt.AlignRight) localLeftWidget.setLayout(localLeftLayout) localLayout.addWidget(localLeftWidget) """ import? + Import Status """ cbImport = QCheckBox("Import") lblUploadResult = QLabel() lblUploadResult.setStyleSheet(STYLE_IMPORT_STATUS) localLeftLayout.addRow(cbImport, lblUploadResult) localWidget.cbImport = cbImport localWidget.lblUploadResult = lblUploadResult """ File Name of picture """ lblFileName = QLabel("Name: ") lblFileName.setAlignment(Qt.AlignLeft) lineEditFileName = QLineEdit() lineEditFileName.setFixedWidth(WIDTH_WIDGET_RIGHT) lineEditFileName.setText(currentExifImage.filename) lineEditFileName.setAlignment(Qt.AlignLeft) localLeftLayout.addRow(lblFileName, lineEditFileName) localWidget.lineEditFileName = lineEditFileName """ Shadow Real FileName """ lblRealFileName = QLineEdit() lblRealFileName.setText(currentExifImage.filename) localWidget.lblRealFileName = lblRealFileName localWidget.lblRealFileName.isVisible = False """ Description """ lblDescription = QLabel("Description: ") lblDescription.setAlignment(Qt.AlignLeft) lineEditDescription = QPlainTextEdit() lineEditDescription.setFixedWidth(WIDTH_WIDGET_RIGHT) localLeftLayout.addRow(lblDescription, lineEditDescription) localWidget.lineEditDescription = lineEditDescription """ Categories """ lblCategories = QLabel("Categories: ") lblCategories.setAlignment(Qt.AlignLeft) lineEditCategories = QLineEdit() lineEditCategories.setFixedWidth(WIDTH_WIDGET_RIGHT) lineEditCategories.setAlignment(Qt.AlignLeft) localLeftLayout.addRow(lblCategories, lineEditCategories) localWidget.lineEditCategories = lineEditCategories lblLocation = QLabel("Location: ") lblLocation.setAlignment(Qt.AlignLeft) lineEditLocation = QLineEdit() lineEditLocation.setFixedWidth(WIDTH_WIDGET_RIGHT) if currentExifImage.lat == None or currentExifImage.long == None: lineEditLocation.setText("") else: lineEditLocation.setText( str(currentExifImage.lat) + "|" + str(currentExifImage.long) + "|heading:" + str(currentExifImage.heading)) lineEditLocation.setAlignment(Qt.AlignLeft) localLeftLayout.addRow(lblLocation, lineEditLocation) localWidget.lineEditLocation = lineEditLocation lblDateTime = QLabel("Date Time: ") lblDateTime.setAlignment(Qt.AlignLeft) lineEditDateTime = QLineEdit() lineEditDateTime.setFixedWidth(WIDTH_WIDGET_RIGHT) lineEditDateTime.setText(currentExifImage.date + " " + currentExifImage.time) lineEditDateTime.setAlignment(Qt.AlignLeft) localLeftLayout.addRow(lblDateTime, lineEditDateTime) localWidget.lineEditDateTime = lineEditDateTime """ Image itself """ label = QLabel() pixmap = QPixmap(currentExifImage.fullFilePath) pixmapResize = pixmap.scaledToWidth(IMAGE_DIMENSION, Qt.FastTransformation) label.setPixmap(pixmapResize) localLayout.addWidget(label) localWidget.fullFilePath = currentExifImage.fullFilePath self.update()
class DataViewer(QWidget): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.setMinimumSize(500, 400) main_layout = QHBoxLayout() main_layout.setSpacing(5) self.setLayout(main_layout) control_column = QVBoxLayout() main_layout.addLayout(control_column, stretch=1) refresh_button = QPushButton('🔄 Refresh') refresh_button.setFont(cn.EMOJI_FONT) refresh_button.clicked.connect(self.refresh_list) control_column.addWidget(refresh_button) self.gesture_tree_view = QTreeView() self.gesture_tree_view.setMinimumWidth(250) self.gesture_tree_view.header().hide() self.gesture_tree_view.setEditTriggers( QAbstractItemView.NoEditTriggers) self.gesture_tree_view.clicked.connect(self.show_selected) self.gesture_tree_view.setContextMenuPolicy(Qt.CustomContextMenu) self.gesture_tree_view.customContextMenuRequested.connect( self.gesture_context_menu) self.gesture_model = QStandardItemModel() self.gesture_tree_view.setModel(self.gesture_model) self.gesture_tree_view.setAnimated(True) control_column.addWidget(self.gesture_tree_view) self.displayed_gestures_layout = QVBoxLayout() display_column = QVBoxLayout() close_all_button = QPushButton('❌ Close all opened') close_all_button.setFont(cn.EMOJI_FONT) def close_all_displayed_gestures(): for i in range(self.displayed_gestures_layout.count()): self.displayed_gestures_layout.itemAt(i).widget().close() close_all_button.clicked.connect(close_all_displayed_gestures) control_column.addWidget(close_all_button) display_column.addLayout( VerticalScrollableExtension(self.displayed_gestures_layout)) main_layout.addLayout(display_column, stretch=2) self.refresh_list() def refresh_list(self): gestures = sorted(os.listdir(cn.DATA_FOLDER)) gesture_tree = {} for gesture in gestures: parts = gesture.split(cn.FILE_NAME_SEPARATOR) if parts[0] == cn.SESSION_PREFIX: continue if len(parts) < 3 or parts[0] != cn.GESTURE_PREFIX: logger.debug(f'Skipping file {gesture}, unknown naming.') continue index = int(parts[1]) if index < 0 or index >= len(cn.GESTURES): logger.debug(f'Invalid index on {gesture}, skipping.') continue gesture = cn.GESTURES[index] parts[1] = str(gesture) current_node = gesture_tree for part in parts[1:]: current_node = current_node.setdefault(part, {}) self.gesture_model.clear() root = self.gesture_model.invisibleRootItem() def add_tree(tree: dict, node: QStandardItem): for item in tree: child_node = QStandardItem(item) node.appendRow(child_node) add_tree(tree[item], child_node) add_tree(gesture_tree, root) @staticmethod def get_filename(model_index): name = [] node = model_index while node.isValid(): name.append(node.data()) node = node.parent() name.append(cn.GESTURE_PREFIX) # TODO this could be nicer for i, gesture_spec in enumerate(cn.GESTURES): if str(gesture_spec) == name[-2]: name[-2] = str(i) return cn.FILE_NAME_SEPARATOR.join(name[::-1]) def show_selected(self, model_index): is_leaf = not model_index.child(0, 0).isValid() if not is_leaf: self.gesture_tree_view.setExpanded( model_index, not self.gesture_tree_view.isExpanded(model_index)) return filename = DataViewer.get_filename(model_index) selected_file = cn.DATA_FOLDER / filename data = np.load(selected_file) signal_widget = StaticSignalWidget() signal_widget.plot_data(data) widget = NamedExtension(filename, signal_widget) widget = BlinkExtension(widget) widget = ClosableExtension(widget) widget.setMinimumWidth(600) widget.setFixedHeight(200) self.displayed_gestures_layout.addWidget(widget) def gesture_context_menu(self, point): model_index = self.gesture_tree_view.indexAt(point) is_leaf = not model_index.child(0, 0).isValid() if not is_leaf: self.gesture_tree_view.setExpanded( model_index, not self.gesture_tree_view.isExpanded(model_index)) return menu = QMenu() def move_dialog(): Renamer(DataViewer.get_filename(model_index)).exec() menu.addAction('Move', move_dialog) def trash_and_remove_from_tree(): if Renamer.trash_gesture(DataViewer.get_filename(model_index)): self.gesture_model.removeRow(model_index.row(), model_index.parent()) menu.addAction('Trash', trash_and_remove_from_tree) menu.exec(QCursor.pos())
class Watch(QWidget): def __init__(self, parent=None): super(QWidget, self).__init__(parent) self.initUI() self.initVariables() def initUI(self): mainlayout = QFormLayout() self.model = CheckableDirModel() #self.model = QFileSystemModel() self.tree = QTreeView() self.tree.setModel(self.model) self.tree.setAnimated(False) self.tree.setIndentation(20) self.tree.setColumnHidden(1, True) self.tree.setColumnHidden(2, True) self.tree.setColumnHidden(3, True) self.tree.setSortingEnabled(False) self.tree.setHeaderHidden(True) self.model.updateCheckBoxSignal.connect(self.updateCheckBoxes) buttonLayout = QHBoxLayout() self.applyButton = QPushButton("Apply", self) self.applyButton.clicked.connect(self.apply) self.applyButton.setEnabled(False) self.resetButton = QPushButton("Reset", self) hspacer = QWidget() hspacer.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) buttonLayout.addWidget(hspacer) buttonLayout.addWidget(self.applyButton) buttonLayout.addWidget(self.resetButton) vspacer = QWidget() vspacer.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) # Add to layout mainlayout.addRow(self.tree) mainlayout.addRow(vspacer) mainlayout.addRow(buttonLayout) self.setLayout(mainlayout) def initVariables(self): settings = readSettingItems(['Watched']) if 'Watched' in settings.keys(): if len(settings['Watched']): self.watchList = settings['Watched'] if len(self.watchList): for watchItem in self.watchList: tempPath = watchItem[0] tempIndex = self.model.index(tempPath, 0) retData = self.model.filePath(tempIndex) # Set checkbox if len(retData): self.model.setData(tempIndex, watchItem[1], Qt.CheckStateRole) # Expand path while tempIndex.parent().isValid(): tempIndex = tempIndex.parent() self.tree.expand(tempIndex) else: self.watchList = [] def updateCheckBoxes(self, index, value): changeFlag = False fullpath = self.model.filePath(index) newWatchMission = [fullpath, value] if newWatchMission in self.watchList: pass else: if len(self.watchList): tempList = list(filter(lambda x: fullpath in x, self.watchList)) if len(tempList) == 1: tempMissionIndex = self.watchList.index(tempList[0]) if value == 0: self.watchList.pop(tempMissionIndex) else: self.watchList[tempMissionIndex] = newWatchMission elif len(tempList) == 0: if value != 0: self.watchList.append(newWatchMission) changeFlag = True self.applyButton.setEnabled(changeFlag) # to do: update checkboxes states: 0, 1, 2. def apply(self): data = {'Watched': self.watchList } writeSettingItems(data) self.applyButton.setEnabled(False)
class AddToProject(QDialog): """Dialog to let the user choose one of the folders from the opened proj""" def __init__(self, projects, parent=None): super(AddToProject, self).__init__(parent) # projects must be a list self._projects = projects self.setWindowTitle(translations.TR_ADD_FILE_TO_PROJECT) self.path_selected = '' vbox = QVBoxLayout(self) hbox = QHBoxLayout() self._list = QListWidget() for project in self._projects: self._list.addItem(project.name) self._list.setCurrentRow(0) self._tree = QTreeView() self._tree.setHeaderHidden(True) self._tree.setSelectionMode(QTreeView.SingleSelection) self._tree.setAnimated(True) self.load_tree(self._projects[0]) hbox.addWidget(self._list) hbox.addWidget(self._tree) vbox.addLayout(hbox) hbox2 = QHBoxLayout() btn_add = QPushButton(translations.TR_ADD_HERE) btn_cancel = QPushButton(translations.TR_CANCEL) hbox2.addWidget(btn_cancel) hbox2.addWidget(btn_add) vbox.addLayout(hbox2) btn_add.clicked.connect(self._select_path) btn_cancel.clicked.connect(self.close) self._list.currentItemChanged.connect(self._project_changed) def _project_changed(self, item, previous): # FIXME, this is not being called, at least in osx for each_project in self._projects: if each_project.name == item.text(): self.load_tree(each_project) def load_tree(self, project): """Load the tree view on the right based on the project selected.""" qfsm = QFileSystemModel() qfsm.setRootPath(project.path) load_index = qfsm.index(qfsm.rootPath()) qfsm.setFilter(QDir.AllDirs | QDir.NoDotAndDotDot) qfsm.setNameFilterDisables(False) pext = ["*{0}".format(x) for x in project.extensions] qfsm.setNameFilters(pext) self._tree.setModel(qfsm) self._tree.setRootIndex(load_index) t_header = self._tree.header() t_header.setHorizontalScrollMode(QAbstractItemView.ScrollPerPixel) t_header.setSectionResizeMode(0, QHeaderView.Stretch) t_header.setStretchLastSection(False) t_header.setSectionsClickable(True) self._tree.hideColumn(1) # Size self._tree.hideColumn(2) # Type self._tree.hideColumn(3) # Modification date # FIXME: Changing the name column's title requires some magic # Please look at the project tree def _select_path(self): """Set path_selected to the folder selected in the tree.""" path = self._tree.model().filePath(self._tree.currentIndex()) if path: self.path_selected = path self.close()
class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(970, 650) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.horizontalLayout = QtWidgets.QHBoxLayout(self.centralwidget) self.horizontalLayout.setObjectName("horizontalLayout") self.splitter = QtWidgets.QSplitter(self.centralwidget) self.splitter.setOrientation(QtCore.Qt.Horizontal) self.splitter.setHandleWidth(1) self.splitter.setObjectName("splitter") self.horizontalLayout.addWidget(self.splitter) MainWindow.setCentralWidget(self.centralwidget) # 文件树形目录浏览器 self.tree = QTreeView() self.model = QtWidgets.QFileSystemModel() self.model.setRootPath('') self.nameFile = ["*.png", "*.jpg", "*.jpeg"] self.model.setNameFilterDisables(False) self.model.setNameFilters(self.nameFile) self.tree.setModel(self.model) self.tree.setAnimated(False) self.tree.setIndentation(20) self.tree.setWindowTitle("Dir View") self.tree.setSortingEnabled(True) self.tree.setColumnHidden(1, True) self.tree.setColumnHidden(2, True) self.tree.setColumnHidden(3, True) self.tree.doubleClicked.connect(self.openFileFromTreeList) # 图库管理器 self.tree_2 = QTreeWidget() self.tree_2.setColumnCount(1) # 设置表头信息:隐藏表头 self.tree_2.setHeaderHidden(1) # 设置root和root2为self.tree的子树,所以root和root2就是跟节点 root = QTreeWidgetItem(self.tree_2) root2 = QTreeWidgetItem(self.tree_2) # 设置根节点的名称 root.setText(0, '第一节点') root2.setText(0, '第二节点') # 为root节点设置子结点 child1 = QTreeWidgetItem(root) child1.setText(0, 'child1') child1.setText(1, 'name1') child2 = QTreeWidgetItem(root) # 设置child2节点的图片 child2.setText(0, 'child2') child2.setText(1, 'name2') # 实例化QToolBox self.toolBox = QToolBox() # 设置左侧导航栏 toolBox 在左右拉拽时的最小宽度 self.toolBox.setMinimumWidth(100) # 给QToolBox添加两个子项目 self.toolBox.addItem(self.tree, "文件资源") self.toolBox.addItem(self.tree_2, "图库") # 给QSplitter添加第一个窗体(QToolBox) self.splitter.addWidget(self.toolBox) #菜单栏 self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(10, 10, 820, 30)) self.menubar.setObjectName("menubar") MainWindow.setMenuBar(self.menubar) self.menu1_file = QtWidgets.QMenu(self.menubar) self.menu1_file.setObjectName("menu1_file") self.menu2_edit = QtWidgets.QMenu(self.menubar) self.menu2_edit.setObjectName("menu2_edit") self.menu3_imageLib = QtWidgets.QMenu(self.menubar) self.menu3_imageLib.setObjectName("menu3_imageLib") self.menu4_image = QtWidgets.QMenu(self.menubar) self.menu4_image.setObjectName("menu4_image") self.menu6_user = QtWidgets.QMenu(self.menubar) self.menu6_user.setObjectName("menu6_user") self.menu5_help = QtWidgets.QMenu(self.menubar) self.menu5_help.setObjectName("menu5_help") MainWindow.setMenuBar(self.menubar) #menu Action #################action1###################### self.action_1_1 = QtWidgets.QAction(MainWindow) self.action_1_1.setObjectName("action_1_1") #打开 self.action_1_1.triggered.connect(self.openfile) self.action_1_2 = QtWidgets.QAction(MainWindow) self.action_1_2.setObjectName("action_1_2") #保存 self.action_1_3 = QtWidgets.QAction(MainWindow) self.action_1_3.setObjectName("action_1_3") #退出 #################action2###################### self.action_2_1 = QtWidgets.QAction(MainWindow) self.action_2_1.setObjectName("action_2_1") #图片编辑 self.action_2_1.triggered.connect(self.openChildWindow) #################action3###################### self.action_3_1 = QtWidgets.QAction(MainWindow) self.action_3_1.setObjectName("action_3_1") #图库管理器 self.action_3_1.triggered.connect(self.imageLibUi) #################action4###################### self.action_4_1 = QtWidgets.QAction(MainWindow) self.action_4_1.setObjectName("action_4_1") # 添加图片 self.action_4_2 = QtWidgets.QAction(MainWindow) self.action_4_2.setObjectName("action_4_2") # 删除图片 self.action_4_3 = QtWidgets.QAction(MainWindow) self.action_4_3.setObjectName("action_4_3") # 重命名 #################action5###################### self.action_5 = QtWidgets.QAction(MainWindow) self.action_5.setObjectName("action_5") #帮助 #################action6###################### self.action_6 = QtWidgets.QAction(MainWindow) self.action_6.setObjectName("action_6") #用户管理 self.action_6.triggered.connect(self.userManager) #给menu添加Action self.menu1_file.addAction(self.action_1_1) #打开 self.menu1_file.addAction(self.action_1_2) #保存 self.menu1_file.addAction(self.action_1_3) #退出 self.menu2_edit.addAction(self.action_2_1) #图片编辑 self.menu3_imageLib.addAction(self.action_3_1) #图库管理器 self.menu4_image.addAction(self.action_4_1) #添加图片 self.menu4_image.addAction(self.action_4_2) #删除图片 self.menu4_image.addAction(self.action_4_3) #重命名 self.menu6_user.addAction(self.action_6) #用户管理 self.menu5_help.addAction(self.action_5) #帮助 self.menubar.addAction(self.menu1_file.menuAction()) self.menubar.addAction(self.menu2_edit.menuAction()) self.menubar.addAction(self.menu3_imageLib.menuAction()) self.menubar.addAction(self.menu4_image.menuAction()) self.menubar.addAction(self.menu5_help.menuAction()) self.menubar.addAction(self.menu6_user.menuAction()) #Icon icon = QtGui.QIcon() icon2 = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap("Icon/openfile.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) icon2.addPixmap(QtGui.QPixmap("Icon/edit.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.action_1_1.setIcon(icon) self.action_2_1.setIcon(icon2) #工具栏 self.toolBar = QtWidgets.QToolBar(MainWindow) self.toolBar.setInputMethodHints(QtCore.Qt.ImhHiddenText | QtCore.Qt.ImhSensitiveData) self.toolBar.setObjectName("toolBar") MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.toolBar) self.toolBar.addAction(self.action_1_1) self.toolBar.addAction(self.action_2_1) #状态栏 self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) #初始化默认窗体 #初始化默认窗体(图片显示窗体) self.imageView = ImageView() # 在主窗口里添加子窗口 self.splitter.addWidget(self.imageView) #是普通用户还是管理员 self self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) # 创建默认存放文件的文件夹: cur_dir = "C:" folder_name = 'InfraredImage' if os.path.isdir("C:/InfraredImage"): print("Already exist!") else: os.mkdir(os.path.join(cur_dir, folder_name)) os.mkdir("C:/InfraredImage/TmpImg") def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "红外图像质量客观评价系统V1.0")) #导航栏名字 self.menu1_file.setTitle(_translate("MainWindow", "文件")) self.menu3_imageLib.setTitle(_translate("MainWindow", "图库管理")) self.menu4_image.setTitle(_translate("MainWindow", "图片管理")) self.menu2_edit.setTitle(_translate("MainWindow", "编辑")) self.menu6_user.setTitle(_translate("MainWindow", "用户管理")) self.menu5_help.setTitle(_translate("MainWindow", "帮助")) #action名字 self.action_1_1.setText(_translate("MainWindow", "打开")) self.action_1_1.setShortcut(_translate("MainWindow", "Ctrl+O")) self.action_1_2.setText(_translate("MainWindow", "保存")) self.action_1_2.setShortcut(_translate("MainWindow", "Ctrl+S")) self.action_1_3.setText(_translate("MainWindow", "退出")) self.action_1_3.setShortcut(_translate("MainWindow", "Ctrl+E")) self.action_2_1.setText(_translate("MainWindow", "编辑图片")) self.action_3_1.setText(_translate("MainWindow", "图库管理器")) self.action_4_1.setText(_translate("MainWindow", "添加图片")) self.action_4_2.setText(_translate("MainWindow", "删除图片")) self.action_4_3.setText(_translate("MainWindow", "重命名")) self.action_5.setText(_translate("MainWindow", "Help ?")) self.action_6.setText(_translate("MainWindow", "用户管理器")) self.statusbar.showMessage("Ready") ##########################功能函数区############################### def openfile(self): # 设置文件扩展名过滤,注意用双分号间隔 fileName1, filetype = QFileDialog.getOpenFileName( None, "选取文件", "C:/", "All Files (*);;Image (*.png *.jpg *.jpeg)") #显示图片,并初始化图片基本信息 self.openImage(fileName1) # 从文件资源目录树打开图片 def openFileFromTreeList(self, Qmodelidx): filePath = self.model.filePath(Qmodelidx) self.openImage(filePath) # 打开图片,并初始化图片基本信息 def openImage(self, filePath): self.action_2_1.setEnabled(True) self.splitter.widget(1).setParent(None) self.splitter.insertWidget(1, self.imageView) img = QtGui.QPixmap(filePath).scaled( self.imageView.graphicsView.width(), self.imageView.graphicsView.height()) self.imageView.graphicsView.setPixmap(img) self.newPic = Image.open(filePath) self.statusbar.showMessage("打开图片") self.imageView.listWidget.item(1).setText("大小: " + str(self.newPic.size)) self.imageView.listWidget.item(2).setText("色彩通道: " + self.newPic.mode) self.imageView.listWidget.item(3).setText("格式: " + self.newPic.format) self.imageView.listWidget.item(4).setText( "像素: " + str(self.newPic.getextrema())) self.imageView.listWidget.item(5).setText("文件: " + str(filePath)) # # 要把新打开的图片,和所有修改过的图片,都存进tempPic.jpg里面,作为一个中间变量。 self.newPic.save("C:/InfraredImage/TmpImg/tempPic.png") self.newPic = "C:/InfraredImage/TmpImg/tempPic.png" # 打开图片处理子窗口函 def openChildWindow(self): childUi = childWindow() if childUi.exec_() == QtWidgets.QDialog.Accepted: pass #打开图库管理窗口 def imageLibUi(self): self.imageLibUi = ImageLibUi() # 把QSplitter的指定位置的窗体从QSplitter中剥离 self.splitter.widget(1).setParent(None) # 在QSplitter的指定位置载入新窗体 self.splitter.insertWidget(1, self.imageLibUi) # 打开图库管理窗口时将图片编辑器设为不可用 self.action_2_1.setEnabled(False) #用户管理 def userManager(self): self.userWindow = UserManagerUi() # 把QSplitter的指定位置的窗体从QSplitter中剥离 self.splitter.widget(1).setParent(None) # 在QSplitter的指定位置载入新窗体 self.splitter.insertWidget(1, self.userWindow) # 打开图库管理窗口时将图片编辑器设为不可用 self.action_2_1.setEnabled(False)
class RegisterViewWidget(WidgetBase): def __init__(self, parent: QWidget): super(RegisterViewWidget, self).__init__(parent) self._registers = [] self._running_task: asyncio.Task = None self._visibility_selector = QComboBox(self) self._visibility_selector.addItem("Show all registers", lambda _: True) self._visibility_selector.addItem("Only configuration parameters", lambda r: r.mutable and r.persistent) # noinspection PyUnresolvedReferences self._visibility_selector.currentIndexChanged.connect( lambda _: self._on_visibility_changed()) self._reset_selected_button = make_button( self, "Reset selected", icon_name="clear-symbol", tool_tip=f"Reset the currently selected registers to their default " f"values. The restored values will be committed " f"immediately. This function is available only if a " f"default value is defined. [{RESET_SELECTED_SHORTCUT}]", on_clicked=self._do_reset_selected, ) self._reset_all_button = make_button( self, "Reset all", icon_name="skull-crossbones", tool_tip=f"Reset the all registers to their default " f"values. The restored values will be committed " f"immediately.", on_clicked=self._do_reset_all, ) self._read_selected_button = make_button( self, "Read selected", icon_name="process", tool_tip=f"Read the currently selected registers only " f"[{READ_SELECTED_SHORTCUT}]", on_clicked=self._do_read_selected, ) self._read_all_button = make_button( self, "Read all", icon_name="process-plus", tool_tip="Read all registers from the device", on_clicked=self._do_read_all, ) self._export_button = make_button( self, "Export", icon_name="export", tool_tip="Export configuration parameters", on_clicked=self._do_export, ) self._import_button = make_button( self, "Import", icon_name="import", tool_tip="Import configuration parameters", on_clicked=self._do_import, ) self._expand_all_button = make_button( self, "", icon_name="expand-arrow", tool_tip="Expand all namespaces", on_clicked=lambda: self._tree.expandAll(), ) self._collapse_all_button = make_button( self, "", icon_name="collapse-arrow", tool_tip="Collapse all namespaces", on_clicked=lambda: self._tree.collapseAll(), ) self._status_display = QLabel(self) self._status_display.setWordWrap(True) self._reset_selected_button.setEnabled(False) self._reset_all_button.setEnabled(False) self._read_selected_button.setEnabled(False) self._read_all_button.setEnabled(False) self._export_button.setEnabled(False) self._import_button.setEnabled(False) self._tree = QTreeView(self) self._tree.setVerticalScrollMode(QTreeView.ScrollPerPixel) self._tree.setHorizontalScrollMode(QTreeView.ScrollPerPixel) self._tree.setAnimated(True) self._tree.setSelectionMode(QAbstractItemView.ExtendedSelection) self._tree.setAlternatingRowColors(True) self._tree.setContextMenuPolicy(Qt.ActionsContextMenu) # Not sure about this one. This hardcoded value may look bad on some platforms. self._tree.setIndentation(20) def add_action( callback: typing.Callable[[], None], icon_name: str, name: str, shortcut: typing.Optional[str] = None, ): action = QAction(get_icon(icon_name), name, self) # noinspection PyUnresolvedReferences action.triggered.connect(callback) if shortcut: action.setShortcut(shortcut) action.setAutoRepeat(False) try: action.setShortcutVisibleInContextMenu(True) except AttributeError: pass # This feature is not available in PyQt before 5.10 self._tree.addAction(action) add_action(self._do_read_all, "process-plus", "Read all registers") add_action( self._do_read_selected, "process", "Read selected registers", READ_SELECTED_SHORTCUT, ) add_action( self._do_reset_selected, "clear-symbol", "Reset selected to default", RESET_SELECTED_SHORTCUT, ) self._tree.setItemDelegateForColumn( int(Model.ColumnIndices.VALUE), EditorDelegate(self._tree, self._display_status), ) # It doesn't seem to be explicitly documented, but it seems to be necessary to select either top or bottom # decoration position in order to be able to use center alignment. Left or right positions do not work here. self._tree.setItemDelegateForColumn( int(Model.ColumnIndices.FLAGS), StyleOptionModifyingDelegate( self._tree, decoration_position=QStyleOptionViewItem.Top, # Important decoration_alignment=Qt.AlignCenter, ), ) header: QHeaderView = self._tree.header() header.setSectionResizeMode(QHeaderView.ResizeToContents) header.setStretchLastSection( False) # Horizontal scroll bar doesn't work if this is enabled buttons_layout = QGridLayout() buttons_layout.addWidget(self._read_selected_button, 0, 0) buttons_layout.addWidget(self._reset_selected_button, 0, 2) buttons_layout.addWidget(self._read_all_button, 1, 0) buttons_layout.addWidget(self._reset_all_button, 1, 2) buttons_layout.addWidget(self._import_button, 2, 0) buttons_layout.addWidget(self._export_button, 2, 2) for col in range(3): buttons_layout.setColumnStretch(col, 1) layout = lay_out_vertically( (self._tree, 1), buttons_layout, lay_out_horizontally( self._visibility_selector, (None, 1), self._expand_all_button, self._collapse_all_button, ), self._status_display, ) self.setLayout(layout) def reset(self): self.setup([]) def setup(self, registers: typing.Iterable[Register]): self._registers = list(registers) self._on_visibility_changed() def _replace_model( self, register_visibility_predicate: typing.Callable[[Register], bool]): # Cancel all operations that might be pending on the old model self._cancel_task() old_model = self._tree.model() # Configure the new model filtered_registers = list( filter(register_visibility_predicate, self._registers)) # It is important to set the Tree widget as the parent in order to let the widget take ownership new_model = Model(self._tree, filtered_registers) _logger.info("New model %r", new_model) self._tree.setModel(new_model) # The selection model is implicitly replaced when we replace the model, so it has to be reconfigured self._tree.selectionModel().selectionChanged.connect( lambda *_: self._on_selection_changed()) # TODO: Something fishy is going on. Something keeps the old model alive when we're replacing it. # We could call deleteLater() on it, but it seems dangerous, because if that something ever decided # to refer to that dead model later for any reason, we'll get a rougue dangling pointer access on # our hands. The horror! if old_model is not None: import gc model_referrers = gc.get_referrers(old_model) if len(model_referrers) > 1: _logger.warning( "Extra references to the old model %r: %r", old_model, model_referrers, ) # Update the widget - all root items are expanded by default for row in itertools.count(): index = self._tree.model().index(row, 0) if not index.isValid(): break self._tree.expand(index) self._reset_selected_button.setEnabled(False) self._read_selected_button.setEnabled(False) self._read_all_button.setEnabled(len(filtered_registers) > 0) self._reset_all_button.setEnabled(len(filtered_registers) > 0) self._export_button.setEnabled(len(filtered_registers) > 0) self._import_button.setEnabled(len(filtered_registers) > 0) self._display_status(f"{len(filtered_registers)} registers loaded") def _on_visibility_changed(self): self._replace_model(self._visibility_selector.currentData()) def _on_selection_changed(self): selected = self._get_selected_registers() self._reset_selected_button.setEnabled( any(map(lambda r: r.has_default_value, selected))) self._read_selected_button.setEnabled(len(selected) > 0) def _do_read_selected(self): selected = self._get_selected_registers() if selected: self._read_specific(selected) else: self._display_status("No registers are selected, nothing to read") def _do_reset_selected(self): rv = {} for r in self._get_selected_registers(): if r.has_default_value: rv[r] = r.default_value self._write_specific(rv) def _do_reset_all(self): rv = {} for r in self._registers: if r.has_default_value: rv[r] = r.default_value self._write_specific(rv) def _do_read_all(self): self._read_specific(self._tree.model().registers) def _do_import(self): import_registers(parent=self, registers=self._registers) def _do_export(self): export_registers(parent=self, registers=self._registers) def _read_specific(self, registers: typing.List[Register]): total_registers_read = None def progress_callback(register: Register, current_register_index: int, total_registers: int): nonlocal total_registers_read total_registers_read = total_registers self._display_status( f"Reading {register.name!r} " f"({current_register_index + 1} of {total_registers})") async def executor(): try: _logger.info("Reading registers: %r", [r.name for r in registers]) mod: Model = self._tree.model() await mod.read(registers=registers, progress_callback=progress_callback) except asyncio.CancelledError: self._display_status(f"Read has been cancelled") raise except Exception as ex: _logger.exception("Register read failed") show_error("Read failed", "Could not read registers", repr(ex), self) self._display_status(f"Could not read registers: {ex!r}") else: self._display_status( f"{total_registers_read} registers have been read") self._cancel_task() self._running_task = asyncio.get_event_loop().create_task(executor()) def _write_specific(self, register_value_mapping: typing.Dict[Register, typing.Any]): total_registers_assigned = None def progress_callback(register: Register, current_register_index: int, total_registers: int): nonlocal total_registers_assigned total_registers_assigned = total_registers self._display_status( f"Writing {register.name!r} " f"({current_register_index + 1} of {total_registers})") async def executor(): try: _logger.info( "Writing registers: %r", [r.name for r in register_value_mapping.keys()], ) mod: Model = self._tree.model() await mod.write( register_value_mapping=register_value_mapping, progress_callback=progress_callback, ) except asyncio.CancelledError: self._display_status(f"Write has been cancelled") raise except Exception as ex: _logger.exception("Register write failed") show_error("Write failed", "Could not read registers", repr(ex), self) self._display_status(f"Could not write registers: {ex!r}") else: self._display_status( f"{total_registers_assigned} registers have been written") self._cancel_task() self._running_task = asyncio.get_event_loop().create_task(executor()) def _get_selected_registers(self) -> typing.List[Register]: selected_indexes: typing.List[ QModelIndex] = self._tree.selectedIndexes() selected_registers = set() for si in selected_indexes: r = Model.get_register_from_index(si) if r is not None: selected_registers.add(r) # Beware that sets are not sorted, this may lead to weird user experience when watching the registers # read in a funny order. return list(sorted(selected_registers, key=lambda x: x.name)) def _cancel_task(self): # noinspection PyBroadException try: self._running_task.cancel() except Exception: pass else: _logger.info("A running task had to be cancelled: %r", self._running_task) finally: self._running_task = None def _display_status(self, text=None): self._status_display.setText(text)
try: rootPath = parser.positionalArguments().pop(0) except IndexError: rootPath = None model = QFileSystemModel() model.setRootPath("") if parser.isSet(dontUseCustomDirectoryIconsOption): model.iconProvider().setOptions( QFileIconProvider.DontUseCustomDirectoryIcons) tree = QTreeView() tree.setModel(model) if rootPath is not None: rootIndex = model.index(QDir.cleanPath(rootPath)) if rootIndex.isValid(): tree.setRootIndex(rootIndex) # Demonstrating look and feel features. tree.setAnimated(False) tree.setIndentation(20) tree.setSortingEnabled(True) availableSize = QApplication.desktop().availableGeometry(tree).size() tree.resize(availableSize / 2) tree.setColumnWidth(0, tree.width() / 3) tree.setWindowTitle("Dir View") tree.show() sys.exit(app.exec_())
class MainGui(QWidget): filePath = pyqtSignal(str) fileArray = pyqtSignal() def __init__(self, parent): """ This class is the main widget containing displaying the lung scan. It opens the DICOM files and apply the b line detection algorithm. :param parent: """ super(MainGui, self).__init__(parent) # grid layout self.hlayout_main = QHBoxLayout(self) self.setLayout(self.hlayout_main) # button self.prevButton = QPushButton("Prev") self.prevButton.setDisabled(True) self.nextButton = QPushButton("Next") self.nextButton.setDisabled(True) self.selectBlineAreaButton = QPushButton("Select Bline area ...") self.selectBlineAreaButton.setDisabled(True) # qcheckbox self.qcheckbox_show_filter = QCheckBox("Show B line(s)") self.qcheckbox_show_filter.setDisabled(True) # qgoup box self.qgroup_info = QGroupBox("Informations") # qlabel self.label_image = QLabelSelectable.QLabelSelectable(self) self.label_image.setPixmap( QPixmap('Resource/no-image-icon.png').scaled(800, 600)) # self.label_image.setFixedSize(800, 600) self.label_index_image = QLabel(self) self.label_nb_line_detected = QLabel("Number of line detected : ") self.label_average_line_detected = QLabel("Average line detected : ") self.label_percentage_black_white = QLabel("Ratio of black/white : ") self.label_filepath = QLabel("Filepath : ") # qtree widget self.model = QFileSystemModel() self.model.setRootPath(os.path.normpath(Path.home())) self.tree = QTreeView() self.tree.setModel(self.model) self.tree.setAnimated(False) self.tree.setIndentation(20) self.tree.setSortingEnabled(True) # signal self.filePath.connect(self.readDicomFile) self.fileArray.connect(self.display_image) self.prevButton.clicked.connect(self.prev_image) self.nextButton.clicked.connect(self.next_image) self.selectBlineAreaButton.clicked.connect(self.startSelection) self.qcheckbox_show_filter.stateChanged.connect(self.startFiltering) self.tree.doubleClicked.connect(self.tree_open_file) self.label_image.selectionFinished.connect(self.selectionDone) self.label_image.selectionFinished.connect( self.ComputeBlackWhitePixelRatio) # horizontal layout for loading info and go back button self.hlayout_change_buttons = QHBoxLayout() self.hlayout_change_buttons.addStretch(0) self.hlayout_change_buttons.addWidget(self.prevButton) self.hlayout_change_buttons.addWidget(self.label_index_image) self.hlayout_change_buttons.addWidget(self.nextButton) self.hlayout_change_buttons.addStretch(0) # vlayout self.vlayout_checkbox = QVBoxLayout() self.vlayout_checkbox.addWidget(self.selectBlineAreaButton) self.vlayout_checkbox.addWidget(self.qcheckbox_show_filter) self.vlayout_info_label = QVBoxLayout() self.vlayout_info_label.addWidget(self.label_nb_line_detected) self.vlayout_info_label.addWidget(self.label_average_line_detected) self.vlayout_info_label.addWidget(self.label_percentage_black_white) self.vlayout_info_label.addWidget(self.label_filepath) self.vlayout_info_label.addStretch(0) self.qgroup_info.setLayout(self.vlayout_info_label) self.vlayout_checkbox.addWidget(self.qgroup_info) self.vlayout_checkbox.addStretch(0) # hlayout self.hlayout_display = QVBoxLayout() self.hlayout_display.addWidget(self.label_image) self.hlayout_display.addStretch(0) self.hlayout_display.addLayout(self.hlayout_change_buttons) # gui layout self.hlayout_main.addWidget(self.tree) self.hlayout_main.addStretch(0) self.hlayout_main.addLayout(self.hlayout_display) self.hlayout_main.addStretch(0) self.hlayout_main.addLayout(self.vlayout_checkbox) # model self.dicomFilePath = None self.imageArray = None self.image_index = 0 self.selectedPixmap = None @pyqtSlot(QModelIndex) def tree_open_file(self, index): """ This function call the readDicomfile function when an element of the tree is double clicked. """ self.dicomFilePath = self.model.filePath(index) self.filePath.emit(str(self.dicomFilePath)) def ComputeBlackWhitePixelRatio(self): """ This function compute the black/white percent and update the label. """ ratio = ComputeBlackWhitePercent(self.selectedPixmap) ratio.getRatio() self.label_percentage_black_white.setText( "Ratio of black/white : " + "{0:0.1f}".format(ratio.getRatio()) + " %") def selectionDone(self): """ This function stop the selection when it's done. """ self.qcheckbox_show_filter.setDisabled(False) image = self.imageArray[self.image_index] image = QImage(image, image.shape[1], image.shape[0], QImage.Format_Indexed8) pix = QPixmap(image) self.selectedPixmap = pix.copy(self.label_image.rubberBand.geometry()) def startSelection(self): """ This function manage the start of the selected area. """ image = self.imageArray[self.image_index] image = QImage(image, image.shape[1], image.shape[0], QImage.Format_Indexed8) pix = QPixmap(image) self.label_image.setPixmap(pix) self.label_image.reset() self.label_image.startSelection = True def startFiltering(self): """ This function is used to call filtering function when the bline area has been selected. The variable to use is self.selectedPixmap """ if self.qcheckbox_show_filter.isChecked(): # start bline detection and show bline run = RunAlgorithms() #result = run.runBlineDetection(self.selectedPixmap) else: # restore bline image = self.imageArray[self.image_index] image = QImage(image, image.shape[1], image.shape[0], QImage.Format_Indexed8) pix = QPixmap(image) self.label_image.setPixmap(pix) def openFile(self): """ This function create a pop up window to select a file to open. """ fileName, _ = QFileDialog.getOpenFileName(None, "Open DICOM File", directory=os.path.normpath( Path.home()), filter="*") if fileName: self.dicomFilePath = fileName self.filePath.emit(str(self.dicomFilePath)) @pyqtSlot(str) def readDicomFile(self, dicom_filepath): """ this function use the DICOMReader class to read a DICOm file. """ try: self.image_index = 0 self.label_filepath.setText("Filepath : " + dicom_filepath) self.selectBlineAreaButton.setDisabled(False) reader = DICOMReader.DICOMReader(dicom_filepath, False) self.imageArray = reader.get_images_array() self.prevButton.setDisabled(False) self.nextButton.setDisabled(False) self.fileArray.emit() except Exception as e: print(e) self.errorDialog( "DICOM File error", "The file you tried to open is not a DICOM file !") @pyqtSlot() def display_image(self, index=0): """ Display selected image into the label. """ image = self.imageArray[index] image = QImage(image, image.shape[1], image.shape[0], QImage.Format_Indexed8) pix = QPixmap(image) self.label_image.setPixmap(pix) self.label_index_image.setText( str(self.image_index) + "/" + str(self.imageArray.shape[0])) @pyqtSlot() def prev_image(self): """ Display previous image """ if self.image_index > 0: self.image_index -= 1 self.label_index_image.setText( str(self.image_index) + "/" + str(self.imageArray.shape[0])) self.display_image(self.image_index) @pyqtSlot() def next_image(self): """ Display next image """ if self.image_index < self.imageArray.shape[0]: self.image_index += 1 self.label_index_image.setText( str(self.image_index) + " / " + str(self.imageArray.shape[0])) self.display_image(self.image_index) def closeEvent(self, event): print("close event") print("closed") def errorMSG(self): self.errorDialog("Error !", "Error") def errorDialog(self, title, message): msg = QMessageBox(self) msg.setIcon(QMessageBox.Warning) msg.setText(message) msg.setWindowTitle(title) msg.setStandardButtons(QMessageBox.Ok) msg.exec_() def aboutPopUp(self): mailLabel = QLabel( "<a href='mailto:[email protected]'>[email protected]</a>" ) mailLabel.setOpenExternalLinks(True) msg = QMessageBox(self) msg.setIcon(QMessageBox.Information) msg.setText( "Lung BLine detection is created by : \n Nathanael Ponceau") msg.layout().addWidget(mailLabel) msg.setWindowTitle("About") msg.setStandardButtons(QMessageBox.Ok) msg.exec_()