示例#1
0
    def test_enableToolBar(self, qtbot):
        widget = DataTableWidget()
        qtbot.addWidget(widget)
        widget.show()

        assert widget.view().model() is None

        buttons = widget.findChildren(QtGui.QToolButton)

        exclude_button = None
        for btn in buttons:
            if btn.isEnabled:
                qtbot.mouseClick(btn, QtCore.Qt.LeftButton)
                exclude_button = btn
                assert btn.isChecked()
                break

        for button in buttons:
            assert button.isEnabled()

        qtbot.mouseClick(btn, QtCore.Qt.LeftButton)

        for button in buttons:
            if button == exclude_button:
                continue
            assert not button.isEnabled()
            assert not button.isChecked()
示例#2
0
    def test_removeColumns(self, qtbot, dataModel2):
        widget = DataTableWidget()
        qtbot.addWidget(widget)
        widget.show()

        widget.setViewModel(dataModel2)

        df = dataModel2.dataFrame().copy()

        buttons = widget.findChildren(QtGui.QToolButton)
        for btn in buttons:
            if btn.isEnabled:
                qtbot.mouseClick(btn, QtCore.Qt.LeftButton)
                break

        for btn in buttons:
            if btn.objectName() == 'removecolumnbutton':
                qtbot.mouseClick(btn, QtCore.Qt.LeftButton)
                dlg = widget.findChildren(QtGui.QDialog)[-1]

                listview = dlg.findChildren(QtGui.QListView)[-1]

                listview.selectAll()

                dlg_buttons = dlg.findChildren(QtGui.QPushButton)

                for b in dlg_buttons:
                    if b.text() == 'OK':
                        qtbot.mouseClick(b, QtCore.Qt.LeftButton)
                        break

        assert widget.view().model().columnCount() == 0
示例#3
0
    def test_click_each_button(self, qtbot, dataModel):
        widget = DataTableWidget()
        qtbot.addWidget(widget)
        widget.show()

        widget.setViewModel(dataModel)

        buttons = widget.findChildren(QtGui.QToolButton)
        for btn in buttons:
            if btn.isEnabled:
                qtbot.mouseClick(btn, QtCore.Qt.LeftButton)
                break

        for btn in buttons:
            if btn.objectName() == 'editbutton':
                continue

            if btn.objectName() in ['addcolumnbutton', 'removecolumnbutton']:
                qtbot.mouseClick(btn, QtCore.Qt.LeftButton)
                dlg = widget.findChildren(QtGui.QDialog)[-1]

                dlg_buttons = dlg.findChildren(QtGui.QPushButton)

                for b in dlg_buttons:
                    if b.text() == 'Cancel':
                        qtbot.mouseClick(b, QtCore.Qt.LeftButton)
                        break
            else:
                qtbot.mouseClick(btn, QtCore.Qt.LeftButton)
示例#4
0
class ResultWindow(QWidget):
    def __init__(self):
        super(self.__class__, self).__init__()
        self.setup_ui()

    def setup_ui(self):
        self.setWindowTitle("查詢結果")
        self.setFont(PyQt5.QtGui.QFont("Times New Roman", 11))

        self.buttonCopy = QPushButton("複製查詢結果 (Ctrl+C)")
        self.buttonCopy.clicked.connect(self.copy)
        self.labelInfo = QLabel("")
        self.shortcut = QShortcut(PyQt5.QtGui.QKeySequence("Ctrl+C"), self)
        self.shortcut.activated.connect(self.copy)

        self.formLayout = QFormLayout()
        self.formLayout.addRow(self.buttonCopy, self.labelInfo)

        self.widget = DataTableWidget()
        self.widget.setButtonsVisible(False)
        self.widget.setMinimumSize(600, 600)

        self.vbox = QVBoxLayout()
        self.vbox.addLayout(self.formLayout)
        self.vbox.addWidget(self.widget)
        self.setLayout(self.vbox)

    def update(self, data):
        self.df = data
        self.labelInfo.setText("")
        self.model = DataFrameModel()

        self.widget.resize(self.widget.sizeHint())
        self.widget.show()
        self.widget.setViewModel(self.model)
        self.model.setDataFrame(data)

    def copy(self):
        count = 0
        indexes = self.widget.tableView.selectionModel().selectedRows()
        if len(indexes) > 0:
            rows = [index.row() for index in indexes]
            count = len(indexes)
        else:
            rows = [i for i in range(self.widget.tableView.model().rowCount())]
            count = self.widget.tableView.model().rowCount()
        s = ''
        for i in rows:
            r = self.df.iloc[[i]]
            for v in r.values[0].astype(str):
                s += (v + '\t')
            s = s[:-1] + '\n'
        pyperclip.copy(s[:-1])
        self.labelInfo.setText(str(count) + " 筆資料已複製至剪貼簿")
