在QPushButton上单击检查条件,然后连接到一个函数

时间:2018-02-20 07:44:03

标签: python-3.x pyqt5

我想接受点击按钮的用户输入,将该输入转换为整数,如果转换成功,则触发另一个函数并将用户输入传递给该函数。 在我的代码中,这部分发生了看涨功能。 存储用户在vtxt中写入的内容,如果单击QPushButton,则将vtxt的值转换为int / float,如果成功则将相同的值传递给另一个名为Bull的函数,我想在那里进行计算并给出用户输出。 我的代码没有给出预期的结果。我做错了,由于缺乏知识,请帮忙。 以下是完整的代码

from PyQt5.QtWidgets import *
import sys, os
from datetime import date, timedelta
import nsepy as ns
from nsepy.derivatives import get_expiry_date
import pandas as pd
import numpy as np
import math
import matplotlib.pyplot as plt
from PyQt5.QtCore import *
import traceback


class MainWindow(QMainWindow):                  


    def __init__(self, parent = None):
        super(MainWindow, self).__init__(parent)

        self.iniUI()
    def iniUI(self):
        #resize, put the win at center and give it a title
        self.resize(1280, 720)
        self.Wincenter()
        self.setWindowTitle('Abinash\'s Project')

        #setting up the Main window with a Mdi Area, so we can create sub windows
        self.mdi = QMdiArea()
        self.setCentralWidget(self.mdi)

        #setting up a menu Bar
        menubar = self.menuBar()
        fileMenu = menubar.addMenu('File')
        fileTRIN = QAction('TRIN', self) #defination of the action
        fileMenu.addAction(fileTRIN) #adding the action to the file menu

        fileOp = QMenu('Option Strategies', self)
        fileOpBull = QAction('Bullish', self)
        fileOpBear = QAction('Bearish', self)
        fileOp.addAction(fileOpBull)
        fileOp.addAction(fileOpBear)

        fileMenu.addMenu(fileOp)

        #Below codes will define the actions that will occur on the click of items in menu bar
        '''
        fileTRIN.triggered.connect()
        fileOpBear.triggered.connect()
        '''
        fileOpBull.triggered.connect(self.bullish)


    def bullish(self):
        sub = QWidget()
        layout = QGridLayout(sub)
        btn = QPushButton('Submit')
        txt = QTextEdit()
        lbl1 = QLabel('Enter your target on Nifty')
        layout.addWidget(lbl1)
        layout.addWidget(txt)
        layout.addWidget(btn)
        sub.setWindowTitle('Possible Bullish positions')
        self.mdi.addSubWindow(sub)
        vtxt = txt.toPlainText()
        event = btn.clicked
        while event == True:
            try:
                vtxt = int(vtxt)  #example value would be 10450
                event.connect(self.bull(vtxt))
            except Exception as e:
                lbl1.setText("The value you entered is invalid, Please try again")
        sub.show()

    def bearish(self):
        sub = QWidget()
        layout = QGridLayout(sub)
        btn = QPushButton('Submit')
        txt = QTextEdit()
        lbl1 = QLabel('Enter your target on Nifty')
        layout.addWidget(lbl1)
        layout.addWidget(txt)
        layout.addWidget(btn)
        sub.setWindowTitle('Possible Bearish positions')
        self.mdi.addSubWindow(sub)

        sub.show()

    def bull(self, vtxt):
        #I will use the value in vtxt to do some calculations
        value = vtxt
        print(value)



    def Wincenter(self):
        qr = self.frameGeometry()
        cp = QDesktopWidget().availableGeometry().center()
        qr.moveCenter(cp)
        self.move(qr.topLeft())



if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = MainWindow()
    ex.show()   
    sys.exit(app.exec_())

1 个答案:

答案 0 :(得分:0)

感谢@Tobias,我能够理解我的代码出了什么问题。

我不知道信号和插槽是如何工作的,事实上我不知道有这样的事情。

现在我可以使用插槽来实现所需的结果。

对于那些不熟悉PyQt5的人来说,你可以将QPushButton连接到一个函数并发送参数,这是我无法通过直接连接它做的事情,只需使用lambda 例如:

btn = QPushButton()
btn.clicked.connect(lambda: self.function(*args,**kwargs))

这样我们就可以通过点击一个按钮将参数传递给一个函数了。不能在点击时传递一个参数导致我很多痛苦但是一旦我学会了如何去做,它真的让我的生活更轻松。希望这有助于某人。