Populating a table in PyQt with file attributes

喜你入骨 提交于 2019-12-23 04:47:38

问题


I'm trying to populate a QTableWidget with the attributes of a file opened elsewhere in the script. I've successfully set the file attributes read in from the file using the following code:

class FileHeader(object):

fileheader_fields=(
    "filetype","fileversion","numframes",
    "framerate","resolution","numbeams",
    "samplerate","samplesperchannel","receivergain",
    "windowstart","winlengthsindex","reverse",
    "serialnumber","date","idstring","ID1","ID2",
    "ID3","ID4","framestart","frameend","timelapse",
    "recordInterval","radioseconds","frameinterval","userassigned")

fileheader_formats=(
    'S3','B','i4','i4','i4','i4','f','i4','i4','i4',
    'i4','i4','i4','S32','S256','i4','i4','i4','i4',
    'i4','i4','i4','i4','i4','i4','S136')

IMAGE_HEADER_BYTES = 256
IMAGES_DATA_BYTES = 49152

def __init__(self,filename=''):
    self.filename = filename

    if filename:
        self.setFile(filename)
    else:
        # initialize our attributes to None
        for field in self.fileheader_fields:
            setattr(self,field,None) 
    def setFile(self, f):
    self.infile=open(f, 'rb')
    dtype=dict(names=self.fileheader_fields, formats=self.fileheader_formats)
    self.fileheader=np.fromfile(self.infile, dtype=dtype, count=1)
    self.fileheader_length=self.infile.tell()

    for field in self.fileheader_fields:
        setattr(self,field,self.fileheader[field])        

I've used this code to populate the table but I keep getting a "FileHeader has no attribute fileheader" error.

from fileheader import FileHeader, Frame
from echogram import QEchogram
from PyQt4.QtGui import *
from PyQt4.QtCore import *
import os, sys


class MainWindow(QWidget):

    def __init__(self, parent=None):
        self.fileheader_fields=FileHeader.fileheader_fields
        self.fileheader_values=FileHeader.fileheader[field]
        self.fileheader={field: "value of" + field
                         for field in self.fileheader_fields}
        super(MainWindow, self).__init__(parent)
        self.fileheader_table=QTableWidget()
        layout=QVBoxLayout()
        layout.addWidget(self.fileheader_table)
        self.setLayout(layout)
        self.populate

    def populate(self):
        self.fileheader_table.setRowCount(len(self.fileheader_fields))
        self.fileheader_table.sestColumnCount(2)
        self.fileheader_table.setHorizontalHeaderLabels(['name','value'])
        for i,field in enumerate(self.fileheader_fields):
            name=QTableWidgetItem(field)
            value=QTableWidgetItem(self.fileheader[field])
            self.fileheader_table.setItem(i,0,name)
            self.fileheader_table.setItem(i,1,value)

    if __name__=="__main__":
        app=QApplication(sys.argv)
        filename=str(QFileDialog.getOpenFileName(None,"open  file","C:/vprice/DIDSON/DIDSON  Data","*.ddf"))
        wnd=MainWindow()
        wnd.resize(640,480)
        wnd.show()
        #echoGram=QEchogram()
        #echoGram.initFromFile(filename)
        #fileName="test.png"
        #echoGram.processEchogram()
        #dataH=echoGram.data
        #print "Horizontal data", dataH

Bear with me-- I just started with all of the Python stuff about a month ago...


回答1:


See populate method. Also there is some examples in documentation

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
from PyQt4 import QtCore, QtGui


class MainWindow(QtGui.QWidget):

    def __init__(self, parent=None):

        self.fileheader_fields=(
            "filetype","fileversion","numframes",
            "framerate","resolution","numbeams",
            "samplerate","samplesperchannel","receivergain",
            "windowstart","winlengthsindex","reverse",
            "serialnumber","date","idstring","ID1","ID2",
            "ID3","ID4","framestart","frameend","timelapse",
            "recordInterval","radioseconds","frameinterval","userassigned"
        )
        # just for test
        self.fileheader = {field: 'value of ' + field 
                           for field in self.fileheader_fields}
        super(MainWindow, self).__init__(parent)
        self.table_widget = QtGui.QTableWidget()
        layout = QtGui.QVBoxLayout()
        layout.addWidget(self.table_widget)
        self.setLayout(layout)
        self.populate()

    def populate(self):
        self.table_widget.setRowCount(len(self.fileheader_fields))
        self.table_widget.setColumnCount(2)
        self.table_widget.setHorizontalHeaderLabels(['name', 'value'])
        for i, field in enumerate(self.fileheader_fields):
            name = QtGui.QTableWidgetItem(field)
            value = QtGui.QTableWidgetItem(self.fileheader[field])
            self.table_widget.setItem(i, 0, name)
            self.table_widget.setItem(i, 1, value)


if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    wnd = MainWindow()
    wnd.resize(640, 480)
    wnd.show()
    sys.exit(app.exec_())

UPD

Code for your concrete case:

from fileheader import FileHeader, Frame
from echogram import QEchogram
from PyQt4.QtGui import *
from PyQt4.QtCore import *
import os, sys


class MainWindow(QWidget):

    def __init__(self, filename, parent=None):
        super(MainWindow, self).__init__(parent)
        # here we are loading file
        # now self.fileheader contains attributes
        self.fileheader = FileHeader(filename)
        self.fileheader_table = QTableWidget()
        layout = QVBoxLayout()
        layout.addWidget(self.fileheader_table)
        self.setLayout(layout)
        self.populate()

    def populate(self):
        self.fileheader_table.setRowCount(len(self.fileheader.fileheader_fields))
        self.fileheader_table.sestColumnCount(2)
        self.fileheader_table.setHorizontalHeaderLabels(['name','value'])
        for i,field in enumerate(self.fileheader.fileheader_fields):
            name=QTableWidgetItem(field)
            value=QTableWidgetItem(getattr(self.fileheader, field))
            self.fileheader_table.setItem(i,0,name)
            self.fileheader_table.setItem(i,1,value)

    if __name__=="__main__":
        app=QApplication(sys.argv)
        filename=str(QFileDialog.getOpenFileName(None,"open  file","C:/vprice/DIDSON/DIDSON  Data","*.ddf"))
        wnd=MainWindow(filename)
        wnd.resize(640,480)
        wnd.show()
        #echoGram=QEchogram()
        #echoGram.initFromFile(filename)
        #fileName="test.png"
        #echoGram.processEchogram()
        #dataH=echoGram.data
        #print "Horizontal data", dataH



回答2:


ok u have to add a QTableWidget to your custom QtGui.QMainWindow i would create i whith 0 line and the right amount of collumn,like this:

self.tableArea=QtGui.QTableWidget(0,self.fileheader_length,self)
self.setHorizontalHeaderLabels(['nameOne','nameTwo'])#will name your top header

self.verticalHeader().setVisible(False)#will hide your left header if you don't need them

and add your line one by one self.tableArea.insertRow(row)#it will add a line at the row position

after that u have to create a QTableWidgetItem for each cell

 itemTo=QtGui.QTableWidgetItem('text')#replace text by your value

and place your item in the cell you want

 self.tableArea.setItem(row, column, itemTo)


来源:https://stackoverflow.com/questions/11457839/populating-a-table-in-pyqt-with-file-attributes

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!