Checkbox 在tableview中单击复选框时,PYQT4重复输出

Checkbox 在tableview中单击复选框时,PYQT4重复输出,checkbox,pyqt4,tableview,Checkbox,Pyqt4,Tableview,我正在构建这个应用程序,它默认为一个特定的位置,在这个位置上,它将以表格形式查看该文件夹中的所有文件夹以及这些文件夹中的文件数。尽管您没有配置文件,但它应该只打开您的C或主目录。我的想法是,我会在那些我想与之交互的文件夹中打上一个复选标记。我基本上有一个打印语句在handleFolderChecked中,让我知道我选择了正确的项目,并且它工作正常 当我从菜单栏打开File->open,然后点击弹出窗口上的Select Folder(选择文件夹)按钮时会出现问题,无论选择与否,我的表视图中都会出现

我正在构建这个应用程序,它默认为一个特定的位置,在这个位置上,它将以表格形式查看该文件夹中的所有文件夹以及这些文件夹中的文件数。尽管您没有配置文件,但它应该只打开您的C或主目录。我的想法是,我会在那些我想与之交互的文件夹中打上一个复选标记。我基本上有一个打印语句在handleFolderChecked中,让我知道我选择了正确的项目,并且它工作正常

当我从菜单栏打开File->open,然后点击弹出窗口上的Select Folder(选择文件夹)按钮时会出现问题,无论选择与否,我的表视图中都会出现一个新的显示,如果我在任何项目中单击复选标记,打印语句将显示我在“选择文件夹”窗口中打开的项目数,而这不是我想要的

还有一件很麻烦的事,当我在“选择文件夹”窗口中点击“取消”时,程序将转储到主目录中,有人知道我如何使它保留在它所在的目录中吗

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_()

好的,我发现了,显然负责调整QtGui.QTableWidgetItem的方法中也不能有*.connect行,只需将self.filesTable.itemClicked.connect(self.handleFolderChecked)从def displayTableItems(self)中移出,并将其放入一个只能调用一次的方法中,但是在表被构造之后,比如在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,“选择文件夹”)中的取消按钮,
Anaylzer.save_path)*将我转储回根目录,哦,好吧。

好吧,我想出来了,显然,负责调整QtGui.QTableWidgetItem的方法中也不能有*.connect行,只需将self.filesTable.itemClicked.connect(self.handleFolderChecked)移出def displayTableItems(self)然后将其放入一个只调用一次的方法中,但在构造表之后,比如在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,“选择文件夹”)中的取消按钮, Anaylzer.save_path)*将我转储回根目录