打算写个自动回复的聊天室

cquptzzq 2014-05-08 09:58:24
就是根据client输入的结果,到server中连接数据库,匹配并输出结果。界面用的是tkinter,数据库mysql,为什么无法输出单个数据?
有问题的代码:
#发送消息
def sendMessage(self):
try:
global databaseReturn
global reveiveMsg
except:
self.chatText.insert(Tkinter.END,' ' + "error-2" + '\n')
con = mdb.connect(host='127.0.0.1',user='root',passwd='n5252n59',db='python')
with con:
cur = con.cursor()
cur.execute("SELECT answer FROM data WHERE question=%s",receiveMsg)
try:
#global databaseReturn
databaseReturn = cur.fetchone()[cur.rowcount-1]#这句为什么有问题,单写了一个程序输出没问题啊
theTime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())
self.chatText.insert(Tkinter.END,"服务器"+theTime+"说:\n")
try:
self.chatText.insert(Tkinter.END,databaseReturn) #不知为什么无法输出???
except:
self.chatText.insert(Tkinter.END,' ' + 'error0' + '\n')
if self.flag == True:
self.connection.send(databaseReturn)
else:
self.chatText.insert(Tkinter.END,'您还未与客户端建立连接,客户端无法收到您的消息\n')
except:
self.chatText.insert(Tkinter.END,' ' + "error1" + '\n')
cur.close()
con.close()

而且他还不报错,只有一个队global的警告。要是在fetchone那里写个try,他到那里就跳过。

这是其中从server端接到一个全局变量receiveMSG(client发送来的信息)同时连接数据库提取一个信息输出
我以为是数据库问题,可是单写了一个数据库输出就没问题啊
没问题的代码:
import MySQLdb as mdb
def main():
def sendMessage():
#global databaseReturn
databaseReturn = 'haha'
#databaseReturn='hello'
global reveiveMsg
receiveMsg=raw_input("please input:\n")
try:
con = mdb.connect(host='127.0.0.1',user='root',passwd='n5252n59',db='python')
with con:
cur = con.cursor()
try:
cur.execute("SELECT answer FROM data WHERE question=%s",receiveMsg)
except:
print "error0"
try:
#global databaseReturn
databaseReturn = cur.fetchone()[cur.rowcount-1]
except:
print "error1"
cur.close()
con.close()
except:
print "error-1"

try:
print databaseReturn
except:
print "error2"
sendMessage()
main()

这两个程序难道有什么差别吗?求解。
...全文
130 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
cquptzzq 2014-05-08
  • 打赏
  • 举报
回复
这是运行的结果

先运行server,再运行client,然后client输入hello(我在mysql中设置的hello的回复是hello,too),server显示error1
mysqlTable:
hello hello,too
hi hi,too
1 2
cquptzzq 2014-05-08
  • 打赏
  • 举报
回复
client端的:
# _*_ coding:utf-8 _*_
# Filename:ClientUI.py
# Python在线聊天客户端

import Tkinter
import tkFont
import socket
import thread
import time
import sys

class ClientUI():
    
    title = 'Python在线聊天-客户端V1.0'
    local = '127.0.0.1'
    port = 8808
    global clientSock;
    flag = False
    
    #初始化类的相关属性,类似于构造方法
    def __init__(self):
        self.root = Tkinter.Tk()
        self.root.title(self.title)
        
        #窗口面板,用4个面板布局
        self.frame = [Tkinter.Frame(),Tkinter.Frame(),Tkinter.Frame(),Tkinter.Frame()]

        #显示消息Text右边的滚动条
        self.chatTextScrollBar = Tkinter.Scrollbar(self.frame[0])
        self.chatTextScrollBar.pack(side=Tkinter.RIGHT,fill=Tkinter.Y)
        
        #显示消息Text,并绑定上面的滚动条
        ft = tkFont.Font(family='Fixdsys',size=11)
        self.chatText = Tkinter.Listbox(self.frame[0],width=70,height=18,font=ft)
        self.chatText['yscrollcommand'] = self.chatTextScrollBar.set
        self.chatText.pack(expand=1,fill=Tkinter.BOTH)
        self.chatTextScrollBar['command'] = self.chatText.yview()
        self.frame[0].pack(expand=1,fill=Tkinter.BOTH)
        
        #标签,分开消息显示Text和消息输入Text
        label = Tkinter.Label(self.frame[1],height=2)
        label.pack(fill=Tkinter.BOTH)
        self.frame[1].pack(expand=1,fill=Tkinter.BOTH)
        
        #输入消息Text的滚动条
        self.inputTextScrollBar = Tkinter.Scrollbar(self.frame[2])
        self.inputTextScrollBar.pack(side=Tkinter.RIGHT,fill=Tkinter.Y)
        
        #输入消息Text,并与滚动条绑定
        ft = tkFont.Font(family='Fixdsys',size=11)
        self.inputText = Tkinter.Text(self.frame[2],width=70,height=8,font=ft)
        self.inputText['yscrollcommand'] = self.inputTextScrollBar.set
        self.inputText.pack(expand=1,fill=Tkinter.BOTH)
        self.inputTextScrollBar['command'] = self.chatText.yview()
        self.frame[2].pack(expand=1,fill=Tkinter.BOTH)
        
        #发送消息按钮
        self.sendButton=Tkinter.Button(self.frame[3],text=' 发 送 ',width=10,command=self.sendMessage)
        self.sendButton.pack(expand=1,side=Tkinter.BOTTOM and Tkinter.RIGHT,padx=15,pady=8)

        #关闭按钮
        self.closeButton=Tkinter.Button(self.frame[3],text=' 关 闭 ',width=10,command=self.close)
        self.closeButton.pack(expand=1,side=Tkinter.RIGHT,padx=15,pady=8)
        self.frame[3].pack(expand=1,fill=Tkinter.BOTH)
        
    #接收消息
    def receiveMessage(self):
        try:
            #建立Socket连接
            self.clientSock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
            self.clientSock.connect((self.local, self.port))
            self.flag = True
        except:
            self.flag = False
            self.chatText.insert(Tkinter.END,'您还未与服务器端建立连接,请检查服务器端是否已经启动')
            return
            
        self.buffer = 1024
        self.clientSock.send('Y')
        while True:
            try:
                if self.flag == True:
                    #连接建立,接收服务器端消息
                    self.serverMsg = self.clientSock.recv(self.buffer)
                    if self.serverMsg == 'Y':
                        self.chatText.insert(Tkinter.END,'客户端已经与服务器端建立连接......')
                    elif self.serverMsg == 'N':
                        self.chatText.insert(Tkinter.END,'客户端与服务器端建立连接失败......')
                    elif not self.serverMsg:
                        continue
                    else:
                        theTime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
                        self.chatText.insert(Tkinter.END, '服务器端 ' + theTime +' 说:\n')
                        self.chatText.insert(Tkinter.END, '  ' + self.serverMsg)
                else:
                    break
            except EOFError, msg:
                raise msg
                self.clientSock.close()
                break
                  
    #发送消息
    def sendMessage(self):
        #情况1:从text_input获取用户输入
        #得到用户在Text中输入的消息
        message = self.inputText.get('1.0',Tkinter.END)
        #格式化当前的时间
        theTime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
        self.chatText.insert(Tkinter.END, '客户端器 ' + theTime +' 说:\n')
        self.chatText.insert(Tkinter.END,'  ' + message + '\n')
        if self.flag == True:
            #将消息发送到服务器端
            self.clientSock.send(message);
        else:
            #Socket连接没有建立,提示用户
            self.chatText.insert(Tkinter.END,'您还未与服务器端建立连接,服务器端无法收到您的消息\n')
        #清空用户在Text中输入的消息
        self.inputText.delete(0.0,message.__len__()-1.0)

    #连接数据库并操作
    #def connectDatabaseRequest(self):
        #点击小提示请求server连接数据库
        #正常打字请求server回复

    #关闭消息窗口并退出
    def close(self):
        sys.exit()
    
    #启动线程接收服务器端的消息
    def startNewThread(self):
        #启动一个新线程来接收服务器端的消息
        #thread.start_new_thread(function,args[,kwargs])函数原型,
        #其中function参数是将要调用的线程函数,args是传递给线程函数的参数,它必须是个元组类型,而kwargs是可选的参数
        #receiveMessage函数不需要参数,就传一个空元组
        thread.start_new_thread(self.receiveMessage,())

def main():
    client = ClientUI()
    client.startNewThread()
    client.root.mainloop()
    
if __name__=='__main__':
    main()
cquptzzq 2014-05-08
  • 打赏
  • 举报
回复
唉,题目写错了…… 贴出完整代码,求指导 server端的
# _*_ coding:utf-8 _*_
# Filename:ServerUI.py
# Python在线聊天服务器端

#缺陷:缺少每行最多字数限制,只能在局域网聊天,不需要群聊,缺少常见功能触发回复,缺少成员列表,
#只能传输英文字符(包括标点),没有回车发送功能,没有图片功能,不需要文件传输,
#没有输入格式处理(输入回车,输出却连在一起)

import Tkinter
import tkFont
import socket
import thread
import time
import sys
import MySQLdb as mdb

class ServerUI():
    databaseReturn = 'init'
    title = 'Python在线聊天-服务器端V1.0'
    local = '127.0.0.1'
    port = 8808
    global serverSock;
    
    #databaseReturn = 'null'
    flag = False
    
    #初始化类的相关属性,类似于构造方法
    def __init__(self):
        self.root = Tkinter.Tk()
        self.root.title(self.title)
        
        #窗口面板,用4个frame面板布局
        self.frame = [Tkinter.Frame(),Tkinter.Frame(),Tkinter.Frame(),Tkinter.Frame()]

        #显示消息Text右边的滚动条
        self.chatTextScrollBar = Tkinter.Scrollbar(self.frame[0])
        self.chatTextScrollBar.pack(side=Tkinter.RIGHT,fill=Tkinter.Y)
        
        #显示消息Text,并绑定上面的滚动条
        ft = tkFont.Font(family='Fixdsys',size=11)
        self.chatText = Tkinter.Listbox(self.frame[0],width=70,height=18,font=ft)
        self.chatText['yscrollcommand'] = self.chatTextScrollBar.set
        self.chatText.pack(expand=1,fill=Tkinter.BOTH)
        self.chatTextScrollBar['command'] = self.chatText.yview()
        self.frame[0].pack(expand=1,fill=Tkinter.BOTH)
        
        #标签,分开消息显示Text和消息输入Text
        label = Tkinter.Label(self.frame[1],height=2)
        label.pack(fill=Tkinter.BOTH)
        self.frame[1].pack(expand=1,fill=Tkinter.BOTH)
        
        #输入消息Text的滚动条
        self.inputTextScrollBar = Tkinter.Scrollbar(self.frame[2])
        self.inputTextScrollBar.pack(side=Tkinter.RIGHT,fill=Tkinter.Y)
        
        #输入消息Text,并与滚动条绑定
        ft = tkFont.Font(family='Fixdsys',size=11)
        self.inputText = Tkinter.Text(self.frame[2],width=70,height=8,font=ft)
        self.inputText['yscrollcommand'] = self.inputTextScrollBar.set
        self.inputText.pack(expand=1,fill=Tkinter.BOTH)
        self.inputTextScrollBar['command'] = self.chatText.yview()
        self.frame[2].pack(expand=1,fill=Tkinter.BOTH)
        
        #发送消息按钮
        self.sendButton=Tkinter.Button(self.frame[3],text=' 发 送 ',width=10,command=self.sendMessage)
        self.sendButton.pack(expand=1,side=Tkinter.BOTTOM and Tkinter.RIGHT,padx=25,pady=5)

        #关闭按钮
        self.closeButton=Tkinter.Button(self.frame[3],text=' 关 闭 ',width=10,command=self.close)
        self.closeButton.pack(expand=1,side=Tkinter.RIGHT,padx=25,pady=5)
        self.frame[3].pack(expand=1,fill=Tkinter.BOTH)
        
    #接收消息
    def receiveMessage(self):
        global receiveMsg
        #建立Socket连接
        self.serverSock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        self.serverSock.bind((self.local,self.port))
        self.serverSock.listen(15)
        self.buffer = 1024
        self.chatText.insert(Tkinter.END,'服务器已经就绪......')
        #循环接受客户端的连接请求
        while True:
            self.connection,self.address = self.serverSock.accept()
            self.flag = True
            while True:
                #接收客户端发送的消息
                self.cientMsg = self.connection.recv(self.buffer)
                if not self.cientMsg:
                    continue
                elif self.cientMsg == 'Y':
                    self.chatText.insert(Tkinter.END,'服务器端已经与客户端建立连接......')
                    self.connection.send('Y')
                elif self.cientMsg == 'N':
                    self.chatText.insert(Tkinter.END,'服务器端与客户端建立连接失败......')
                    self.connection.send('N')
                else:
                    theTime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
                    self.chatText.insert(Tkinter.END, '客户端 ' + theTime +' 说:\n')
                    self.chatText.insert(Tkinter.END, '  ' + self.cientMsg)
                    receiveMsg=self.cientMsg
                    self.sendMessage()
    
    #发送消息
    def sendMessage(self):
        try:
            global databaseReturn
            
            #databaseReturn='hello'
            global reveiveMsg
        except:
            self.chatText.insert(Tkinter.END,'  ' + "error-2" + '\n')
        con = mdb.connect(host='127.0.0.1',user='root',passwd='n5252n59',db='python')
        with con:
            cur = con.cursor()
            cur.execute("SELECT answer FROM data WHERE question=%s",receiveMsg)
            try:
                #global databaseReturn
                databaseReturn = cur.fetchone()[-1]
                theTime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())
                self.chatText.insert(Tkinter.END,"服务器"+theTime+"说:\n")
                try:
                    self.chatText.insert(Tkinter.END,databaseReturn) #不知此处存在什么问题???
                except:
                    self.chatText.insert(Tkinter.END,'  ' + 'error0' + '\n')
                if self.flag == True:
                    self.connection.send(databaseReturn)
                else:
                    self.chatText.insert(Tkinter.END,'您还未与客户端建立连接,客户端无法收到您的消息\n')
            except:
                self.chatText.insert(Tkinter.END,'  ' + "error1" + '\n')
            cur.close()
        con.close()        
        
