2016-10-14 6 views
2

Ich verwende PyQt4. Ich habe einen QPushButton und jetzt möchte ich es wiederholen. Ein Klick auf die Schaltfläche sollte Daten aus der CSV-Datei in QTableWidget laden. Aber ich möchte nur jeweils einen Fall anzeigen.Iterate QPushButton

Zum Beispiel hat csv 1000 Zeilen ohne Header. Jetzt sollte Kopfzeile dem Tabellen-Widget aus dem Header zugewiesen werden. und nur eine Zeile darunter anzeigen. Beim Klicken sollte die nächste Zeileninformation in derselben Zeile angezeigt werden. Ich poste den Code unten mit wenig unterschiedlicher Syntax. Ich habe die Syntax von db für den Header angezeigt, den ich auch ausschließen möchte.

Ich habe .ui-Datei hinzugefügt. Sie können es direkt als .ui sparen:

<?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

Bitte posten Sie die main.ui, so dass wir dies ausführen können (sieht aus wie nur kleinere Änderungen erforderlich, um es unabhängig von MySQL zu machen). – Schollii

+0

Wird die main.ui hinzufügen, aber der Punkt ist Wie man die Schaltfläche iteriert? Wenn ich klicke, sollte ein neuer Fall kommen, weil ich nur eine Zeile aus kompletten CSV-Zeilen anzeigen möchte und beim Klicken auf nächste Zeile wechseln soll: P –

+0

@Schollii main.ui hinzugefügt und ... es ist nicht primär, um unabhängig zu machen von mysql ... es ist es zu iterieren, um einzelne Spalte in Tabelle Widget anzuzeigen und beim Klicken laden nur eine Zeile in die gleiche Zeile Ort: P –

Antwort

0

Das Hauptproblem war, wann immer auf die Schaltfläche geklickt wurde, wird der Iterator auf 0 oder 1 gesetzt zu werden, was immer es zugewiesen wurde. Ordnen Sie die Variable also außerhalb der Klasse zu und rufen Sie sie in der Klasse auf, um die Schleifenstruktur zu pflegen.

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