示例#1
0
文件: gui.py 项目: NobbZ/disco
   def __init__(self, parent=None):
      QtGui.QMainWindow.__init__(self, parent)
      self.ui = Ui_MainWindow()
      self.ui.setupUi(self)

      self.nextWorkerInput = ["[]", "1"]
      self.bestPropScore = -1
      self.clear_worker_table()

      self.DataCollector = JsonReader(self)
      self.connect(self.DataCollector, QtCore.SIGNAL("received_data"), self.received)
      self.connect(self.DataCollector, QtCore.SIGNAL("worker_updated"), self.update_worker)
      self.connect(self.DataCollector, QtCore.SIGNAL("round_started"), self.start_round)
      self.connect(self.DataCollector, QtCore.SIGNAL("worker_input_changed"), self.update_worker_input)
      self.connect(self.DataCollector, QtCore.SIGNAL("problem_state_changed"), self.update_problem_state)
      self.connect(self.DataCollector, QtCore.SIGNAL("all_data"), self.update_all)
      self.DataCollector.start()

      # proposition tab
      QtCore.QObject.connect(self.ui.cbxId, QtCore.SIGNAL("currentIndexChanged(int)"), self.cbxId_indexChanged)

      self.paintBox = PaintBox(self.ui.tabProposition)
      sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)
      sizePolicy.setHorizontalStretch(0)
      sizePolicy.setVerticalStretch(0)
      sizePolicy.setHeightForWidth(self.paintBox.sizePolicy().hasHeightForWidth())
      self.paintBox.setSizePolicy(sizePolicy)
      self.ui.gridLayout_4.addWidget(self.paintBox, 1, 0, 1, 1)

      # io tab
      QtCore.QObject.connect(self.ui.btnSend, QtCore.SIGNAL("clicked()"), self.btnSend_clicked)
      QtCore.QObject.connect(self.ui.edtSend, QtCore.SIGNAL("returnPressed()"), self.btnSend_clicked)
示例#2
0
    def __init__(self, parent=None):
        QtGui.QMainWindow.__init__(self, parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        self.nextWorkerInput = ["[]", "1"]
        self.bestPropScore = -1
        self.clear_worker_table()

        self.DataCollector = JsonReader(self)
        self.connect(self.DataCollector, QtCore.SIGNAL("received_data"),
                     self.received)
        self.connect(self.DataCollector, QtCore.SIGNAL("worker_updated"),
                     self.update_worker)
        self.connect(self.DataCollector, QtCore.SIGNAL("round_started"),
                     self.start_round)
        self.connect(self.DataCollector, QtCore.SIGNAL("worker_input_changed"),
                     self.update_worker_input)
        self.connect(self.DataCollector,
                     QtCore.SIGNAL("problem_state_changed"),
                     self.update_problem_state)
        self.connect(self.DataCollector, QtCore.SIGNAL("all_data"),
                     self.update_all)
        self.DataCollector.start()

        # proposition tab
        QtCore.QObject.connect(self.ui.cbxId,
                               QtCore.SIGNAL("currentIndexChanged(int)"),
                               self.cbxId_indexChanged)

        self.paintBox = PaintBox(self.ui.tabProposition)
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding,
                                       QtGui.QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.paintBox.sizePolicy().hasHeightForWidth())
        self.paintBox.setSizePolicy(sizePolicy)
        self.ui.gridLayout_4.addWidget(self.paintBox, 1, 0, 1, 1)

        # io tab
        QtCore.QObject.connect(self.ui.btnSend, QtCore.SIGNAL("clicked()"),
                               self.btnSend_clicked)
        QtCore.QObject.connect(self.ui.edtSend,
                               QtCore.SIGNAL("returnPressed()"),
                               self.btnSend_clicked)