示例#5
0
    def test_addColumn(self, qtbot, dataModel):
        widget = DataTableWidget()
        qtbot.addWidget(widget)
        widget.show()

        widget.setViewModel(dataModel)

        buttons = widget.findChildren(QtGui.QToolButton)
        for btn in buttons:
            if btn.isEnabled:
                qtbot.mouseClick(btn, QtCore.Qt.LeftButton)
                break

        columns = []
        addButton = None
        for btn in buttons:
            if btn.objectName == 'addcolumnbutton':
                addbutton = btn
                qtbot.mouseClick(btn, QtCore.Qt.LeftButton)
                dlg = widget.findChildren(QtGui.QDialog)[-1]
                dlg_buttons = dlg.findChildren(QtGui.QPushButton)
                comboBox = dlg.findChildren(QtGui.QComboBox)[-1]

                for i in range(comboBox.count()):
                    columns.append(comboBox.itemText(i))

                for b in dlg_buttons:
                    if b.text() == 'Cancel':
                        qtbot.mouseClick(b, QtCore.Qt.LeftButton)
                        break
                break

        columnCountBeforeInsert = widget.view().model().columnCount()
        for index, column in enumerate(columns):
            qtbot.mouseClick(addbutton, QtCore.Qt.LeftButton)
            dlg = widget.findChildren(QtGui.QDialog)[-1]

            textedits = dlg.findChildren(QtGui.QLineEdit)
            qtbot.keyClicks(textedits[0], column)

            comboBox = dlg.findChildren(QtGui.QComboBox)[-1]
            comboBox.setCurrentIndex(index)

            dlg_buttons = dlg.findChildren(QtGui.QPushButton)

            for b in dlg_buttons:
                if b.text() == 'OK':
                    qtbot.mouseClick(b, QtCore.Qt.LeftButton)
                    break

            assert widget.view().model().columnCount(
            ) == columnCountBeforeInsert + 1 + index
示例#6
0
    def test_init(self, qtbot):
        widget = DataTableWidget()
        qtbot.addWidget(widget)
        widget.show()

        assert widget.view().model() is None

        buttons = widget.findChildren(QtGui.QToolButton)

        enabled_counter = 0
        for btn in buttons:
            assert not btn.isChecked()
            if btn.isEnabled():
                enabled_counter += 1

        assert enabled_counter == 1
示例#7
0
    def test_setModel(self, qtbot, dataModel):
        widget = DataTableWidget()
        qtbot.addWidget(widget)
        widget.show()

        widget.setViewModel(dataModel)

        assert widget.view().model() is not None
        assert widget.view().model() == dataModel

        buttons = widget.findChildren(QtGui.QToolButton)
        for btn in buttons:
            if btn.isEnabled:
                qtbot.mouseClick(btn, QtCore.Qt.LeftButton)
                assert widget.view().model().editable

                qtbot.mouseClick(btn, QtCore.Qt.LeftButton)
                assert not widget.view().model().editable

                break
示例#8
0
# Use QtGui from the compat module to take care if correct sip version, etc.
from qtpandas.compat import QtGui
from qtpandas.models.DataFrameModel import DataFrameModel
from qtpandas.views.DataTableView import DataTableWidget
# from qtpandas.views._ui import icons_rc

sys.excepthook = excepthook  # 設定PyQt的異常鉤子,基本上在本例沒什麼作用

# 建立一個空的模型,該模型用來儲存與處理資料
model = DataFrameModel()

# 建立一個應用程式顯示表格
app = QtGui.QApplication([])
widget = DataTableWidget()  # 建立一個空的表格,用來呈現資料
widget.resize(500, 300)  # 調整Widget的大小
widget.show()
# 讓表格繫結模型,也就是呈現模型的內容
widget.setViewModel(model)

# 建立測試資料
data = {
    'A': [10, 11, 12],
    'B': [20, 21, 22],
    'C': ['Peter Pan', 'Cpt. Hook', 'Tinkerbell']
}
df = pandas.DataFrame(data)

