Created
February 10, 2014 05:55
-
-
Save bluebat/8910986 to your computer and use it in GitHub Desktop.
GUI for manipulating TopBox
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/python | |
#coding:utf-8 | |
import sys, string, telnetlib, gettext | |
from qt import * | |
gettext.install("topbox") | |
chrBegin = "*" | |
chrEnd = chr(252) | |
chrBroadcast = chr(32) | |
class MainWindow(QMainWindow): | |
def __init__(self, *args): | |
QMainWindow.__init__(self, *args) | |
self.host = "192.168.168.62" | |
self.port = "100" | |
self.password = "" | |
self.itemcount = 7 | |
self.itemno = 1 | |
self.degree = u"℃" | |
self.socket = Socket() | |
self.node = [] | |
for i in range(self.itemcount+1): | |
self.node.append(Node()) | |
self.startTimer(1000) | |
self.mainBox = QVBox(self) | |
self.mainBox.setMargin(5) | |
self.mainBox.setSpacing(5) | |
self.topBox = QHBox(self.mainBox) | |
self.topBox.setMargin(3) | |
self.topBox.setSpacing(5) | |
# self.topBox.setFrameStyle(QFrame.Panel|QFrame.Raised) | |
self.topBox.setLineWidth(2) | |
self.middleBox = QHBox(self.mainBox) | |
self.middleBox.setMargin(3) | |
self.middleBox.setSpacing(5) | |
# self.middleBox.setFrameStyle(QFrame.Panel|QFrame.Plain) | |
self.middleBox.setLineWidth(0) | |
self.bottomBox = QHBox(self.mainBox) | |
self.bottomBox.setMargin(3) | |
self.bottomBox.setSpacing(5) | |
# self.bottomBox.setFrameStyle(QFrame.Panel|QFrame.Raised) | |
self.bottomBox.setLineWidth(2) | |
self.hostLabel = QLabel(_(u"IP 位址:"), self.topBox) | |
self.hostLineEdit = QLineEdit(self.host, "000.000.000.000", self.topBox) | |
self.portLabel = QLabel(_(u"Port:"), self.topBox) | |
self.portLineEdit = QLineEdit(self.port, "000", self.topBox) | |
self.portLineEdit.setMaximumWidth(50) | |
self.passwordLabel = QLabel(_(u"密碼:"), self.topBox) | |
self.passwordLineEdit = QLineEdit(self.topBox) | |
self.passwordLineEdit.setEchoMode(QLineEdit.Password) | |
self.connectPushButton = QPushButton(_(u"連線(&L)"), self.topBox) | |
self.connect(self.connectPushButton, SIGNAL("clicked()"), self.connectSlot) | |
self.nodeListView = QListView(self.middleBox) | |
self.nodeListView.setMultiSelection(False) | |
self.nodeListView.setMaximumWidth(100) | |
self.nodeListView.addColumn("#", 20) | |
self.nodeListView.addColumn(_(u"結點名稱"), 75) | |
self.nodeListView.setAllColumnsShowFocus(True) | |
self.nodeListViewItem = [] | |
for i in range(self.itemcount): | |
self.nodeListViewItem.append(QListViewItem(self.nodeListView)) | |
self.nodeListViewItem[i].setText(0, str(i+1)) | |
self.nodeListViewItem[i].setText(1, str(i+1)+_(u"號機")) | |
self.connect(self.nodeListView, SIGNAL("clicked(QListViewItem*)"), self.selectSlot) | |
self.nodeListViewItem[0].setSelected(True) | |
self.nodeListView.setEnabled(False) | |
self.nodeTabWidget = QTabWidget(self.middleBox) | |
self.sensorBox = QVBox(self.nodeTabWidget) | |
self.sensorBox.setMargin(6) | |
self.sensorBox.setSpacing(5) | |
self.valueGrid = QGrid(4, self.sensorBox) | |
self.valueGrid.setMargin(3) | |
self.valueGrid.setSpacing(5) | |
self.cpu1Label = QLabel(_(u"CPU(1)溫度:"), self.valueGrid) | |
self.cpu1LineEdit = QLineEdit(self.valueGrid) | |
self.cpu1LineEdit.setMaximumWidth(60) | |
self.cpu2Label = QLabel(_(u"CPU(2)溫度:"), self.valueGrid) | |
self.cpu2LineEdit = QLineEdit(self.valueGrid) | |
self.cpu2LineEdit.setMaximumWidth(60) | |
self.fan1Label = QLabel(_(u"FAN(1)溫度:"), self.valueGrid) | |
self.fan1LineEdit = QLineEdit(self.valueGrid) | |
self.fan1LineEdit.setMaximumWidth(60) | |
self.fan2Label = QLabel(_(u"FAN(2)溫度:"), self.valueGrid) | |
self.fan2LineEdit = QLineEdit(self.valueGrid) | |
self.fan2LineEdit.setMaximumWidth(60) | |
self.actionGroup = QVButtonGroup(u"動作", self.sensorBox) | |
self.resetCheckBox = QCheckBox(_(u"電腦重新啟動"), self.actionGroup) | |
self.computerCheckBox = QCheckBox(_(u"電腦硬體停止"), self.actionGroup) | |
self.powerCheckBox = QCheckBox(_(u"電源強制開關"), self.actionGroup) | |
self.otherCheckBox = QCheckBox(_(u"動作未定義"), self.actionGroup) | |
self.connect(self.actionGroup, SIGNAL("clicked(int)"), self.actionSlot) | |
self.nodeTabWidget.addTab(self.sensorBox, _(u"感測開關(&S)")) | |
self.comTextEdit = QTextEdit(self.nodeTabWidget) | |
self.comTextEdit.setTextFormat(QTextEdit.LogText) | |
self.comTextEdit.setFont(QFont("AR PL Mingti2L Big5", 9)) | |
self.comTextEdit.setPaletteBackgroundColor(QColor("Black")) | |
self.comTextEdit.setPaletteForegroundColor(QColor("White")) | |
self.comTextEdit.setWordWrap(QTextEdit.FixedColumnWidth) | |
self.comTextEdit.setWrapColumnOrWidth(80) | |
self.comTextEdit.setWrapPolicy(QTextEdit.Anywhere) | |
self.nodeTabWidget.addTab(self.comTextEdit, _(u"序列輸出(&O)")) | |
self.nodeTabWidget.setEnabled(False) | |
self.aboutPushButton = QPushButton(_(u"關於(&A)"), self.bottomBox) | |
self.setupPushButton = QPushButton(_(u"設定(&C)"), self.bottomBox) | |
self.quitPushButton = QPushButton(_(u"離開(&Q)"), self.bottomBox) | |
self.connect(self.aboutPushButton, SIGNAL("clicked()"), self.aboutSlot) | |
self.connect(self.setupPushButton, SIGNAL("clicked()"), self.setupSlot) | |
self.connect(self.quitPushButton, SIGNAL("clicked()"), self, SLOT("close()")) | |
self.setCaption("TopBox") | |
self.setFont(QFont("Sans", 12)) | |
self.setCentralWidget(self.mainBox) | |
self.resize(620, 460) | |
def connectSlot(self): | |
if self.socket.connected: | |
self.socket.close() | |
self.socket.connected = False | |
else: | |
try: | |
self.socket.connect(self.host, int(self.port)) | |
except: | |
QMessageBox.warning(self, _(u"警告訊息"), _(u"<h3>無法連線!請查明原因後再試。</h3>"), _(u"關閉(&C)"), "", "", 0, 0) | |
self.socket.connected = False | |
else: | |
self.socket.connected = True | |
self.socket.send(self.password) | |
self.socket.send(chrBegin+chrBroadcast+chrEnd) | |
self.passwordLineEdit.clear() | |
if self.socket.connected: | |
self.connectPushButton.setText(_(u"斷線(&D)")) | |
self.hostLineEdit.setEnabled(False) | |
self.portLineEdit.setEnabled(False) | |
self.passwordLineEdit.setEnabled(False) | |
self.setupPushButton.setEnabled(False) | |
self.quitPushButton.setEnabled(False) | |
self.nodeListView.setEnabled(True) | |
self.nodeTabWidget.setEnabled(True) | |
else: | |
self.connectPushButton.setText(_(u"連線(&L)")) | |
self.hostLineEdit.setEnabled(True) | |
self.portLineEdit.setEnabled(True) | |
self.passwordLineEdit.setEnabled(True) | |
self.setupPushButton.setEnabled(True) | |
self.quitPushButton.setEnabled(True) | |
self.nodeListView.setEnabled(False) | |
self.nodeTabWidget.setEnabled(False) | |
def selectSlot(self, listitem): | |
if listitem: | |
self.itemno = listitem.text(0).toInt()[0] | |
self.socket.send(chrBegin+chrBroadcast+chrEnd) | |
def timerEvent(self, ev): | |
if self.socket.connected: | |
msg = self.socket.text + self.socket.recv() | |
if len(msg) > 0 and msg[-1] == chrEnd: | |
self.socket.text = "" | |
msg = msg[1:-1] | |
elif len(msg) > 0: | |
self.socket.text = msg | |
msg = "" | |
else: | |
msg = "" | |
if msg != "": | |
for m in string.split(msg,chrEnd+chrBegin): | |
n = ord(m[0]) | |
print n,m | |
if m[1] == "@" and len(m) == 13: | |
self.node[n].temperature = string.split(m[2:]) | |
elif m[1:3] == "@R" and len(m) == 7: | |
self.node[n].relay = m[3:] | |
else: | |
# self.node[1].text = self.node[1].text + msg | |
self.node[n].text = self.node[n].text + m[1:] | |
self.comTextEdit.setText(self.node[self.itemno].text) | |
self.cpu1LineEdit.setText(self.node[self.itemno].temperature[0] + self.degree) | |
self.cpu2LineEdit.setText(self.node[self.itemno].temperature[1] + self.degree) | |
self.fan1LineEdit.setText(self.node[self.itemno].temperature[2] + self.degree) | |
self.fan2LineEdit.setText(self.node[self.itemno].temperature[3] + self.degree) | |
self.resetCheckBox.setChecked(self.node[self.itemno].relay[0]=="1") | |
self.computerCheckBox.setChecked(self.node[self.itemno].relay[1]=="1") | |
self.powerCheckBox.setChecked(self.node[self.itemno].relay[2]=="1") | |
self.otherCheckBox.setChecked(self.node[self.itemno].relay[3]=="1") | |
def actionSlot(self, act): | |
relay = self.node[self.itemno].relay | |
if act == 0: | |
relay = str(int(self.resetCheckBox.isChecked()))+relay[1:] | |
elif act == 1: | |
relay = relay[0:1]+str(int(self.computerCheckBox.isChecked()))+relay[2:] | |
elif act == 2: | |
relay = relay[0:2]+str(int(self.powerCheckBox.isChecked()))+relay[3:] | |
elif act == 3: | |
relay = relay[0:3]+str(int(self.otherCheckBox.isChecked())) | |
self.node[self.itemno].relay = relay | |
self.socket.send(chrBegin+chr(self.itemno)+"@"+relay+chrEnd) | |
def aboutSlot(self): | |
QMessageBox.information(self, _(u"關於 TopBox"), _(u"<h3><tt><b>TopBox 0.1</b></tt><hr>操控 TopBox 硬體的圖形介面<br><tt>Copyright © 2004</tt></h3>"), _(u"關閉(&C)")) | |
def setupSlot(self): | |
setupDialog = QTabDialog(self) | |
setupDialog.setCaption(_(u"設定")) | |
setupDialog.setOkButton(_(u"確定")) | |
setupDialog.setCancelButton(_(u"取消")) | |
setupDialog.generalBox = QVBox() | |
setupDialog.generalBox.setMargin(5) | |
setupDialog.generalBox.setSpacing(5) | |
setupDialog.addTab(setupDialog.generalBox, _(u"一般")) | |
setupDialog.nodeBox = QHBox(setupDialog.generalBox) | |
setupDialog.nodeLabel = QLabel(_(u"結點上限:"), setupDialog.nodeBox) | |
setupDialog.nodeLineEdit = QLineEdit(str(self.itemcount), "00", setupDialog.nodeBox) | |
if setupDialog.exec_loop() == QDialog.Accepted: | |
self.itemcount = setupDialog.nodeLineEdit.text().toInt() | |
def quitSlot(self): | |
self.close() | |
class Socket: | |
def __init__(self): | |
self.connected = False | |
self.text = "" | |
def connect(self, host, port): | |
self.sock = telnetlib.Telnet() | |
self.sock.open(host, port) | |
def send(self, msg): | |
if self.connected: | |
self.sock.write(msg) | |
def recv(self): | |
msg = self.sock.read_eager() | |
return msg | |
def close(self): | |
self.sock.close() | |
class TestSocket: | |
def __init__(self): | |
self.connected = False | |
self.text = "" | |
def connect(self, host, port): | |
pass | |
def send(self, msg): | |
if self.connected: | |
pass | |
def recv(self): | |
msg = chrBegin+chr(1)+"@30 40 50 60"+chrEnd+chrBegin+chr(1)+"123"+chrEnd+chrBegin+chr(1)+"abc\n"+chrEnd+chrBegin+chr(1)+"@R1010"+chrEnd+"" | |
return msg | |
def close(self): | |
pass | |
class Node: | |
def __init__(self): | |
self.temperature = ["00", "00", "00", "00"] | |
self.relay = "0000" | |
self.text = "" | |
if __name__ == "__main__": | |
application = QApplication(sys.argv) | |
mainWindow = MainWindow() | |
mainWindow.show() | |
application.setStyle(QPlatinumStyle()) | |
application.setMainWidget(mainWindow) | |
application.connect(application, SIGNAL("lastWindowClosed()"), application, SLOT("quit()")) | |
application.exec_loop() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment