迭代 QPushButton

Iterate QPushButton

我正在使用 PyQt4。我有一个 QPushButton,现在我想迭代它。单击按钮时,它应该将数据从 csv 文件加载到 QTableWidget 中。但我只想一次显示一个案例。

例如 csv 有 1000 行,不包括 headers。现在它应该将 header 分配给 header 中的 table 小部件。并仅在其下方显示一行。所以点击时,它应该在同一行中显示下一行信息。我在下面发布代码,语法略有不同。我显示了 header 的 db 语法,我也想排除它。

我添加了 .ui 文件。你可以直接保存为 .ui:

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>remarks</class>
 <widget class="QMainWindow" name="remarks">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>1073</width>
    <height>862</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <widget class="QComboBox" name="compcb">
    <property name="geometry">
     <rect>
      <x>60</x>
      <y>360</y>
      <width>131</width>
      <height>27</height>
     </rect>
    </property>
   </widget>
   <widget class="QComboBox" name="loccb">
    <property name="geometry">
     <rect>
      <x>60</x>
      <y>410</y>
      <width>131</width>
      <height>27</height>
     </rect>
    </property>
   </widget>
   <widget class="QComboBox" name="rescb">
    <property name="geometry">
     <rect>
      <x>60</x>
      <y>460</y>
      <width>131</width>
      <height>27</height>
     </rect>
    </property>
   </widget>
   <widget class="QLineEdit" name="lat">
    <property name="geometry">
     <rect>
      <x>60</x>
      <y>540</y>
      <width>113</width>
      <height>27</height>
     </rect>
    </property>
   </widget>
   <widget class="QLineEdit" name="lon">
    <property name="geometry">
     <rect>
      <x>60</x>
      <y>590</y>
      <width>113</width>
      <height>27</height>
     </rect>
    </property>
   </widget>
   <widget class="QLineEdit" name="landmark">
    <property name="geometry">
     <rect>
      <x>330</x>
      <y>360</y>
      <width>113</width>
      <height>27</height>
     </rect>
    </property>
   </widget>
   <widget class="QPlainTextEdit" name="sugges">
    <property name="geometry">
     <rect>
      <x>330</x>
      <y>410</y>
      <width>121</width>
      <height>78</height>
     </rect>
    </property>
   </widget>
   <widget class="QPlainTextEdit" name="plainTextEdit_2">
    <property name="geometry">
     <rect>
      <x>330</x>
      <y>510</y>
      <width>121</width>
      <height>78</height>
     </rect>
    </property>
   </widget>
   <widget class="QTableWidget" name="tableWidget">
    <property name="geometry">
     <rect>
      <x>20</x>
      <y>10</y>
      <width>991</width>
      <height>311</height>
     </rect>
    </property>
   </widget>
   <widget class="QPushButton" name="submit">
    <property name="geometry">
     <rect>
      <x>350</x>
      <y>670</y>
      <width>99</width>
      <height>41</height>
     </rect>
    </property>
    <property name="font">
     <font>
      <pointsize>12</pointsize>
      <weight>50</weight>
      <bold>false</bold>
     </font>
    </property>
    <property name="text">
     <string>Submit</string>
    </property>
   </widget>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>1073</width>
     <height>25</height>
    </rect>
   </property>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources/>
 <connections/>
</ui>
from PyQt4 import QtCore, QtGui, uic
from PyQt4.QtCore import QString

from PyQt4.QtGui import * 
from PyQt4.QtCore import *

import MySQLdb
import os
import time
import sys
import csv 

### Loading .UI file ###
rts_class = uic.loadUiType("main.ui")[0]

class Mainwindow(QtGui.QMainWindow, rts_class):
    def __init__(self, parent=None):
        QtGui.QMainWindow.__init__(self, parent)
        self.setupUi(self)

        #self.review.clicked.connect(self, review_application)
        self.submit.clicked.connect(self.submit_application)
        #self.quit.clicked.connect(self, quit_application

        self.load_db()
        self.checkbox()

    def load_db(self):
        self.dadis.setRowCount(1)
        self.dadis.setColumnCount(headlen)
        self.dadis.setHorizontalHeaderLabels(QString('%s' % ', '.join(map(str, mainheader))).split(","))

        if os.path.isfile("RTS.csv") is True:
            with open('RTS.csv', 'r') as fo:
                reader = csv.reader(fo, delimiter = ',')
                ncol = len(next(reader))
                data = list(reader)
                row_count = len(data)

                print row_count
                main =  data[0]

                print main

                for var in range(0, ncol):                                                  
                    self.dadis.setItem(0, var, QTableWidgetItem(main[var]))

                fo.close()

    def checkbox(self):
        self.compcb.addItem(" ")
        self.compcb.addItem("Complete")
        self.compcb.addItem("InComplete")

        self.loccb.addItem(" ")
        self.loccb.addItem("Locatable")
        self.loccb.addItem("UnLocatable")

        self.rescb.addItem(" ")
        self.rescb.addItem("House")
        self.rescb.addItem("Street")
        self.rescb.addItem("Colony")
        self.rescb.addItem("Society")            

    def submit_application(self):
        compout = self.compcb.currentText()
        locout = self.loccb.currentText()
        resout = self.rescb.currentText()
        lattxt = self.lat.text()
        lontxt = self.lon.text()
        landtxt = self.landmark.text()
        suggestxt = self.sugges.toPlainText()
        remarkstxt = self.remarks.toPlainText()

        print compout
        print locout
        print resout
        print lattxt
        print lontxt
        print landtxt
        print suggestxt
        print remarkstxt

        if os.path.isfile("rts_output.csv") is False:

            with open('rts_output.csv', 'a') as fp:
                b = csv.writer(fp, delimiter = ',')
                header = [["COMPLETENESS", "LOCATABLE", "RESOLUTION", "GEO_LAT", "GEO_LON", "LANDMARK", "SUGGESTION", "REMARKS"]]
                b.writerows(header)

        if os.path.isfile("rts_output.csv") is True:

            with open('rts_output.csv', 'a') as fp:
                a = csv.writer(fp, delimiter = ',' )
                data = [[compout, locout, resout, lattxt, lontxt, landtxt, suggestxt, remarkstxt]]
                a.writerows(data)   

        if os.path.isfile("RTS.csv") is True:

            with open('RTS.csv', 'r') as fo:
                reader = csv.reader(fo, delimiter = ',')
                ncol = len(next(reader))
                data = list(reader)
                row_count = len(data)

                x = data[0][0]
                print x

                i = int(x)+1
                print i

                if i <= row_count:

                    main =  data[i-1]

                    print main

                #for var in range(0, ncol):                                                  
                    #self.dadis.setItem(0, var, QTableWidgetItem(main[var]))

            fo.close()


if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    myMain = Mainwindow()
    myMain.show()
    sys.exit(app.exec_())

主要问题是,无论何时单击按钮,迭代器都会被设置为 0 或 1,无论它被分配什么。因此,在 class 之外分配变量并将其调用到 class 以维护循环结构。

class staticVariable:
    static_count_clicked = 1

class Mainwindow(QtGui.QMainWindow, rts_class):
    def __init__(self, parent=None, *args, **kwargs):
        QtGui.QMainWindow.__init__(self, parent)
        self.setupUi(self)

        self.submit.clicked.connect(self.submit_application)

    def submit_application(self, count_clicked):

        staticVariable.static_count_clicked += 1
        print staticVariable.static_count_clicked