Pythonqt4 QTextEdi

2024-09-25 10:24:44 发布

您现在位置:Python中文网/ 问答频道 /正文

大家好,我有一个问题,我要写一个python脚本,首先显示一个带有按钮文本编辑和一些标签的qt4窗口。 按钮我已经链接,但当我点击我的左按钮(脚本的结尾)时,它会显示以下内容:

Traceback (most recent call last): File "Skrypt.py", line 18, in Koniec QtGui.QMessageBox.Yes | QtGui.QMessageBox.No) TypeError: arguments did not match any overloaded call: question(QWidget, str, str, buttons: Union[QMessageBox.StandardButtons, QMessageBox.StandardButton] = QMessageBox.Ok, defaultButton: QMessageBox.StandardButton = QMessageBox.NoButton): argument 1 has unexpected type 'bool' question(QWidget, str, str, int, button1: int = 0, button2: int = 0): argument 1 has unexpected type 'bool' question(QWidget, str, str, str, button1Text: str = '', button2Text: str = '', defaultButtonNumber: int = 0, escapeButtonNumber: int = -1): argument 1 has unexpected type 'bool'

当我点击右边,这将是一个pylab脚本,它将从 文本编辑显示:

File "Skrypt.py", line 26, in Zatwierdz
a = int(uiplot.textEdit())
TypeError: 'QTextEdit' object is not callable

我不知道怎么解决这个问题,因为这是我第一次来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_())

下面是如何创建窗口的代码:

^{pr2}$

Tags: inimport脚本ifsysintquestionstr
1条回答
网友
1楼 · 发布于 2024-09-25 10:24:44

您的代码有以下错误:

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

  • 另一个错误是textEditUi_MainWindow类的成员,它不是一个函数或可调用的东西,因此不应使用括号,textEdit是类QTextEdit的对象,因此如果要获取文本,必须使用其方法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_())

相关问题 更多 >