2017-11-19 5 views
0

私はpyqt5でGUIを作っていて、qlcdnumberを使って、Androidアプリケーションからソケットサーバーを通して取得する変数を表示しています。 問題は、qlcdnumberにある変数を表示する方法が見つからないということです。グローバル変数の変更を検出する

ここはUIコードですが、信号を使用しようとしましたが機能しませんでした。

class MyTCPHandler(socketserver.StreamRequestHandler): 
    def handle(self): 
     while True: 
      global angle, strength ,speed, a 
      if(not enabled): 
       # self.rfile is a file-like object created by the handler; 
       # we can now use e.g. readline() instead of raw recv() calls 
       self.data = self.rfile.readline().strip() 
       if(a==0): 
        print("{} wrote:".format(self.client_address[0])) 
        a+=1 
       data = self.data.decode("utf-8").rstrip().strip("\n") 
       if(data!= ""): 
        if(data == "disconnect"): 
         print("restarting") 
         self.close() 
         sleep(1) 
         mainServer() 
        elif(data == "shutdown"): 
         p = subprocess.Popen("sudo shutdown -h now", shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 
         print(p) 
        else:  
         temp = data.split(":") 
         angle = int(temp[0]) 
         strength = int(temp[1]) 
         speed = float(temp[2]) 


class Ui_AppWindow(QtWidgets.QWidget): 

    def __init__(self): 
     super(Ui_AppWindow, self).__init__() 
     self.setStyleSheet('background-color:#efefef; color:white;') 
     global add, angle, speed 

     self.layout = QtWidgets.QVBoxLayout() 

     self.label = QtWidgets.QLabel("\t\t"+add) 
     self.label.setStyleSheet("color: #005C99;") 
     self.layout.addWidget(self.label) 

     palette = QtGui.QPalette() 
     palette.setColor(palette.WindowText, QtGui.QColor(85, 85, 255)) 
     palette.setColor(palette.Background, QtGui.QColor(0, 170, 255)) 
     palette.setColor(palette.Light, QtGui.QColor(0, 92, 153)) 
     palette.setColor(palette.Dark, QtGui.QColor(0, 92, 137)) 

     self.speed = QtWidgets.QLCDNumber(self) 
     self.speed.setGeometry(QtCore.QRect(100, 100, 64, 23)) 
     self.speed.setObjectName("speed") 
     self.speed.display(speed) 
     self.speed.setPalette(palette) 

     self.angle = QtWidgets.QLCDNumber(self) 
     self.angle.setGeometry(QtCore.QRect(200, 100, 64, 23)) 
     self.angle.setObjectName("angle") 
     self.angle.display(angle) 
     self.angle.setPalette(palette) 

     self.speed_lable = QtWidgets.QLabel("Speed") 
     self.speed_lable.setGeometry(QtCore.QRect(100, 70, 47, 25)) 
     self.speed_lable.setObjectName("speed_lable") 
     self.speed_lable.setStyleSheet('color:#00497a;') 

     self.angle_lable = QtWidgets.QLabel("Angle") 
     self.angle_lable.setGeometry(QtCore.QRect(200, 70, 47, 25)) 
     self.angle_lable.setObjectName("angle_lable") 
     self.angle_lable.setStyleSheet('color:#00497a;') 

     self.hbl = QtWidgets.QHBoxLayout() 
     self.hbl.addWidget(self.speed_lable) 
     self.hbl.addWidget(self.angle_lable) 
     self.layout.addLayout(self.hbl) 

     self.hb = QtWidgets.QHBoxLayout() 
     self.hb.addWidget(self.speed) 
     self.hb.addWidget(self.angle) 
     self.layout.addLayout(self.hb) 

     self.setWindowTitle("RasControl GUI: Android Control") 
     self.setLayout(self.layout) 
     self.setGeometry(100, 100, 400, 200) 


    def setAngle(self): 
     global angle 
     self.angle.display(angle)   

    def setSpeed(self): 
     global speed 
     self.speed.display(speed) 

と私には、qlcdnumberに表示するように設定する変数があります。

global speed, angle 
server = socketserver.TCPServer((ip, port), MyTCPHandler) 
server.serve_forever() 

とUi_AppWindow GUIを呼び出すメインGUIイム内側に、しかし、私はqlcdnumberは、グローバル変数の速度と角度の値は、それらが変更されるたびに更新する必要があります。

+0

あなたのコードは奇妙である、私はGUIを参照してくださいが、速度と角度のようなデータをどこから得るのかわかりません。 – eyllanesc

+0

私はアンドロイドアプリケーションからソケットサーバーを介してそれらを取得し、グローバル変数に設定しました。私は編集してコードを追加しました。 – medyas

+0

グローバル変数は、あなたが何かを得ることができないように、私はあなたを助けることができるコードを再現することができます。 – eyllanesc

答えて

0

ので、同じようにこれを行う最も簡単な方法は、単に、常にあなたのプログラム内のグローバル変数の値を設定するために使用される関数を作るためになります

def set_speed(val): 
    global speed 
    speed = val 
    # ... whatever other logic you'd like to perform 

def set_angle(val): 
    # ... 
+0

私はセッターを必要としません。私は各変数の値の変化を検出し、新しい値でqlcdnumberを更新する必要があります。 – medyas

関連する問題