# 下面兩列用來測試委託是否成立
df['A'] = df['A'].astype(numpy.int8)  # A欄資料格式變成整數
df['B'] = df['B'].astype(numpy.float16)  # B欄資料格式變成浮點數
class Main:
    def __init__(self):
        """ 初始化主界面 """
        self.ui = loadUi("UI/main.ui")
        self.ui.setWindowTitle("聚类系统")
        self.DataHelper = None
        self.ui.btn_choose_data.clicked.connect(self.choose_path)
        self.ui.btn_set_parameter.clicked.connect(self.set_parameter)

        self.ui.btn_spin.addItems(
            ["KMeans", "GMM", "DBSCAN", "OPTICS","BIRCH", "MeanShift", "CLIQUE"])
        self.ui.btn_run.clicked.connect(self.run)
        self.cluster = ClusterHelper()
        self.ui.btn_show_image.clicked.connect(self.show_image)

    def show_image(self):
        """ 展示聚类结果 """
        try:
            self.cluster.imshow()
        except:
            QMessageBox.about(self.ui, "展示失败", "请先训练你的聚类器")

    def choose_path(self):
        """ 选择数据集 """
        file_name = QtWidgets.QFileDialog.getOpenFileName(
            self.ui, "请选择你要打开数据的名字", "./data/", "Csv files(*.csv)")
        file_name = file_name[0]
        self.DataHelper = DataHelper(file_name)

        name = file_name.split("/")[-1]
        self.ui.ldata_name.setText(name)
        self.show_information()
        self.show_data()

    def show_information(self):
        """ 显示数据集的基本信息 """
        self.ui.ldata_shape.setText(str(self.DataHelper.shape))
        self.ui.ldata_class.setText(str(self.DataHelper.class_))

    def set_parameter(self):
        """ 设置分类器 """
        currentText = self.ui.btn_spin.currentText()
        self.newWindow = SecondWindow(algorithm=currentText)
        self.newWindow.btn_yes.clicked.connect(self.get_parameter)
        self.newWindow.show()

    def get_parameter(self):
        """ 获得参数信息 """
        self.newWindow.window_exit()

        self.ui.tmessage_show.setText(self.newWindow.message)
        currentText = self.ui.btn_spin.currentText()
        param_dict = [eval(line.split(":")[1])
                      for line in self.newWindow.message.split("\n")[1:-1]]
        self.cluster.set_Cluster(currentText, param_dict)

    def show_data(self):
        """
        展示读取进来的数据
        """
        self.widget = DataTableWidget(self.ui)
        model = DataFrameModel()
        model.setDataFrame(self.DataHelper.data)
        self.widget.setViewModel(model)
        self.widget.move(30, 200)
        self.widget.resize(350, 350)
        self.widget.show()

    def run(self):
        """ 运行聚类算法 """
        if(self.DataHelper == None):
            QMessageBox.about(self.ui, "运行失败", "请选择你的数据集")
        elif(self.cluster.cluster == None):
            QMessageBox.about(self.ui, "运行失败", "请初始化你的聚类器")
        else:
            self.cluster.fit(self.DataHelper.data)
            score = self.cluster.get_score()
            text = ""
            for item in score.items():
                text += item[0] + str(item[1]) + "\n"
            self.ui.t_ans.setText(text)
示例#10
0
# Use QtGui from the compat module to take care if correct sip version, etc.
from qtpandas.compat import QtGui
from qtpandas.models.DataFrameModel import DataFrameModel
from qtpandas.views.DataTableView import DataTableWidget
# from qtpandas.views._ui import icons_rc

sys.excepthook = excepthook # 设置PyQt的异常钩子,在本例中基本没什么用

# 创建一个空的模型,该模型用于存储与处理数据
model = DataFrameModel()

# 创建一个应用用于显示表格
app = QtGui.QApplication([])
widget = DataTableWidget() # 创建一个空的表格,主要用来呈现数据
widget.resize(500, 300) # 调整Widget的大小
widget.show()
# 让表格绑定模型,也就是让表格呈现模型的内容
widget.setViewModel(model)

# 创建测试数据
data = {
    'A': [10, 11, 12],
    'B': [20, 21, 22],
    'C': ['Peter Pan', 'Cpt. Hook', 'Tinkerbell']
}
df = pandas.DataFrame(data)

# 下面两列用来测试委托是否成立
df['A'] = df['A'].astype(numpy.int8) # A列数据格式变成整型
df['B'] = df['B'].astype(numpy.float16) # B列数据格式变成浮点型