How to move a widget inside a qvboxlayout

369 Views Asked by At

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_())
0

There are 0 best solutions below