示例#3
0
class MainWindow(QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QMainWindow.__init__(self, parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        self.nextWorkerInput = ["[]", "1"]
        self.bestPropScore = -1
        self.clear_worker_table()

        self.DataCollector = JsonReader(self)
        self.connect(self.DataCollector, QtCore.SIGNAL("received_data"),
                     self.received)
        self.connect(self.DataCollector, QtCore.SIGNAL("worker_updated"),
                     self.update_worker)
        self.connect(self.DataCollector, QtCore.SIGNAL("round_started"),
                     self.start_round)
        self.connect(self.DataCollector, QtCore.SIGNAL("worker_input_changed"),
                     self.update_worker_input)
        self.connect(self.DataCollector,
                     QtCore.SIGNAL("problem_state_changed"),
                     self.update_problem_state)
        self.connect(self.DataCollector, QtCore.SIGNAL("all_data"),
                     self.update_all)
        self.DataCollector.start()

        # proposition tab
        QtCore.QObject.connect(self.ui.cbxId,
                               QtCore.SIGNAL("currentIndexChanged(int)"),
                               self.cbxId_indexChanged)

        self.paintBox = PaintBox(self.ui.tabProposition)
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding,
                                       QtGui.QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.paintBox.sizePolicy().hasHeightForWidth())
        self.paintBox.setSizePolicy(sizePolicy)
        self.ui.gridLayout_4.addWidget(self.paintBox, 1, 0, 1, 1)

        # io tab
        QtCore.QObject.connect(self.ui.btnSend, QtCore.SIGNAL("clicked()"),
                               self.btnSend_clicked)
        QtCore.QObject.connect(self.ui.edtSend,
                               QtCore.SIGNAL("returnPressed()"),
                               self.btnSend_clicked)

    def closeEvent(self, e):
        self.send(json.dumps({'action': 'quit program'}))
        self.DataCollector.terminate(
        )  # TODO: "This function is dangerous and its use is discouraged"
        self.DataCollector.wait()
        e.accept()
        app.exit()

    ###############################
    ##    main menu / buttons    ##
    ###############################

    ## io tab
    def btnSend_clicked(self):
        msg = self.ui.edtSend.text()
        self.send(msg)
        self.ui.edtSend.clear()

    def cbxId_indexChanged(self, idx):
        ## DEBUG
        #sys.stderr.write(">> cbxId_indexChanged %d\n" % idx)
        #sys.stderr.flush()
        self.display_proposition_by_cbxId_index(idx)

    #######################
    ##    JSON events    ##
    #######################

    def update_worker(self, id, proposition, propCaption, propScore,
                      processedScore, problemScore, blocked, working):
        ## DEBUG
        #sys.stderr.write("[json] update_worker:\n")
        #sys.stderr.write("       id         : %s\n" % id)
        #sys.stderr.write("       proposition: %s\n" % proposition)
        #sys.stderr.write("       caption    : %s\n" % propCaption)
        #sys.stderr.write("       score      : %s\n" % propScore)
        #sys.stderr.flush()
        if id in self.worker:
            (workerName, bestProposition, bestPropCaption,
             bestPropScore) = self.worker[id]
            self.worker[id] = (workerName, proposition, propCaption, propScore)
            if (blocked == "no"):
                ## valid proposition: check if better
                if propScore > self.bestPropScore:
                    self.bestPropScore = propScore
                    ## auto switch to best proposition
                    newCbxIndex = self.ui.cbxId.findText(id)
                    if newCbxIndex == self.ui.cbxId.currentIndex():
                        self.display_proposition_by_cbxId_index(newCbxIndex)
                    else:
                        self.ui.cbxId.setCurrentIndex(newCbxIndex)
            else:
                if propScore < 0:
                    ## invalid proposition: find and display the next better proposition
                    if 1 == 1 or self.ui.cbxId.text() == id:
                        nextBestId = id
                        nextBestScore = -1
                        for i in self.worker.keys():
                            (n, p, c, s) = self.worker[i]
                            if s > nextBestScore:
                                nextBestId = i
                                nextBestScore = s
                        self.bestPropScore = nextBestScore
                        ## switch to next better proposition
                        newCbxIndex = self.ui.cbxId.findText(nextBestId)
                        if newCbxIndex == self.ui.cbxId.currentIndex():
                            self.display_proposition_by_cbxId_index(
                                newCbxIndex)
                        else:
                            self.ui.cbxId.setCurrentIndex(newCbxIndex)

    def start_round(self, round):
        ## DEBUG
        #sys.stderr.write("[json] start_round:\n")
        #sys.stderr.write("       round: %s\n" % round)
        #sys.stderr.flush()
        ## activate proposition tab
        self.ui.tabWidget.setCurrentIndex(2)
        self.paintBox.setSquareSize(int(self.nextWorkerInput[1]))
        self.ui.lblInput.setText("<html><body>" + "<p><b>Square: </b>" +
                                 self.nextWorkerInput[1] + "</p>" +
                                 "<p><b>Squares </b>(" +
                                 str(self.nextWorkerInput[0].count(",")) +
                                 ")<b>: </b>" +
                                 self.nextWorkerInput[0].replace(",", ", ") +
                                 "</p></body></html>")
        self.bestPropScore = -1
        self.ui.lblWorker.setText("")
        self.ui.lblScore.setText("")
        for workerId in self.worker.keys():
            (name, proposition, propCaption, propScore) = self.worker[workerId]
            self.worker[workerId] = (name, "[]", "", 0)
        self.paintBox.drawProposition("[]")

    def update_worker_input(self, workerInput):
        ## DEBUG
        #sys.stderr.write("[json] update_worker_input:\n")
        #sys.stderr.write("       workerInput: %s\n" % workerInput)
        #sys.stderr.flush()
        self.nextWorkerInput = workerInput

    def update_problem_state(self, problemState):
        self.ui.lblState.setText(problemState.replace(",", ", "))

    def update_all(self, running, workerList, problemList, problemIdx, round,
                   workerInput, problemState):
        ## DEBUG
        #sys.stderr.write("[json] update_all:\n")
        #sys.stderr.write("       running   : %s\n" % running)
        #sys.stderr.write("       workerList: %s\n" % workerList)
        #sys.stderr.write("       ...\n")
        #sys.stderr.flush()
        self.clear_worker_table()
        for id, name, group, proposition, caption, score, processedScore, problemScore, blocked, working in workerList:
            self.add_worker(id, name, group, proposition, caption, score,
                            processedScore, problemScore, blocked, working)
        self.update_worker_input(workerInput)
        self.update_problem_state(problemState)
        if running:
            self.start_round(round)

    #############################
    ##    private functions    ##
    #############################

    def send(self, msg):
        self.ui.txtRecv.appendHtml(
            "<span style='font-weight:bold;color:red'>send:</span> " +
            escape_html(msg).rstrip("\n").replace("\n", "<br />"))
        print(msg)
        sys.stdout.flush()

    def received(self, msg):
        self.ui.txtRecv.appendHtml(
            "<span style='font-weight:bold;color:blue'>recv:</span> " +
            escape_html(msg).rstrip("\n").replace("\n", "<br />"))

    def clear_worker_table(self):
        self.worker = {}
        self.ui.cbxId.clear()

    def add_worker(self, id, name, group, proposition, propCaption, propScore,
                   processedScore, problemScore, blocked, working):
        self.worker[id] = (name, proposition, propCaption, propScore)
        self.ui.cbxId.clear()
        self.ui.cbxId.addItems(sorted(self.worker.keys()))

    def display_proposition_by_cbxId_index(self, idx):
        ## DEBUG
        #sys.stderr.write(">> display_proposition_by_cbxId_index %d\n" % idx)
        #sys.stderr.flush()
        if idx > -1:
            workerId = str(self.ui.cbxId.itemText(idx))
            if workerId in self.worker:
                ## DEBUG
                #sys.stderr.write(">>                    %s\n" % workerId)
                #sys.stderr.flush()
                (workerName, lastProposition, lastPropCaption,
                 lastPropScore) = self.worker[workerId]
                self.ui.lblWorker.setText(
                    "<html><body><p style='font-size:12pt'><b>" + workerName +
                    "</b></p></body></html>")
                self.ui.lblScore.setText(
                    "<html><body><p style='font-size:12pt'><b>Score: </b>" +
                    str(lastPropScore) + "</p></body></html>")
                self.paintBox.drawProposition(lastProposition)
示例#4
0
文件: gui.py 项目: NobbZ/disco
class MainWindow(QtGui.QMainWindow):

   def __init__(self, parent=None):
      QtGui.QMainWindow.__init__(self, parent)
      self.ui = Ui_MainWindow()
      self.ui.setupUi(self)

      self.nextWorkerInput = ["[]", "1"]
      self.bestPropScore = -1
      self.clear_worker_table()

      self.DataCollector = JsonReader(self)
      self.connect(self.DataCollector, QtCore.SIGNAL("received_data"), self.received)
      self.connect(self.DataCollector, QtCore.SIGNAL("worker_updated"), self.update_worker)
      self.connect(self.DataCollector, QtCore.SIGNAL("round_started"), self.start_round)
      self.connect(self.DataCollector, QtCore.SIGNAL("worker_input_changed"), self.update_worker_input)
      self.connect(self.DataCollector, QtCore.SIGNAL("problem_state_changed"), self.update_problem_state)
      self.connect(self.DataCollector, QtCore.SIGNAL("all_data"), self.update_all)
      self.DataCollector.start()

      # proposition tab
      QtCore.QObject.connect(self.ui.cbxId, QtCore.SIGNAL("currentIndexChanged(int)"), self.cbxId_indexChanged)

      self.paintBox = PaintBox(self.ui.tabProposition)
      sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)
      sizePolicy.setHorizontalStretch(0)
      sizePolicy.setVerticalStretch(0)
      sizePolicy.setHeightForWidth(self.paintBox.sizePolicy().hasHeightForWidth())
      self.paintBox.setSizePolicy(sizePolicy)
      self.ui.gridLayout_4.addWidget(self.paintBox, 1, 0, 1, 1)

      # io tab
      QtCore.QObject.connect(self.ui.btnSend, QtCore.SIGNAL("clicked()"), self.btnSend_clicked)
      QtCore.QObject.connect(self.ui.edtSend, QtCore.SIGNAL("returnPressed()"), self.btnSend_clicked)

   def closeEvent(self, e):
      self.send(json.dumps({'action': 'quit program'}))
      self.DataCollector.terminate() # TODO: "This function is dangerous and its use is discouraged"
      self.DataCollector.wait()
      e.accept()
      app.exit()


   ###############################
   ##    main menu / buttons    ##
   ###############################

   ## io tab
   def btnSend_clicked(self):
      msg = self.ui.edtSend.text()
      self.send(msg)
      self.ui.edtSend.clear()

   def cbxId_indexChanged(self, idx):
      ## DEBUG
      #sys.stderr.write(">> cbxId_indexChanged %d\n" % idx)
      #sys.stderr.flush()
      self.display_proposition_by_cbxId_index(idx)


   #######################
   ##    JSON events    ##
   #######################

   def update_worker(self, id, proposition, propCaption, propScore, processedScore, problemScore, blocked, working):
      ## DEBUG
      #sys.stderr.write("[json] update_worker:\n")
      #sys.stderr.write("       id         : %s\n" % id)
      #sys.stderr.write("       proposition: %s\n" % proposition)
      #sys.stderr.write("       caption    : %s\n" % propCaption)
      #sys.stderr.write("       score      : %s\n" % propScore)
      #sys.stderr.flush()
      if id in self.worker:
         (workerName, bestProposition, bestPropCaption, bestPropScore) = self.worker[id]
         self.worker[id] = (workerName, proposition, propCaption, propScore)
         if (blocked == "no"):
            ## valid proposition: check if better
            if propScore > self.bestPropScore:
               self.bestPropScore = propScore
               ## auto switch to best proposition
               newCbxIndex = self.ui.cbxId.findText(id)
               if newCbxIndex == self.ui.cbxId.currentIndex():
                  self.display_proposition_by_cbxId_index(newCbxIndex)
               else:
                  self.ui.cbxId.setCurrentIndex(newCbxIndex)
         else:
            if propScore < 0:
               ## invalid proposition: find and display the next better proposition
               if 1 == 1 or self.ui.cbxId.text() == id:
                  nextBestId = id
                  nextBestScore = -1
                  for i in self.worker.keys():
                     (n, p, c, s) = self.worker[i]
                     if s > nextBestScore:
                        nextBestId = i
                        nextBestScore = s
                  self.bestPropScore = nextBestScore
                  ## switch to next better proposition
                  newCbxIndex = self.ui.cbxId.findText(nextBestId)
                  if newCbxIndex == self.ui.cbxId.currentIndex():
                     self.display_proposition_by_cbxId_index(newCbxIndex)
                  else:
                     self.ui.cbxId.setCurrentIndex(newCbxIndex)

   def start_round(self, round):
      ## DEBUG
      #sys.stderr.write("[json] start_round:\n")
      #sys.stderr.write("       round: %s\n" % round)
      #sys.stderr.flush()
      ## activate proposition tab
      self.ui.tabWidget.setCurrentIndex(2)
      self.paintBox.setSquareSize(int(self.nextWorkerInput[1]))
      self.ui.lblInput.setText("<html><body>"
                               + "<p><b>Square: </b>" + self.nextWorkerInput[1] + "</p>"
                               + "<p><b>Squares </b>(" + str(self.nextWorkerInput[0].count(",")) + ")<b>: </b>" + self.nextWorkerInput[0].replace(",", ", ") + "</p></body></html>")
      self.bestPropScore = -1
      self.ui.lblWorker.setText("")
      self.ui.lblScore.setText("")
      for workerId in self.worker.keys():
         (name, proposition, propCaption, propScore) = self.worker[workerId]
         self.worker[workerId] = (name, "[]", "", 0)
      self.paintBox.drawProposition("[]")

   def update_worker_input(self, workerInput):
      ## DEBUG
      #sys.stderr.write("[json] update_worker_input:\n")
      #sys.stderr.write("       workerInput: %s\n" % workerInput)
      #sys.stderr.flush()
      self.nextWorkerInput = workerInput

   def update_problem_state(self, problemState):
      self.ui.lblState.setText(problemState.replace(",", ", "))

   def update_all(self, running, workerList, problemList, problemIdx, round, workerInput, problemState):
      ## DEBUG
      #sys.stderr.write("[json] update_all:\n")
      #sys.stderr.write("       running   : %s\n" % running)
      #sys.stderr.write("       workerList: %s\n" % workerList)
      #sys.stderr.write("       ...\n")
      #sys.stderr.flush()
      self.clear_worker_table()
      for id, name, group, proposition, caption, score, processedScore, problemScore, blocked, working in workerList:
         self.add_worker(id, name, group, proposition, caption, score, processedScore, problemScore, blocked, working)
      self.update_worker_input(workerInput)
      self.update_problem_state(problemState)
      if running:
         self.start_round(round)


   #############################
   ##    private functions    ##
   #############################

   def send(self, msg):
      self.ui.txtRecv.appendHtml("<span style='font-weight:bold;color:red'>send:</span> "
                                 + escape_html(msg).rstrip("\n").replace("\n","<br />"))
      print(msg)
      sys.stdout.flush()

   def received(self, msg):
      self.ui.txtRecv.appendHtml("<span style='font-weight:bold;color:blue'>recv:</span> "
                                 + escape_html(msg).rstrip("\n").replace("\n","<br />"))

   def clear_worker_table(self):
      self.worker = {}
      self.ui.cbxId.clear()

   def add_worker(self, id, name, group, proposition, propCaption, propScore, processedScore, problemScore, blocked, working):
      self.worker[id] = (name, proposition, propCaption, propScore)
      self.ui.cbxId.clear()
      self.ui.cbxId.addItems(sorted(self.worker.keys()))

   def display_proposition_by_cbxId_index(self, idx):
      ## DEBUG
      #sys.stderr.write(">> display_proposition_by_cbxId_index %d\n" % idx)
      #sys.stderr.flush()
      if idx > -1:
         workerId = str(self.ui.cbxId.itemText(idx))
         if workerId in self.worker:
            ## DEBUG
            #sys.stderr.write(">>                    %s\n" % workerId)
            #sys.stderr.flush()
            (workerName, lastProposition, lastPropCaption, lastPropScore) = self.worker[workerId]
            self.ui.lblWorker.setText("<html><body><p style='font-size:12pt'><b>" + workerName + "</b></p></body></html>")
            self.ui.lblScore.setText("<html><body><p style='font-size:12pt'><b>Score: </b>" + str(lastPropScore) + "</p></body></html>")
            self.paintBox.drawProposition(lastProposition)