Skip to content

Instantly share code, notes, and snippets.

@ChristophHaag
Last active August 29, 2015 14:22
Show Gist options
  • Save ChristophHaag/4874a2983bd0d5b0b427 to your computer and use it in GitHub Desktop.
Save ChristophHaag/4874a2983bd0d5b0b427 to your computer and use it in GitHub Desktop.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
from PyQt4 import QtGui
import json
class Table(QtGui.QGridLayout):
def __init__(self):
super(QtGui.QGridLayout, self).__init__()
self.addWidget(QtGui.QLineEdit(), 0, 0)
self.addWidget(QtGui.QLineEdit(), 0, 1)
self.addWidget(QtGui.QLineEdit(), 1, 0)
self.addWidget(self.createspinbox(), 1, 1)
#self.setColumnMinimumWidth(0, self.itemAtPosition(1,1).sizeHint().width()) #TODO
self.setHorizontalSpacing(15)
def coldatarange(self):
return range(1, self.columnCount())
def rowdatarange(self):
return range(1, self.rowCount())
def createspinbox(self, value=0):
sb = QtGui.QDoubleSpinBox()
sb.setValue(value)
sb.setMaximum(100000000)
sb.setMinimum(-100000000)
return sb
def addrow(self):
rows = self.rowCount()
self.addWidget(QtGui.QLineEdit(), rows, 0)
for i in self.coldatarange():
self.addWidget(self.createspinbox(), rows, i)
def addcolumn(self):
cols = self.columnCount()
self.addWidget(QtGui.QLineEdit(), 0, cols)
for i in self.rowdatarange():
self.addWidget(self.createspinbox(), i, cols)
def getSaveData(self):
d = {}
headings = []
colheadings = []
data = []
for i in self.coldatarange():
widget = self.itemAtPosition(0,i)
headings.append(widget.widget().text())
for i in self.rowdatarange():
widget = self.itemAtPosition(i,0)
colheadings.append(widget.widget().text())
for i in self.rowdatarange():
for j in self.coldatarange():
item = self.itemAtPosition(i,j)
cell = {
"data": item.widget().value(),
"row": i,
"col": j
}
data.append(cell)
d["headings"] = headings
d["colheadings"] = colheadings
d["data"] = data
d["desc"] = self.itemAtPosition(0,0).widget().text()
return d
def clearlayout(self):
for i in reversed(range(self.count())):
self.itemAt(i).widget().setParent(None)
def loaddata(self, d):
self.clearlayout()
self.addWidget(QtGui.QLineEdit(d["desc"]), 0, 0)
for index, item in enumerate(d["headings"]):
self.addWidget(QtGui.QLineEdit(item), 0, index + 1)
for index, item in enumerate(d["colheadings"]):
self.addWidget(QtGui.QLineEdit(item), index + 1, 0)
for item in d["data"]:
self.addWidget(self.createspinbox(item["data"]), item["row"], item["col"])
class MainWindow(QtGui.QWidget):
def __init__(self):
super(MainWindow, self).__init__()
self.table = Table()
mainlayout = QtGui.QVBoxLayout(self)
mainlayout.addLayout(self.createbuttons())
mainlayout.addLayout(self.table)
if len(sys.argv) == 2:
self.load(sys.argv[1])
self.show()
def save(self):
filename = QtGui.QFileDialog.getSaveFileName(w, 'Save File', '', 'Counter (*.counter)')
if not filename: return
d = self.table.getSaveData()
#print("Save", d)
with open(filename, 'w') as f:
json.dump(d, f)
def load(self, filename = None):
if not filename:
filename = QtGui.QFileDialog.getOpenFileName(w, 'Open file', '', 'Counter (*.counter)')
if not filename: return
with open(filename, 'r') as f:
d = json.load(f)
#print("Load", d)
self.table.loaddata(d)
def createbuttons(self):
btnlayout = QtGui.QHBoxLayout()
newrow = QtGui.QPushButton("Add Row")
newcol = QtGui.QPushButton("Add Column")
newrow.clicked.connect(self.table.addrow)
newcol.clicked.connect(self.table.addcolumn)
savebtn = QtGui.QPushButton("Save")
savebtn.clicked.connect(self.save)
loadbtn = QtGui.QPushButton("Load")
loadbtn.clicked.connect(self.load)
btnlayout.addWidget(newrow)
btnlayout.addWidget(newcol)
btnlayout.addWidget(savebtn)
btnlayout.addWidget(loadbtn)
return btnlayout
app = QtGui.QApplication(sys.argv)
w = MainWindow()
sys.exit(app.exec_())
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment