我正在用Python写一个简单的程序。我希望类RequestHandler
和GUI类同时在单独的线程中运行,并且已经在RequestHandler中生成的消息(经常在GUI中显示(在每个post请求中将生成一条或两条消息))中显示。这里遵循我的代码的简化版本:带GUI GUI的ThreadedHTTPServer不是在python中写的
import web
import io,json
from SocketServer import ThreadingMixIn
from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler
urls = ('/', 'RequestHandler')
from time import sleep
import threading
from Tkinter import *
serialdata = []
data = True
msguser = ''
class RequestHandler(BaseHTTPRequestHandler):
def do_POST(self):
length = int(self.headers['Content-length'])
mylogs=self.rfile.readline(length)
val= json.loads(mylogs)
if val['RunningApp'].find('viber') >= 0:
msguser = 'viber is running on Devise ID:',val['DeviceID'],'in time:',val['timestamp']
serialdata.append(msguser)
if val['RunningApp'].find('telegram.messenger') >= 0:
msguser = 'Telegram is running on Devise ID:',val['DeviceID'],'in time:',val['timestamp']
serialdata.append(msguser)
class ThreadedHTTPServer(ThreadingMixIn, HTTPServer):
pass
class Gui(object):
def __init__(self):
self.root = Tk()
self.lbl = Label(self.root, text="")
self.updateGUI()
self.readSensor()
def run(self):
self.lbl.pack()
self.lbl.after(1000, self.updateGUI)
self.root.mainloop()
def updateGUI(self):
msg = "Data is True" if data else "Data is False"
self.lbl["text"] = msg
self.root.update()
self.lbl.after(1000, self.updateGUI)
def readSensor(self):
self.lbl["text"] = serialdata[-1]
self.root.update()
self.root.after(527, self.readSensor)
if __name__ == "__main__":
server = ThreadedHTTPServer(('X.X.X.X', 1024), RequestHandler)
print 'Starting server, use <Ctrl-C> to stop'
Gui().run()
server.serve_forever()
当我运行它,我得到错误:self.lbl["text"] = serialdata[-1] IndexError: list index out of range
还当我给了self.lbl["text"]
像一个静态字符串“新事件收到”
程序不像多线程一样工作,直到GUI运行,从不运行和工作。
可否请你的代码剥离下来到最低工作实例?缺少导入(例如Tk,ThreadingMixIn),您正在使用未定义的变量(例如数据和串行数据)等。您不帮助我们帮助您!对于你的具体错误,第一个可能意味着'serialdata'是空的(即'len(serialdata)== 0')。第二个可能是因为'Gui()。run()'是一个阻塞调用(它不返回),所以你的代码永远不会调用'server.serve_forever()'。您应该查看['multiprocessing'模块](https://docs.python.org/2/library/multiprocessing.html) – jorgeh
抱歉,出现错误,我现在编辑我的代码,请告诉我该怎么做更改我的代码以解决我的问题并正确运行。 – sonia