2017-01-22 9 views
1

Я пытаюсь запустить функцию inputAttendance (AthleteInfo) всякий раз, когда кнопка ввода нажата в окне confirmPopup. Эта функция содержится в другом файле, который я импортирую и не входит ни в один из классов. Одна проблема, у меня есть то, что он, кажется, бежитКак использовать сигналы от QWidget, чтобы сообщить главному окну о выполнении функции?

self.confirmw.confirmAthlete.connect (inputAttendance (AthleteInfo))

до сигнала даже излучается. После того, как inputAttendance() будет сделано, все окно закрывается после того, как я получаю сообщение об ошибке

аргумент 1 имеет неожиданный тип «NoneType»

Я пытался его поиск, и он, возможно, может быть я не определяя тип соединения?

Любая помощь будет принята с благодарностью, потому что я давно застрял на этом.

Редактировать: InputAttendance() - это функция, которая обновляет электронную таблицу, которая находится в другом файле, который я импортировал, но не включался в сообщение, так как он не имеет отношения к моему вопросу. Я протестировал функцию, и она работает отлично, поэтому я уверен, что она не приводит к сбою программы, а скорее как она называется. Извините за беспорядок!

from PyQt5.QtWidgets import (QWidget, QPushButton, QLineEdit, 
    QInputDialog, QApplication, QLabel) 
from PyQt5.QtCore import * 


class Ex(QWidget): 

    def __init__(self): 
     super().__init__() 

     self.initUI() 


    def initUI(self):  

     self.le = QLineEdit(self) 
     self.le.move(500, 500) 
     self.le.returnPressed.connect(self.pushEnter)  

     self.setGeometry(1000, 1000, 1000, 1000) 
     self.setWindowTitle('Input dialog') 
     self.show() 

    def pushEnter(self): 
     text = self.le.text() 
     AthleteInfo = getID(text) 

     if (AthleteInfo == -1): 
      print ("Could nto find that ID") 

     else: 
      try: 
       self.confirmw =confirmPopup("Confirm Window") 
      except Exception in e: 
       print(e) 
       time.sleep(10) 
      self.confirmw.setGeometry(1000, 1000, 1000, 1000) 
      self.confirmw.show() 
      try: 

       self.confirmw.setWindowModality(Qt.ApplicationModal) 
      except Exception as e: 
       print(e) 
       time.sleep(5) 
      try:     self.confirmw.confirmAthlete.connect(inputAttendance(AthleteInfo)) 

      except Exception as e: 
       print(e) 
       time.sleep(5) 

class confirmPopup(QWidget): 

    confirmAthlete = pyqtSignal(str) 

    def __init__(self, name): 
     super().__init__() 
     self.name = name 
     self.initUI() 

    def initUI(self): 
     lblName = QLabel(self.name, self, text = "Press enter to confirm") 

    def keyPressEvent(self, event): 
     keyPress = event.text() 

     if event.key() == Qt.Key_Enter or event.key() == Qt.Key_Return: 

      try: 
       #print("Emitting Signal") 
       self.confirmAthlete.emit("Yes") 
      except Exception as e: 
       print(e) 
       time.sleep(5) 

     if event.key() == Qt.Key_Backspace: 
      print("Backspace was pressed") 

if __name__ == '__main__': 

    app = QApplication(sys.argv) 
    ex = Ex() 
    sys.exit(app.exec_()) 
+0

что такое ввод? – eyllanesc

+0

Не ответил ли ответ? Он должен работать отлично. – yurisnm

+0

@ Y.Melo Спасибо за ваш ответ! В настоящий момент я нахожусь в какой-то работе/возвращаясь в школу, поэтому завтра я буду смотреть на ваш ответ. – NickBow

ответ

-1

Helloww сэр, это действительно хороший вопрос, давайте подведем итоги таким образом.

  1. Предположим, у нас есть два класса: класс Widget и класс MainWindow.
  2. Виджет будет содержать два сигнала, один сигнал запускает метод от себя, другой сигнал будет запускать метод из MainWindow.
  3. Первый сигнал, который мы подключим внутри виджета, испускаем и запускаем метод из виджета.
  4. Второй будет подключен внутри MainWindow, где у нас есть виджет экземпляр нашего класса и будет выполняться метод из MainWindow

Давайте посмотрим на этот маленький пример, который представляет собой то, что я просто пытался подведем итог.

from PyQt5.QtCore import pyqtSignal 
from PyQt5.QtWidgets import QApplication 
from PyQt5.QtWidgets import QMainWindow 
from PyQt5.QtWidgets import QWidget 


class MainWindow(QMainWindow): 

    myWidget = None 

    def __init__(self): 
     super(MainWindow, self).__init__() 

     self.myWidget = Widget() 

     self.setFixedSize(500,500) 
     self.myWidget.setFixedSize(500,500) 

     self.layout().addWidget(self.myWidget) 

     self.myWidget.signalExecuteAMainWindowFunction.connect(self.mainWindowFunction) 

    def mainWindowFunction(self): 
     print("running my MAINWINDOW function...") 


class Widget(QWidget): 

    signalExecuteMyFunction = pyqtSignal() 
    signalExecuteAMainWindowFunction = pyqtSignal() 

    def __init__(self): 
     super(Widget, self).__init__() 
     self.signalExecuteMyFunction.connect(self.myFunction) 

    def mousePressEvent(self, QMouseEvent): 
     self.signalExecuteMyFunction.emit() 
     super(Widget, self).mousePressEvent(QMouseEvent) 

    def mouseMoveEvent(self, QMouseEvent): 
     self.signalExecuteAMainWindowFunction.emit() 
     super(Widget, self).mouseMoveEvent(QMouseEvent) 

    def myFunction(self): 
     print("running my WIDGET function...") 



if __name__ == "__main__": 
    import sys 

    app = QApplication(sys.argv) 
    main_window = MainWindow() 
    main_window.show() 
    sys.exit(app.exec_()) 

Ps: Есть еще много красивых способов сделать некоторые вещи, которые я сделал, как имена переменных, ориентации объекта и организации, но это суть того, что вы задали этот вопрос. Надеюсь, он разъяснил немного больше о том, как это работает. : D

 Смежные вопросы

  • Нет связанных вопросов^_^