2014-04-27 37 views
0

我有兩個程序都帶有QTableWidget。我想通過網絡自動同步這些表格。我不知道如何做到這一點。我用套接字pyqt它不工作。我讀了很多關於simple chat application like this。我認爲這不是我需要的方式。Python通過網絡自動同步表格

我沒有任何網絡代碼的程序:

import sys 
from PyQt4 import QtGui, QtCore 

class Window(QtGui.QMainWindow): 
    def __init__(self, parent=None): 

     QtGui.QMainWindow.__init__(self, parent) 

     # Table 
     header = ["Name", "Date", "Club"] 

     self.Table = QtGui.QTableWidget(0, len(header)) 
     self.Table.setHorizontalHeaderLabels(header) 
     self.Table.resizeColumnsToContents() 

     # Layout 
     layout = QtGui.QGridLayout() 
     layout.addWidget(self.Table) 

     self.tab_widget = QtGui.QTabWidget() 
     self.tab_widget.updatesEnabled() 

     tabs = [u"Overview"] 
     for i,d in enumerate(tabs): 
      widget = QtGui.QWidget() 
      self.tab_widget.addTab(widget, d) 
      print i, d 
      if i == 0: 
       widget.setLayout(layout) 

     self.setCentralWidget(self.tab_widget) 
     self.show() 

     data = ["Name1", "Monday", "Club1"] 

     self.Table.insertRow(0) 

     # insert Data 
     for i in range(len(data)): 

      t = QtGui.QTableWidgetItem(data[i].decode("utf8")) 
      self.Table.setItem(0, i, t) 

     self.Table.resizeColumnsToContents()      

if __name__ == '__main__': 
    app = QtGui.QApplication(sys.argv) 
    prog = Window() 
    prog.show() 
    sys.exit(app.exec_()) 
+0

我的東西,代碼是在第4行,其中是「..:def __init__」壞了,請更正它。即使它有效,通常也不會在Python中的「:」之後放置任何代碼,這會使代碼更具可讀性。 –

+0

您正計劃通過網絡同步某些內容的狀態。你應該首先明確一般邏輯 - 你打算使用主從角色嗎?或者你打算允許兩個表上的更新?這可能相當複雜。你目前的問題現在太廣泛了。 –

回答

0

我建議改變QTable與模型,而不是項目工作。請參閱here,該示例基於列表清單,應易於更改爲詞典列表(如果您選擇)。

下面的代碼將JSON和ZeroMQ用於JSON序列化字典,並將它們推送給偵聽器以更新該端的字典。

import json 
import time 
import threading 
import zmq 

class push_to(object): 
    def __init__(self, address, *args, **kwargs): 
     context = zmq.Context() 

     # Socket to send messages to 
     self.sender = context.socket(zmq.PAIR) 
     self.sender.connect(address) 

    def __call__(self, send_str, *args, **kwargs): 
     self.sender.send_string(send_str) 

class own_listener(threading.Thread): 
    def __init__(self, parent, address, *args, **kwargs): 
     self.parent = parent 

     context = zmq.Context() 

     # Socket to receive messages from 
     self.receiver = context.socket(zmq.PAIR) 
     self.receiver.bind(address) 
     super(own_listener, self).__init__(*args, **kwargs) 
     self.daemon = True 

    def run(self): 
     while True: 
      message = self.receiver.recv() 
      self.parent.change_receive(message) 

class pub_sub_dict(dict): 
    def __init__(self, address, *args, **kwargs): 
     self.address = address 
     self.listeners = [] 
     self.is_listen = False 
     super(pub_sub_dict, self).__init__(*args, **kwargs) 
     self.own_listener = own_listener(self, address) 
     self.own_listener.start() 

    def __setitem__(self, key, value, *args, **kwargs): 
     if not self.is_listen: 
      self.change_send({key : value}) 
     super(pub_sub_dict, self).__setitem__(key, value, *args, **kwargs) 

    def update(self, value, *args, **kwargs): 
     if not self.is_listen: 
      self.change_send(value) 
     super(pub_sub_dict, self).update(value, *args, **kwargs) 

    def change_send(self, idict): 
     json_str = json.JSONEncoder().encode(idict) 
     for listener in self.listeners: 
      listener(json_str) 

    def change_receive(self, json_str): 
     self.is_listen = True 
     state = json.JSONDecoder().decode(json_str) 
     self.update(state) 
     self.is_listen = False 

a = pub_sub_dict("tcp://127.0.0.1:5556") 
b = pub_sub_dict("tcp://127.0.0.1:5557") 
c = pub_sub_dict("tcp://127.0.0.1:5558") 

a.listeners.append(push_to(b.address)) 
a.listeners.append(push_to(c.address)) 
b.listeners.append(push_to(a.address)) 

print "a:", a 
print "b:", b 
print "c:", c 
time.sleep(1) 
a["test"] = "test string 1" 
print "a:", a 
print "b:", b 
print "c:", c 
time.sleep(1) 
b["test"] = "test string 2" 
print "a:", a 
print "b:", b 
print "c:", c 
time.sleep(1)