【问题标题】:Python-PyQt4 QTextEditPython-PyQt4 QTextEdit
【发布时间】:2018-08-17 08:16:36
【问题描述】:

大家好,我有一个问题,我必须编写 python 脚本,该脚本将首先显示一个带有按钮文本编辑和一些标签的 qt4 窗口。 我已经链接了按钮,但是当我单击脚本结尾的左侧按钮时,它会显示:

Traceback(最近一次调用最后一次): 文件“Skrypt.py”,第 18 行,位于 Koniec QtGui.QMessageBox.Yes | QtGui.QMessageBox.No) TypeError:参数不匹配任何重载调用: 问题(QWidget,str,str,按钮:Union[QMessageBox.StandardButtons,QMessageBox.StandardButton] = QMessageBox.Ok,defaultButton:QMessageBox.StandardButton = QMessageBox.NoButton):参数 1 具有意外类型 'bool' 问题(QWidget,str,str,int,button1:int = 0,button2:int = 0):参数 1 具有意外类型“bool” 问题(QWidget,str,str,str,button1Text:str = '',button2Text:str = '',defaultButtonNumber:int = 0,escapeButtonNumber:int = -1):参数 1 具有意外类型 'bool'

当我点击右边时,这将是一个 pylab 脚本,它将从中获取价值 文本编辑它显示这个:

文件“Skrypt.py”,第 26 行,位于 Zatwierdz
a = int(uiplot.textEdit())
TypeError: 'QTextEdit' 对象不可调用

我不知道如何解决这个问题,因为这是我第一次使用 qt4,所以如果有人可以帮助我,我将不胜感激

这是脚本中的代码,它将使用 matplotlib 显示函数

import skrypt1
import pylab
import skrypt1
from pylab import *

import sys

from PyQt4 import QtGui, QtCore

if __name__ == "__main__":

    app = QtGui.QApplication(sys.argv)

    def Koniec(self):
        global wybor
        wybor = QtGui.QMessageBox.question(self, 'Koniec',
            "Na Pewno chcesz wyjsc ?",
        QtGui.QMessageBox.Yes | QtGui.QMessageBox.No)
        if wybor == QtGui.QMessageBox.Yes: 
            sys.exit()
        else:
            pass

    def Zatwierdz(self):
        x = pylab.arange(-10, 10.5, 0.5)  
        a = int(uiplot.textEdit())
        y1 = [i / -3 + a for i in x if i <= 0]
        y2 = [i**2 / 3 for i in x if i >= 0]
        x1 = [i for i in x if i <= 0]
        x2 = [i for i in x if i >= 0]
        pylab.plot(x1, y1, x2, y2)
        pylab.title('Wykres f(x)')
        pylab.grid(True)
        pylab.show()

    gui_plot = skrypt1.QtGui.QMainWindow()
    uiplot = skrypt1.Ui_MainWindow()
    uiplot.setupUi(gui_plot)

    uiplot.Zatwierdz.clicked.connect(Zatwierdz)
    uiplot.Wyjscie.clicked.connect(Koniec)

    gui_plot.show()
    sys.exit(app.exec_())

这是创建窗口的代码:

from PyQt4 import QtCore, QtGui

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s

try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName(_fromUtf8("MainWindow"))
        MainWindow.resize(800, 600)
        self.centralwidget = QtGui.QWidget(MainWindow)
        self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
        self.label = QtGui.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(50, 60, 361, 21))
        self.label.setObjectName(_fromUtf8("label"))
        self.label_2 = QtGui.QLabel(self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(50, 270, 361, 21))
        self.label_2.setObjectName(_fromUtf8("label_2"))
        self.textEdit = QtGui.QTextEdit(self.centralwidget)
        self.textEdit.setGeometry(QtCore.QRect(40, 360, 711, 71))
        self.textEdit.setObjectName(_fromUtf8("textEdit"))
        self.Zatwierdz = QtGui.QPushButton(self.centralwidget)
        self.Zatwierdz.setGeometry(QtCore.QRect(560, 500, 200, 28))
        self.Zatwierdz.setObjectName(_fromUtf8("Zatwierdz"))
        self.Wyjscie = QtGui.QPushButton(self.centralwidget)
        self.Wyjscie.setGeometry(QtCore.QRect(350, 500, 201, 28))
        self.Wyjscie.setObjectName(_fromUtf8("Wyjscie"))
        self.label_3 = QtGui.QLabel(self.centralwidget)
        self.label_3.setGeometry(QtCore.QRect(50, 160, 701, 31))
        self.label_3.setObjectName(_fromUtf8("label_3"))
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None))
        self.label.setText(_translate("MainWindow", "Funkcja Trygonometryczna", None))
        self.label_2.setText(_translate("MainWindow", "Podaj wspolczynnik a: ", None))
        self.Zatwierdz.setText(_translate("MainWindow", "Zatwierdz", None))
        self.Wyjscie.setText(_translate("MainWindow", "Wyjscie", None))
        self.label_3.setText(_translate("MainWindow", "Skrypt wyswietli wykres funkcji po wpisaniu wartosci ", None))


