1

特定の場所にデフォルトで設定され、そのフォルダー内のすべてのフォルダーとそれらのフォルダー内のファイル数を表形式で表示するこのアプリケーションを構築しています。構成ファイルがないという事実にもかかわらず、C またはホーム ディレクトリを開く必要があります。アイデアは、やり取りしたいファイルのフォルダーにチェックマークを付けるというものです。基本的に、handleFolderCheckedに print ステートメントがあり、正しいアイテムを選択したことを知らせてくれます。

ファイルを開くと問題が発生します->メニューバーから開き、ポップアップするウィンドウで[フォルダーの選択]ボタンを押すと、選択の有無にかかわらず、テーブルビューに新しい表示が表示されますが、任意のアイテムのチェックマークをクリックすると、 [フォルダーの選択]ウィンドウを開いたアイテムの数だけ印刷ステートメントが表示されますが、それは私が望んでいるものではありません。

また、厄介なことに、[フォルダーの選択]ウィンドウでキャンセルを押すと、プログラムがホーム ディレクトリにダンプされます。

from PyQt4 import QtCore, QtGui
from os import getcwd

from sys import platform
from sys import argv
from lxml import etree as ET


class Anaylzer(QtGui.QMainWindow):
    try:
        tree = ET.parse(''.join([getcwd(),'/config.xml']))
        if 'win' in platform:
            save_path = tree.find('SAVE').find('win').text
        if 'linux' in platform:
            save_path = tree.find('SAVE').find('linux').text
        del tree
    except IOError:
        if 'win' in platform:
            save_path = "C:/"
        if 'linux' in platform:
            save_path = "/home"        

    def __init__(self, parent=None):
        super(Anaylzer, self).__init__(parent)

        self.setWindowTitle("Anaylzer")
        self.resize(700,300)
        self.statusBar()

        self.pushWidgets()

        self.displayTableItems()

    '''Create objects'''
    def createFilesTable(self):        
        self.filesTable = QtGui.QTableWidget(0, 2)
        self.filesTable.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)
        self.filesTable.setHorizontalHeaderLabels(("Folder", "Files"))
        self.filesTable.horizontalHeader().setResizeMode(0, QtGui.QHeaderView.Stretch)
        self.filesTable.verticalHeader().hide()
        self.filesTable.setShowGrid(False)
    def createButton(self, text, member):
        button = QtGui.QPushButton(text)
        button.clicked.connect(member)
        return button

    '''Actions'''    
    def open(self):        
        directory = QtGui.QFileDialog.getExistingDirectory(self, "Select Folder",
                Anaylzer.save_path)
        Anaylzer.save_path = ''.join([str(directory),"\\"]) 
        self.displayTableItems()

    def displayTableItems(self):
        from os import listdir     
        self.filesTable.setRowCount(0)
        folders = listdir(Anaylzer.save_path)
        if folders:
            for fl in folders:
                folder_name_item = QtGui.QTableWidgetItem(fl)
                folder_name_item.setFlags(QtCore.Qt.ItemIsUserCheckable | QtCore.Qt.ItemIsEnabled)
                folder_name_item.setCheckState(QtCore.Qt.Unchecked)
                try:
                    folder_files_names = listdir(''.join([Anaylzer.save_path,fl]))
                    folder_files_count = QtGui.QTableWidgetItem(str(len(folder_files_names)))
                    folder_files_count.setFlags(QtCore.Qt.ItemIsEnabled)
                    folder_files_count.setTextAlignment(QtCore.Qt.AlignCenter)

                    row = self.filesTable.rowCount()
                    self.filesTable.insertRow(row)
                    self.filesTable.setItem(row, 0, folder_name_item)
                    self.filesTable.setItem(row, 1, folder_files_count)
                except WindowsError: pass
            self.filesTable.itemClicked.connect(self.handleFolderChecked)

    def handleFolderChecked(self, folder_name_item):
        if folder_name_item.checkState() == QtCore.Qt.Checked:
            print '{s} Checked'.format(s="".join([Anaylzer.save_path,str(folder_name_item.text())]))

    def createActions(self):
        self.openAct = QtGui.QAction("&Open...", self, shortcut=QtGui.QKeySequence.Open,
                statusTip="Open folder", triggered=self.open)
        self.exitAct = QtGui.QAction("E&xit", self, shortcut="Ctrl+Q",
                statusTip="Exit the application", triggered=self.close)

    def createMenus(self):
        self.fileMenu = self.menuBar().addMenu("&File")
        self.fileMenu.addAction(self.openAct)
        self.fileMenu.addAction(self.exitAct)

    '''Push widgets'''
    def pushWidgets(self):
        '''create'''
        self.createActions()
        self.createMenus()
        self.createFilesTable()
        '''put on window'''
        widget = QtGui.QWidget()
        self.setCentralWidget(widget)
        vbox = QtGui.QVBoxLayout()
        vbox.addStretch(1)
        vbox.addWidget(self.filesTable)
        widget.setLayout(vbox)

