예제 #1
0
파일: main.py 프로젝트: StewDude/Python
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()
예제 #2
0
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()
예제 #3
0
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()
예제 #4
0
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)      
예제 #5
0
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)
예제 #6
0
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()
예제 #7
0
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()
예제 #8
0
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)
예제 #9
0
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()
예제 #10
0
파일: ui.py 프로젝트: 5cr009e/voc_vis
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))
예제 #11
0
파일: views.py 프로젝트: spikespaz/archives
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)
예제 #12
0
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)
예제 #13
0
    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
예제 #14
0
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_())
예제 #16
0
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)
예제 #17
0
    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)
예제 #18
0
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)
예제 #19
0
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)
예제 #20
0
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()
예제 #21
0
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)
예제 #22
0
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()
예제 #23
0
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
예제 #24
0
파일: gui.py 프로젝트: solubrew/Pyffice
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
예제 #25
0
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_())
예제 #26
0
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()
예제 #27
0
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())
예제 #28
0
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)
예제 #29
0
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()
예제 #30
0
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)
예제 #31
0
파일: __init__.py 프로젝트: Zubax/kucher
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)
예제 #32
0
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_())
예제 #33
0
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_()