首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python自动通过网络同步表

Python自动通过网络同步表
EN

Stack Overflow用户
提问于 2014-04-28 05:27:30
回答 1查看 125关注 0票数 0

我有两个程序,都有一个QTableWidget。我想通过网络自动同步表。我不知道该怎么做。我用过带套接字的pyqt,它不工作。我读了很多关于simple chat application like this的书。我认为这不是我需要的方式。

我的程序没有任何网络代码:

代码语言:javascript
复制
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_())
EN

回答 1

Stack Overflow用户

发布于 2014-04-28 12:06:53

我建议将QTable更改为使用模型而不是项。参考here获取一个基于列表列表的示例,该列表应该很容易更改为字典列表(如果您选择)。

下面的代码使用JSON和ZeroMQ对字典进行JSON序列化,并将其推送到侦听器以在此基础上更新字典。

代码语言:javascript
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23329214

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档