if __name__ == '__main__':
    app = QtGui.QApplication(argv)
    window = Anaylzer()
    window.show()
    app.exec_()
4

1 に答える 1

1

どうやら、 QtGui.QTableWidgetItem調整を担当するメソッドには* .connect行を含めることはできませ。一度だけ呼び出されるメソッドに入れますが、テーブルが構築された後、def createFilesTable(self)の最後またはそのメソッドの外側のどこかのように、プログラムが実行されるだけの領域に入れます一度、上記のエラーなしで動作します。最終的なコードを投稿して、単純な行の移動で問題がどのように解決されるかを誰でも確認できるようにします。

from PyQt4 import QtCore, QtGui
from os import getcwd
from sys import platform
from sys import argv
from lxml import etree as ET


class Anaylzer(QtGui.QMainWindow):
    try:
        tree = ET.parse(''.join([getcwd(),'/config.xml']))
        if 'win' in platform:
            save_path = tree.find('SAVE').find('win').text
        if 'linux' in platform:
            save_path = tree.find('SAVE').find('linux').text
        del tree
    except IOError:
        if 'win' in platform:
            save_path = "C:/"
        if 'linux' in platform:
            save_path = "/home"        

    def __init__(self, parent=None):
        super(Anaylzer, self).__init__(parent)

        self.setWindowTitle("Anaylzer")
        self.resize(700,300)
        self.statusBar()

        self.pushWidgets()

        self.displayTableItems()

    '''Create objects'''
    def createFilesTable(self):        
        self.filesTable = QtGui.QTableWidget(0, 2)
        self.filesTable.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)
        self.filesTable.setHorizontalHeaderLabels(("Folder", "Files"))
        self.filesTable.horizontalHeader().setResizeMode(0, QtGui.QHeaderView.Stretch)
        self.filesTable.verticalHeader().hide()
        self.filesTable.setShowGrid(False)
        self.filesTable.itemClicked.connect(self.handleFolderChecked)
    def createButton(self, text, member):
        button = QtGui.QPushButton(text)
        button.clicked.connect(member)
        return button

    '''Actions'''    
    def open(self):        
        directory = QtGui.QFileDialog.getExistingDirectory(self, "Select Folder",
                Anaylzer.save_path)
        Anaylzer.save_path = ''.join([str(directory),"\\"])
        self.displayTableItems()

    def displayTableItems(self):
        from os import listdir     
        self.filesTable.setRowCount(0)
        folders = listdir(Anaylzer.save_path)
        if folders:
            for fl in folders:
                folder_name_item = QtGui.QTableWidgetItem(fl)
                folder_name_item.setFlags(QtCore.Qt.ItemIsUserCheckable | QtCore.Qt.ItemIsEnabled)
                folder_name_item.setCheckState(QtCore.Qt.Unchecked)
                try:
                    folder_files_names = listdir(''.join([Anaylzer.save_path,fl]))
                    folder_files_count = QtGui.QTableWidgetItem(str(len(folder_files_names)))
                    folder_files_count.setFlags(QtCore.Qt.ItemIsEnabled)
                    folder_files_count.setTextAlignment(QtCore.Qt.AlignCenter)

                    row = self.filesTable.rowCount()
                    self.filesTable.insertRow(row)
                    self.filesTable.setItem(row, 0, folder_name_item)
                    self.filesTable.setItem(row, 1, folder_files_count)
                except WindowsError: pass
            #self.filesTable.itemClicked.connect(self.handleFolderChecked)

    def handleFolderChecked(self, folder_name_item):
        if folder_name_item.checkState() == QtCore.Qt.Checked:
            print '{s} Checked'.format(s="".join([Anaylzer.save_path,str(folder_name_item.text())]))

    def createActions(self):
        self.openAct = QtGui.QAction("&Open...", self, shortcut=QtGui.QKeySequence.Open,
                statusTip="Open folder", triggered=self.open)
        self.exitAct = QtGui.QAction("E&xit", self, shortcut="Ctrl+Q",
                statusTip="Exit the application", triggered=self.close) 
    def createMenus(self):
        self.fileMenu = self.menuBar().addMenu("&File")
        self.fileMenu.addAction(self.openAct)
        self.fileMenu.addAction(self.exitAct)

    '''Push widgets'''
    def pushWidgets(self):
        '''create'''
        self.createActions()    
        self.createMenus()         
        self.createFilesTable()
        '''put on window'''
        widget = QtGui.QWidget()
        self.setCentralWidget(widget)
        vbox = QtGui.QVBoxLayout()
        vbox.addStretch(1)
        vbox.addWidget(self.filesTable)
        widget.setLayout(vbox)

if __name__ == '__main__':
    app = QtGui.QApplication(argv)
    window = Anaylzer()
    window.show()
    app.exec_()

*QtGui.QFileDialog.getExistingDirectory(self, "Select Folder", Anaylzer.save_path)* のキャンセル ボタンがルート ディレクトリに戻る理由はまだわかりません。

于 2012-11-19T11:10:28.307 に答える