0

我正在创建一个频率表计算器。我想移动一个添加到布局中的表格小部件。现在我已经在 qwidget 中设置了布局并显示了它。当我尝试使用 qwidget 移动布局时。它给了我错误。move(self, int, int): argument 1 has unexpected type 'QVBoxLayout'

我知道 QVBoxLayout 不能独立移动。所以我尝试将 QVBoxLayout 嵌入到 QWidget 中,但它仍然不起作用。

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

为什么布局很重要

# 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_())
4

0 回答 0