#        print(databaseReturn)
        
        
            #x = "yahoo"
            #self.chatText.insert(Tkinter.END,'  ' + x + '\n')
        
        #得到用户在Text中输入的消息
        #manualReply = self.inputText.get('1.0',Tkinter.END)
        #格式化当前的时间
        '''
        theTime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
        self.chatText.insert(Tkinter.END, '服务器 ' + theTime +' 说:\n')
        try:
            #case1:client点击小提示的回复
                 
            #case2:对client端提问的关键词处理
            
            try:
                con = mdb.connect(host='127.0.0.1',user='root',passwd='n5252n59',db='python')
                with con:
                    cur = con.cursor()
                    #ask = raw_input("input your question:")
                    cur.execute("SELECT answer FROM data WHERE question=%s",self.cientMsg)
                    row = cur.fetchone()
                    try:
                        self.chatText.insert(Tkinter.END,'  ' + row[-1] + '\n')
                        try:
                            if self.flag == True:
                                #将消息发送到客户端
                                self.connection.send(row[-1])
                            else:
                                #Socket连接没有建立,提示用户
                                self.chatText.insert(Tkinter.END,'您还未与客户端建立连接,客户端无法收到您的消息\n')
                            #清空用户在Text中输入的消息
                            self.inputText.delete(0.0,manualReply.__len__()-1.0)
                        except:
                            self.chatText.insert(Tkinter.END,'  ' + "error0" + '\n')
                    except:
                        self.chatText.insert(Tkinter.END,'  ' + "error1" + '\n')
            except:
                self.chatText.insert(Tkinter.END,'  ' + "error2" + '\n')
        #connectDatabaseRequest()
        except:
            self.chatText.insert(Tkinter.END,'  ' + "error3" + '\n')
        
        
        
        #处理client关于数据库的请求(匹配数据库)
        
        #print row[i]
        '''
    #关闭消息窗口并退出
    def close(self):
        sys.exit()
    
    #启动线程接收客户端的消息
    def startNewThread(self):
        #启动一个新线程来接收客户端的消息
        #thread.start_new_thread(function,args[,kwargs])函数原型,
        #其中function参数是将要调用的线程函数,args是传递给线程函数的参数,它必须是个元组类型,而kwargs是可选的参数
        #receiveMessage函数不需要参数,就传一个空元组
        thread.start_new_thread(self.receiveMessage,())
    
def main():
    server = ServerUI()
    server.startNewThread()
    server.root.mainloop()
    
if __name__=='__main__':
    main()

37,720

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