Pradyumna Cheerala Pradyumna Cheerala - 1 month ago 17
Python Question

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

Answer

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