Search code examples
pythoncsvpyqtpyqt4qpushbutton

Iterate QPushButton


I am using PyQt4. I have a QPushButton and now I want to Iterate it. On button click, it should load data from csv file into QTableWidget. But I want only one case to display at a time.

For example csv has 1000 rows excluding headers. Now it should assign header to table widget from header. and display only one row below it. So on click, it should display next row information in same row. I am posting code below with little different syntax. I displayed syntax of db for header which i also want to exclude it.

I added .ui file. you can save it directly as .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_())

Solution

  • The main problem was, when ever the button was clicked, the iterator is getting set to 0 or 1 what ever it was assigned. So, assign the variable outside of the class and call it into the class to maintain the loop structure.

    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