import wx
from twisted.internet import wxreactor
wxreactor.install()
from twisted.spread import pb
from twisted.internet import reactor, threads
from twisted.cred import credentials
import getpass
class Client(pb.Referenceable):
def connect(self):
#who = str(getpass.getuser()).upper()
name = "USER" #raw_input("Username: ")
client = self
app = wx.App(False)
frame = Interface()
factory = pb.PBClientFactory(frame)
from twisted.internet import reactor #test if this is really required (and why?!)
reactor.registerWxApp(app)
reactor.connectTCP("localhost", 1025, factory)
def1 = factory.login(credentials.UsernamePassword(name, "none"), client)
def1.addCallback(client.connection)
reactor.run()
def connection(self, userObj):
#recieve and store avatar object remote reference
self.user = userObj #the user object for this client instance...keep around!
#print "got perspective/user ref:", self.user
self.returnUser()
def returnUser(self):
print self.user
return self.user
def send(self, message, group):
group.callRemote('send', message)
class Interface(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, -1, "Test Chat", size = (300, 400))
panel = wx.Panel(self)
notebook = Notebook(panel)
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(notebook, 1, wx.EXPAND, 5)
panel.SetSizer(sizer)
self.Layout()
self.Show()
class Notebook(wx.Notebook):
def __init__(self, parent):
wx.Notebook.__init__(self, parent, -1, size = (280, 380), name = 'Chat')
chat = ChatBox(self)
user = UserPanel(self)
group = GroupPanel(self)
self.AddPage(chat, 'Chat')
self.AddPage(user, 'Users')
self.AddPage(group, 'Groups')
sizer = wx.BoxSizer()
sizer.Add(self, 0, wx.EXPAND)
self.SetSizer(sizer)
self.Layout()
#creates a space for notebook chat pages
class ChatBox(wx.Notebook):
def __init__(self, parent):
wx.Notebook.__init__(self, parent, -1, size = (280, 380), style = wx.NB_RIGHT, name = 'Chat Box')
groupN = "Example"
#use this to make a new tab for each new chat:
self.newChat(groupN)
sizer = wx.BoxSizer()
sizer.Add(self, 0, wx.EXPAND)
self.SetSizer(sizer)
self.Layout()
def newChat(self, groupN):
chat = ChatPanel(self)
self.AddPage(chat, groupN)
#add readonly and message entry textboxes to every chat tab
class ChatPanel(wx.Panel):
def __init__(self, parent):
wx.Panel.__init__(self, parent = parent, id=wx.ID_ANY)
sizer = wx.BoxSizer(wx.VERTICAL)
self.text = wx.TextCtrl(self, style = wx.TE_MULTILINE | wx.TE_READONLY)
self.ctrl = wx.TextCtrl(self, style = wx.TE_PROCESS_ENTER, size=(200, 50))
sizer.Add(self.text, 5, wx.EXPAND)
sizer.Add(self.ctrl, 0, wx.EXPAND)
self.SetSizer(sizer)
self.ctrl.Bind(wx.EVT_TEXT_ENTER, self.send)
self.Layout()
# connect to client's remote_print and write methods
def send(self, event):
message = str(self.ctrl.GetValue())
print message
#send to server
client.send(message)
self.ctrl.SetValue("")
class UserPanel(wx.Panel):
def __init__(self, parent):
wx.Panel.__init__(self, parent = parent, id = wx.ID_ANY)
sizer = wx.BoxSizer(wx.VERTICAL)
uList = ['test', 'another', 'something', 'else'] #client.returnUL()
#self.userList = ['test', 'another', 'one more'] #ChatC().user.callRemote('userList')
self.listbox = wx.ListBox(self, -1, size =(270, 380), style = wx.LB_HSCROLL)
for userN in uList:
self.listbox.Append(userN)
sizer.Add(self.listbox, 0, wx.ALL|wx.EXPAND, 5)
self.SetSizer(sizer)
self.Layout()
class GroupPanel(wx.Panel):
def __init__(self, parent):
wx.Panel.__init__(self, parent = parent, id = wx.ID_ANY)
sizer = wx.BoxSizer(wx.VERTICAL)
#get group list from server
gList = ['test', 'another', 'something', 'else'] # client.returnGL()
#groupList = ['something', 'else', 'other']
self.listbox = wx.ListBox(self, -1, size =(270, 380), style = wx.LB_HSCROLL)
for groupN in gList:
self.listbox.Append(groupN)
sizer.Add(self.listbox, 0, wx.ALL|wx.EXPAND, 5)
self.SetSizer(sizer)
self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.OnClick, self.listbox)
self.Layout()
#does not work: TODO
def OnClick(self, event):
#get the name [groupN]
groupN = event.GetText()
#call joinGroup (server) with that name
#add a tab to the ChatBox [ChatBox.newChat(groupN)]
parent.chat.newChat(groupN)
if __name__ == "__main__":
Client().connect()