2

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_())
TylerH
  • 20,799
  • 66
  • 75
  • 101
  • Please post the main.ui so we can run this (looks like only minor edits requried to make it independent of mysql). – Oliver Oct 15 '16 at 00:34
  • Will add the main.ui but the point is How to iterate the button? When I click, new case should come cause i want to display only one row out of complete csv rows and on click it should change to next row :P – Pradyumna Cheerala Oct 15 '16 at 09:17
  • @Schollii main.ui added and ... it is not primary to make independent of mysql ... it is to iterate it to display single column in table widget and on click load only one row into same row place :P – Pradyumna Cheerala Oct 15 '16 at 13:14
  • I realize that is not the point of your question but I to run it I need the ui file I'll handle the rest – Oliver Oct 15 '16 at 14:21
  • This code is not an MCVE. Which button is it, surely not the submit button? Remove code to create an MCVE, and add code for your button and the handler where you try to achieve your goal. Then update your post, maybe you will get an answer. – Oliver Oct 16 '16 at 00:18

1 Answers1

0

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
ekhumoro
  • 115,249
  • 20
  • 229
  • 336