2017-01-22 29 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

什麼是inputAttendance? – eyllanesc

+0

沒有答案波紋管工作?它應該完美地工作。 – yurisnm

+0

@ Y.Melo感謝您的回覆!我現在正趕上一些工作/回到學校,所以我明天晚上要看看你的回覆。 – NickBow

回答

-1

Helloww先生,這是一個非常好的問題,讓我們以這種方式進行總結。

  1. 假設我們有兩個類,Widget類和MainWindow類。
  2. 小部件將包含兩個信號,一個信號從其自身運行一個方法,另一個信號將從MainWindow運行一個方法。
  3. 我們將在小部件內部連接的第一個信號從Widget發出並運行一個方法。
  4. 第二個將在那裏我們有我們班的小窗口實例,並會從主窗口運行的方法

讓我們在這個小例子來看看這代表着什麼我只是試圖在主窗口內連接總結。

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

相關問題