特定の場所にデフォルトで設定され、そのフォルダー内のすべてのフォルダーとそれらのフォルダー内のファイル数を表形式で表示するこのアプリケーションを構築しています。構成ファイルがないという事実にもかかわらず、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_()