вызов функции в кнопке и параметре - PullRequest
0 голосов
/ 21 марта 2020

привет, я написал python программу на qt. Я хочу вызвать функцию в кнопке, но она не работает

мой код:

я пишу этот код на pycharm и запускаю код, но это не работает, я проверил его в режиме ожидания, против другой среды, но это не работает. Когда я использую функцию jcopy, чтобы нажать кнопку события, его работа и его копирование текста lineEdit в текст lineEdit_2, но когда я хочу использовать функцию jtrans для перевода текста lineEdit и и копирования результата в программу lineEdit2 не работает. в pycharm и vs, idle не посылает никаких ошибок, но не работает, поэтому я пишу ту же консольную программу, которая работает в терминале, который работает правильно

from PyQt5 import QtCore, QtGui, QtWidgets
from googletrans import Translator
class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(598, 456)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(30, 30, 201, 16))
        font = QtGui.QFont()
        font.setPointSize(12)
        font.setBold(True)
        font.setWeight(75)
        self.label.setFont(font)
        self.label.setObjectName("label")
        self.comboBox = QtWidgets.QComboBox(self.centralwidget)
        self.comboBox.setGeometry(QtCore.QRect(150, 220, 131, 22))
        self.comboBox.setObjectName("comboBox")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(30, 220, 201, 16))
        font = QtGui.QFont()
        font.setPointSize(12)
        font.setBold(True)
        font.setWeight(75)
        self.label_2.setFont(font)
        self.label_2.setObjectName("label_2")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(480, 220, 75, 23))
        self.pushButton.setObjectName("pushButton")
        self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit.setGeometry(QtCore.QRect(30, 60, 551, 131))
        self.lineEdit.setText("")
        self.lineEdit.setObjectName("lineEdit")
        self.lineEdit_2 = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_2.setGeometry(QtCore.QRect(30, 250, 541, 141))
        self.lineEdit_2.setObjectName("lineEdit_2")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 598, 21))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        self.pushButton.clicked.connect(self.jtrans)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.label.setText(_translate("MainWindow", "Input Text:"))
        self.comboBox.setItemText(0, _translate("MainWindow", "persian"))
        self.comboBox.setItemText(1, _translate("MainWindow", "english"))
        self.comboBox.setItemText(2, _translate("MainWindow", "arabic"))
        self.comboBox.setItemText(3, _translate("MainWindow", "danish"))
        self.comboBox.setItemText(4, _translate("MainWindow", "dutch"))
        self.label_2.setText(_translate("MainWindow", "output Text:"))
        self.pushButton.setText(_translate("MainWindow", "translate"))

    # def jcopy(self):
    # t1=self.lineEdit.text()
    # self.lineEdit_2.setText(t1)

    def jtrans(self, translator=None):
        srcString = self.lineEdit.text()
        srcLang = translator.detect(srcString)
        dstLang = self.comboBox.currentText()
        translated = translator.translate(srcString, src=srcLang, dest=dstLang)
        self.lineEdit_2.setText(translated.text)


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

Функция jcopy - это функция, которую я знаю Нажмите кнопку «Выполнить код»

Проблема в коде Sippet:

 def jtrans(self, translator=None):
        srcString = self.lineEdit.text()
        srcLang = translator.detect(srcString)
        dstLang = self.comboBox.currentText()
        translated = translator.translate(srcString, src=srcLang, dest=dstLang)
        self.lineEdit_2.setText(translated.text)

Любой может решить эту проблему tnx

1 Ответ

0 голосов
/ 21 марта 2020

У вас есть тривиальная ошибка: почему вы устанавливаете объект translator в def jtrans(self, translator=None):? Как вы думаете, объект translator был волшебным образом создан? Ну нет. Если проверено сообщение об ошибке:

Traceback (most recent call last):
  File "foo.py", line 74, in jtrans
    srcLang = translator.detect(srcString)
AttributeError: 'bool' object has no attribute 'detect'

Понятно, что оно не создано волшебным образом, но X принимает значение того, что посылает сигнал по умолчанию, нажатый: булево.

Прежде чем предлагать решение PyQt, я рекомендую не изменять код, сгенерированный Qt Designer, поэтому вам придется использовать pyui c и перегенерировать файл, я предполагаю, что созданный файл называется gui .py.

Имейте в виду, что процесс перевода занимает очень много времени, поэтому он может обработать sh GUI, поэтому вам придется запустить его в другом потоке. Другая проблема в вашем коде состоит в том, что метод detect возвращает не язык, а объект класса Detected, который имеет информацию о языке.

Учитывая вышеизложенное, решение является следующим:

main.py

import sys
import threading


from PyQt5 import QtCore, QtGui, QtWidgets

from googletrans import Translator

from gui import Ui_MainWindow


class WorkerTranslator(QtCore.QObject):
    translateSignal = QtCore.pyqtSignal(str)

    def translate(self, text, dst_lang):
        threading.Thread(
            target=self._translate, args=(text, dst_lang), daemon=True
        ).start()

    def _translate(self, text, dst_lang):
        translator = Translator()
        src_lang = translator.detect(text).lang
        translated = translator.translate(text, src=src_lang, dest=dst_lang)
        self.translateSignal.emit(translated.text)


class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setupUi(self)
        self.pushButton.clicked.connect(self.translate)

        self.translator = WorkerTranslator()
        self.translator.translateSignal.connect(self.lineEdit_2.setText)

    @QtCore.pyqtSlot()
    def translate(self):
        text = self.lineEdit.text()
        dst_lang = self.comboBox.currentText()
        self.translator.translate(text, dst_lang)


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())
├── gui.py
└── main.py
...