Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 管理两个主窗口主窗口和线程_Python_Pyqt4 - Fatal编程技术网

Python 管理两个主窗口主窗口和线程

Python 管理两个主窗口主窗口和线程,python,pyqt4,Python,Pyqt4,我更新了一些东西,比如从thread类调用on_事件方法,现在我有了以下代码: # -*- coding: utf-8 -*- from PyQt4 import QtCore, QtGui import sys, pyodbc, serial import os import time import thread from PyQt4.QtCore import pyqtSignal from PyQt4.QtCore import QObject, pyqtSignal #Variable

我更新了一些东西,比如从thread类调用on_事件方法,现在我有了以下代码:

# -*- coding: utf-8 -*-
from PyQt4 import QtCore, QtGui
import sys, pyodbc, serial
import os
import time
import thread
from PyQt4.QtCore import pyqtSignal
from PyQt4.QtCore import QObject, pyqtSignal

#Variables
Code_Zone = "d"

class MainWindow(QtGui.QWidget):
    def __init__(self, main):
        super(MainWindow, self).__init__()
        self.main = main
        self.grid = QtGui.QGridLayout(self)
        self.welcome = QtGui.QLabel("Bienvenue sur www.developpez.net", self)
        self.grid.addWidget(self.welcome, 2, 2, 1, 5)

class AccessWindow(QtGui.QWidget):
    def __init__(self):
        super(AccessWindow, self).__init__()
        self.setMinimumSize(150, 50)
        self.grid = QtGui.QGridLayout(self)
        self.label = QtGui.QLabel(self)
        self.grid.addWidget(self.label, 1, 1, 1, 1)

class Main(object):
    global EPC_Code
    def __init__(self):
        self.accueil = MainWindow(self)
        self.accueil.show()
        self.access = AccessWindow()

    def on_event(self, data):
        def refresh():
            self.toggle_widget(False)
            #c = AThread()
            c.run()
            #self.wait()
        # vérification des données 
        EPC_Code = data
        cnxn = """DRIVER={SQL Server};SERVER=Aziz-PC\SQLEXPRESS;PORT=1433;UID=poleindus;PWD=poleindus;DATABASE=indusdb"""
        db_connection = pyodbc.connect(cnxn)
        db_cursor = db_connection.cursor()
        print ('Connected TO DB & READY')
        sql_command = "EXECUTE [Get_Access_RFID] @Code_RFID = '"+EPC_Code+"', @Code_Zone = '"+Code_Zone+"'"
        db_cursor.execute("EXECUTE [Get_Access_RFID] @Code_RFID = '"+EPC_Code+"', @Code_Zone = '"+Code_Zone+"'")
        rows = db_cursor.fetchone()
        result= str(rows[0])
        print ("result = " + str(result))
        if result == "True":
            # si OK
            self.access.label.setText('ACCESS GRANTED')
        else:
            # si pas OK
            self.access.label.setText('ACCESS DENIED')
        self.toggle_widget(True)
        QtCore.QTimer.singleShot(2000, refresh)

    def toggle_widget(self, b):
        self.accueil.setVisible(not b)
        self.access.setVisible(b)


class AThread(QtCore.QThread):
    rfid_event = pyqtSignal(str, name='rfid_event')

    def run(self):
        while 1:
            ser = serial.Serial(port='COM6', baudrate=115200)
            a = ser.read(19).encode('hex')
            ser.close()

            if len(a) == 38:
                EPC_Code = a[14:]
                print ('EPC is : ' + EPC_Code)
                self.rfid_event.emit(EPC_Code)

if __name__=='__main__':
    #cnxn = """DRIVER={SQL Server};SERVER=Aziz-PC\SQLEXPRESS;PORT=1433;UID=poleindus;PWD=poleindus;DATABASE=indusdb"""
    #db_connection = pyodbc.connect(cnxn)
    #db_cursor = db_connection.cursor()
    #print ('Connected TO DB & READY')
    app = QtGui.QApplication(sys.argv)
    main = Main()
    thread = AThread()
    thread.rfid_event.connect(Main().on_event)
    thread.start()
    #main = Main()
    sys.exit(app.exec_())

我已经在代码顶部添加了这一行,现在,我有另一个错误:要执行的第一个参数必须是字符串或unicode查询。当我检查sql命令的值时,我发现它等于:PyQt4.QtCore.QStringuEXECUTE[Get_Access_RFID]@code_RFID='e20010712904019411709bdd',@Code\u Zone='d'

您可以在AThread中创建一个新的Main。这意味着您现在有两个,更糟糕的是,每次处理RFID事件时都会创建一个

此外,不允许从线程内部从Main调用方法。想象一下,如果线程在第一次调用返回之前再次调用它们会发生什么:数据将被破坏

相反,您必须在AThread中声明一个信号并调用emit来发送它。最后一段代码中的主节点可以连接到此信号

class AThread(QtCore.QThread):
    rfid_event = pyqtSignal(str, name='rfid_event')

    def run(self):
        while 1:
            ser = serial.Serial(port='COM6', baudrate=115200)
            a = ser.read(19).encode('hex')
            ser.close()

            if len(a) == 38:
                EPC_Code = a[14:]
                print ('EPC is : ' + EPC_Code)
                self.rfid_event.emit(EPC_Code)
以及后面的_u主代码中:

还要注意thread.finished.connectapp.exit将不起作用:该线程包含一个无止境的循环,并且永远不会结束。相反,应该在主窗口关闭时终止线程


我还固定访问串口;每次都必须关闭它。

thread.rfid\u event.connectMain.on\u event AttributeError:“function”对象没有从PyQt4添加的属性“pyqtSignature”。QtCore导入QObject,pyqtSignal位于顶部。解释如何声明和使用信号。我已经在代码顶部添加了这一行,现在,我有另一个错误:
main = Main()
thread = AThread()
thread.rfid_event.coonect(Main.on_event)
thread.start()
#main = Main()
sys.exit(app.exec_())