2015-04-15 2 views
0

Я пытаюсь управлять двумя MainWindow (MainWindow & AccessWindow) с PyQt для моего проекта RFID ACCESS CONTROL. Я хочу показать первый MainWindow все время (Endless Loop). Затем я хочу скрыть его и показать второй MainWindow, когда считыватель RFID (который работает в режиме автоматического чтения) считывает метку RFID. поэтому в основной программе python у меня есть псевдо-цикл «do while» (в то время как True: и break with a condition), чтобы читать на последовательном порту данные, предоставленные читателем. Тогда я проверяю БД .. Это не важно. . Таким образом, событие триггера «, когда читатель что-то читал) я получил некоторую помощь от другого форума, и теперь у меня есть это:PyQt: Управление двумя MainWindow

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

#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("WELCOME", 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): 
    def __init__(self): 
     self.accueil = MainWindow(self) 
     self.accueil.show() 
     self.access = AccessWindow() 

    def wait(self): 
     # RFID READER ENDLESS LOOP 
     while 1: 

      global EPC_Code 
      ser = serial.Serial(port='COM6', baudrate=115200)  
      a = ser.read(19).encode('hex') 
      if (len(a)==38): 
       EPC_Code = a[14:] 
       print ('EPC is : ' + EPC_Code) 
       break 
      else: 
       continue 
     ser.close() 


     self.on_event(EPC_Code) 

    def on_event(self, data): 
     def refresh(): 
      self.toggle_widget(False) 
      self.wait() 
     # vérification des données 
     EPC_Code = data 
     sql_command = "[Get_Access_RFID] @Code_RFID = '"+EPC_Code+"', @Code_Zone = '"+Code_Zone+"'" # STORED PROCEDURE 
     db_cursor.execute(sql_command) 
     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) 

if __name__=='__main__': 
    cnxn = """DRIVER={SQL Server};SERVER=***;PORT=***;UID=***;PWD=***;DATABASE=***""" 
    db_connection = pyodbc.connect(cnxn) 
    db_cursor = db_connection.cursor() 
    print ('Connected TO DB & READY') 
    app = QtGui.QApplication(sys.argv) 
    main = Main() 
    main.wait() 
    sys.exit(app.exec_()) 

и теперь моя проблема заключается в том, что текст первого окна не отображается когда я запускаю программу, но текст второго окна появляется, когда я держать свой значок рядом с RFID Reader.

ответ

0

Вместо двух MainWindow, создать. Как содержание, создать два класса, которые проходят QtGui.QWidget называют MainView и AccessView. Вместо заменив окно, просто поместите правильный вид в окно. Таким образом, вы можете менять вид без открытия/закрытия окон.

Если вы используете макет, то размер окна будет изменен в соответствии с представлением.

Следующая проблема заключается в том, что вы блокируете поток пользовательского интерфейса, что означает, что Qt не может обрабатывать события (например, событие «paint UI»). Чтобы исправить это, вы должны перенести код обработки RFID в фоновый поток. Вы можете испускать сигналы из этого фонового потока для обновления пользовательского интерфейса.

Примечание: вы не должны вызывать код пользовательского интерфейса из потока! Просто испускайте сигналы. Основная петля PyQt увидит их и обработает.

Связанные:

+0

Привет, Аарон, вы можете показать мне, как перемещать события обработки RFID в фоновом потоке. Я начинаю в PyQt, и я не знаю знаю, как .. я проверил две ссылки, но я ничего не понял .. Я застрял с 3 дней .. Мне действительно нужна твоя помощь! –

+0

Этот веб-сайт не касается написания кода для вас, это вопрос о том, что вы задаете вопросы, пока не сможете сами написать код :-) Пожалуйста, снова прочитайте статьи и начните задавать вопросы, когда вы не понимаете слова или концепцию. –

+0

С уважением, я не понимаю ваше примечание. –

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