I am creating a frequency table calculator. I want to move a tablewidget which is added inside a layout. Now I have set the layout inside qwidget and the showed it. When I try use the qwidget to move the layout. It gives me the error. move(self, int, int): argument 1 has unexpected type 'QVBoxLayout'
I know that QVBoxLayout is not moveable standalone. So I have tried embedded the QVBoxLayout into a QWidget but it still doesn't work.
from statistics import mode
import sys
from functools import cached_property
from PyQt5 import QtWidgets
from PyQt5 import QtCore
from PyQt5.QtWidgets import QLabel, QWidgetItem
from PyQt5.QtCore import QObject, pyqtSignal
from PyQt5.QtWidgets import QPushButton, QApplication, QTableWidget, QTableWidgetItem, QVBoxLayout, QWidget
from pynput.keyboard import Listener, KeyCode
a = KeyCode(char="a")
def getSelectedItemData():
for currentItem in tableWidget.selectedItems():
print(f"ROw : {currentItem.row()} Column : {currentItem.column()} {currentItem.text()}")
app = QApplication(sys.argv)
qwidget = QWidget()
qwidget.setWindowTitle("Python GUI Table")
qwidget.resize(412,597)
layout = QVBoxLayout()
tableWidget = QTableWidget()
tableWidget.setColumnCount(2)
tableWidget.setRowCount(0)
# adding item in table
tableWidget.setHorizontalHeaderItem(0, QTableWidgetItem("Scores"))
tableWidget.setHorizontalHeaderItem(1, QTableWidgetItem("Frquency"))
tableWidget.setHorizontalHeaderItem(2, QTableWidgetItem("FX"))
tableWidget.setItem(0, 0, QTableWidgetItem(""))
tableWidget.setItem(0, 1, QTableWidgetItem(""))
tableWidget.setItem(0, 2, QTableWidgetItem(""))
tableWidget.setItem(1, 0, QTableWidgetItem(""))
tableWidget.setItem(1, 1, QTableWidgetItem(""))
tableWidget.setItem(1, 2, QTableWidgetItem(""))
tableWidget.setItem(2, 0, QTableWidgetItem(""))
tableWidget.setItem(2, 1, QTableWidgetItem(""))
tableWidget.setItem(2, 2, QTableWidgetItem(""))
tableWidget.setItem(3, 0, QTableWidgetItem(""))
tableWidget.setItem(3, 1, QTableWidgetItem(""))
tableWidget.setItem(3, 2, QTableWidgetItem(""))
#formating table
header=tableWidget.horizontalHeader()
header.setSectionResizeMode(0, QtWidgets.QHeaderView.Stretch)
header.setSectionResizeMode(1, QtWidgets.QHeaderView.Stretch)
#initialzing table
tableWidget.doubleClicked.connect(getSelectedItemData)
layout.addWidget(tableWidget)
qwidget.move(layout, 200, 400)
qwidget.show()
why the layout is important
# Adding Row Button
class KeyListener(QObject):
pressed = pyqtSignal(object)
released = pyqtSignal(object)
@cached_property
def listener(self):
return Listener(on_release=self.on_release, on_press=self.on_press)
def on_press(self, key):
self.pressed.emit(key)
def on_release(self, key):
self.released.emit(key)
def start(self):
return self.listener.start()
# Data List
def get_column_data(column):
data = []
for i in range(tableWidget.rowCount()):
data.append(tableWidget.item(i, column).text())
return data
def handle_pressed(key):
if key == a:
tableWidget.insertRow(tableWidget.rowCount())
key_listener = KeyListener()
key_listener.pressed.connect(handle_pressed)
key_listener.start()
# Instructions
label = QLabel(qwidget)
label.setText("Instructions:To add a row please press A ")
label.move(35, 1)
label.adjustSize()
label.show()
# Calculate Logic
ScoresNumber = []
FrequencyNumber = []
def smallfunc(data_from_column):
data = []
for item in data_from_column:
if isinstance(item, str):
try:
print('those inputs are strings :D')
data.append(int(item))
except ValueError:
print("this input is really a string, don't do that ")
elif isinstance(item, int):
print('those inputs are intigers')
data.append(item)
return data
def btn_clicked():
ScoresNumber = smallfunc(get_column_data(0))
FrequencyNumber = smallfunc(get_column_data(1))
SumFrequencyNumber = sum(FrequencyNumber)
print("Sum of elements in frequency is :", SumFrequencyNumber)
print("\n")
print("Now calculating FX wait....")
FX = [a * b for a, b in zip(FrequencyNumber, ScoresNumber)]
print("Calculated,This is the FX:", FX)
print("\n")
SumFX = sum(FX)
print("Sum of elements in FX is :", SumFX)
print("\n")
print("Final Output")
Mean = SumFX / SumFrequencyNumber
new_func3(Mean)
def most_common(b):
return mode(b)
ModeList = [item for item, count in zip(ScoresNumber, FrequencyNumber) for i in range(count)]
b = ModeList
new_func2(most_common, b)
c = len(ModeList)
ModeList.sort()
if c % 2 == 0:
median1 = ModeList[c // 2]
median2 = ModeList[c // 2 - 1]
median = (median1 + median2) / 2
else:
median = ModeList[c // 2]
new_func1(median)
ScoresNumber.sort()
b = (ScoresNumber[-1])
c = (ScoresNumber[0])
Range = b - c
new_func(Range)
#OutPut\Answers
def new_func3(Mean):
MeanOutput=QLabel(qwidget)
MeanOutput.setText("Mean is{}".format(Mean))
MeanOutput.move(32,164)
MeanOutput.adjustSize()
MeanOutput.show()
def new_func2(most_common, b):
ModeOutput=QLabel(qwidget)
ModeOutput.setText("Mode is{}".format(most_common(b)))
ModeOutput.move(32,176)
ModeOutput.adjustSize()
ModeOutput.show()
def new_func1(median):
MedianOutut=QLabel(qwidget)
MedianOutut.setText("Median is{}".format(median))
MedianOutut.move(32,188)
MedianOutut.adjustSize()
MedianOutut.show()
def new_func(Range):
RangeOutput=QLabel(qwidget)
RangeOutput.setText("Range is{}".format(Range))
RangeOutput.move(32,200)
RangeOutput.adjustSize()
RangeOutput.show()
# Calculate Button
btn = QPushButton(qwidget)
btn.setText('Calculate')
btn.move(188, 360)
btn.show()
btn.clicked.connect(btn_clicked)
qwidget.show()
sys.exit(app.exec_())