if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    MainWindow = QtGui.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

【问题讨论】:

  • 先修复代码格式

标签: python pyqt pyqt4


【解决方案1】:

您的代码有以下错误:

  • clicked 信号具有一个布尔值作为可选参数,指示按钮是否被选中(通常为 False,因为该属性默认禁用,在您的情况下,您将 self 作为第一个参数函数,那是不必要的。你混淆了 self 的使用,类中使用了那种类型的属性,但你只有函数,所以没有必要声明那个属性,而不是将 self 传递给 @987654322 @你可以在 lambda 函数的帮助下传递 gui。

  • 另一个错误是 textEditUi_MainWindow 类的成员,它不是函数或可调用的东西,所以你不应该使用括号,textEdit 是 @ 类的对象987654326@ 所以如果你想得到文本你必须使用它的方法toPlainTex()

  • 另一个错误是没有验证要转换成整数的值是否可以,一个简单的解决方法是使用try和except。

  • 不建议使用 global,因为很难监控它们的行为,所以如果你遇到由全局变量引起的问题,你将很难检测到它。

以上所有我已经实现了以下解决方案:

import sys

from PyQt4 import QtGui, QtCore
import pylab

import skrypt1

def Koniec(gui):
    wybor = QtGui.QMessageBox.question(gui, 'Koniec',
        "Na Pewno chcesz wyjsc ?",
        QtGui.QMessageBox.Yes | QtGui.QMessageBox.No)
    if wybor == QtGui.QMessageBox.Yes: 
        sys.exit()

def Zatwierdz():
    try:
        x = pylab.arange(-10, 10.5, 0.5)  
        a = int(uiplot.textEdit.toPlainText())
        y1 = [i / -3 + a for i in x if i <= 0]
        y2 = [i**2 / 3 for i in x if i >= 0]
        x1 = [i for i in x if i <= 0]
        x2 = [i for i in x if i >= 0]
        pylab.plot(x1, y1, x2, y2)
        pylab.title('Wykres f(x)')
        pylab.grid(True)
        pylab.show(block=False)
    except ValueError:
        print("Error")


if __name__ == "__main__":

    app = QtGui.QApplication(sys.argv)

    gui_plot = skrypt1.QtGui.QMainWindow()
    uiplot = skrypt1.Ui_MainWindow()
    uiplot.setupUi(gui_plot)

    uiplot.Zatwierdz.clicked.connect(Zatwierdz)
    uiplot.Wyjscie.clicked.connect(lambda checked, w=gui_plot:Koniec(gui_plot))

    gui_plot.show()
    sys.exit(app.exec_())

【讨论】:

  • 非常感谢您帮了我很多忙
  • @PonuryZniwiarz 哈哈哈,这是程序员的命,检查文档,这是最重要的。如果我的回答对您有帮助,请不要忘记将其标记为正确,如果您不知道该怎么做,请查看tour。快乐编码
  • @PonuryZniwiarz 如果您还没有阅读我之前的评论,我会再次展示它:所以我建议您创建一个新问题来展示您尝试过的内容,记住 SO 不是编码服务,我们不做你的功课,我们帮助你解决你试图解决问题的有趣问题,为此你必须展示它,除了你当前的帖子,我看不到你尝试过任何事情。。如果你不努力,没人愿意帮助你
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-31
相关资源
最近更新 更多