我有一台液晶显示器用于显示我在XBMC上观看的电影的时间码,我想显示当前没有播放的日期和时间。托管LCD的机器正在运行python TCPSocketServer 服务器,接收要从我的XBMC安装中显示的文本。问题是我必须保持活动的网络连接,以便XBMC可以通过套接字发送小时和日期,LCD可以显示它。 在我看来,最好的办法是显示托管LCD的机器的日期,然后切换到"时间码视图"当套接字处于活动状态时。
是否有任何" pythonic" 方式设置TCPSocketServer,计算循环以在等待连接时显示日期,然后更改其行为以计算通过套接字?
非常感谢提前
答案 0 :(得分:0)
这里有一些代码可以满足您的需求。它启动一个TCP服务器,监听发送到端口9876的文本。当它获得一些文本时,它将它发送到Display对象。该代码还设置了一个每秒运行一次的计时器,将“空闲文本”(即:当前时间戳)发送到显示对象。
显示器获取正常的更新文本(来自服务器),以及来自第二个线程的“空闲文本”。该对象知道自获得一些真实文本以来已经存在多长时间,并显示一条或另一条消息。
如果显示对象已连接到硬件,则可以使用multiprocessing.RLock
或其他机制来保护自己。
玩得开心!
import signal, SocketServer, threading, time
class Display(object):
IDLE_TIME = 5 # seconds
def __init__(self):
self.updated = None
self.write('Hello')
def _write(self, arg):
print 'DISPLAY:', arg
def write(self, arg):
"""
update display and 'last updated' timestamp
"""
self._write(arg)
self.updated = time.time()
def idle(self, arg):
"""
update display only if it's been a few seconds
"""
if time.time() - self.updated >= self.IDLE_TIME:
self._write(arg)
class DisplayHandler(SocketServer.BaseRequestHandler):
DisplayObj = None # class var
def handle(self):
text = self.request.recv(1024).strip()
print "{} wrote: {}".format(
self.client_address[0], text,
)
# send text to LCD immediately
self.DisplayObj.write(text)
def check_idle(display_obj):
"""
update display with current time if it's idle
"""
while True:
display_obj.idle(
time.strftime('time: %H:%M:%S'),
)
time.sleep(1)
def start_server(host, port):
"""
start (single threaded) server
"""
SocketServer.TCPServer(
(host, port),
DisplayHandler,
).serve_forever()
def main(host, port):
display = Display()
# store global display obj so Handler can get to it
DisplayHandler.DisplayObj = display
print 'serving on {}:{}'.format(host, port)
print 'Example: echo beer | nc localhost {}'.format(port)
print
server_t = threading.Thread(
target=start_server, args=(host, port)
)
server_t.daemon = True
server_t.start()
idle_t = threading.Thread(
target=check_idle, args=[display],
)
idle_t.daemon = True
idle_t.start()
# wait for control-C to interrupt
try:
signal.pause()
except KeyboardInterrupt:
pass
if __name__ == "__main__":
main("localhost", 9876)
在这里我启动了服务器,等了几秒钟,然后键入fortune -s | nc localhost 9876
向我的LCD服务器发送一个短的幸运饼干。
注意“空闲计时器”在:07
处停止,输出幸运饼干,等待五秒钟,然后继续:13
,:14
。在切换回空闲时间戳之前,消息显示五秒钟。
python ./lcdcontrol.py
DISPLAY: Hello
serving on localhost:9876
Example: echo beer | nc localhost 9876
DISPLAY: time: 13:08:06
DISPLAY: time: 13:08:07
127.0.0.1 wrote: Some people need a good imaginary cure for their painful imaginary ailment.
DISPLAY: Some people need a good imaginary cure for their painful imaginary ailment.
DISPLAY: time: 13:08:13
DISPLAY: time: 13:08:14
DISPLAY: time: 13:08:15
DISPLAY: time: 13:08:16