迭代 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
我正在使用 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