8 #tell pyGTK, if possible, that we want GTKv2
11 #Some distributions come with GTK2, but not pyGTK
18 print "You need to install pyGTK or GTKv2 ",
19 print "or set your PYTHONPATH correctly."
20 print "try: export PYTHONPATH=",
21 print "/usr/local/lib/python2.2/site-packages/"
24 #now we have both gtk and gtk.glade imported
25 #Also, we know we are running GTK v2
30 In this init we are going to display the main
33 gladefile="vvend.glade"
35 self.wTree=gtk.glade.XML (gladefile,windowname)
36 # we only have two callbacks to register, but
37 # you could register any number, or use a
38 # special class that automatically
39 # registers all callbacks. If you wanted to pass
40 # an argument, you would use a tuple like this:
41 # dic = { "on button1_clicked" :
42 # (self.button1_clicked, arg1,arg2) , ...
45 "on_button1_clicked" : self.keypad_clicked,
46 "on_button2_clicked" : self.keypad_clicked,
47 "on_button3_clicked" : self.keypad_clicked,
48 "on_button4_clicked" : self.keypad_clicked,
49 "on_button5_clicked" : self.keypad_clicked,
50 "on_button6_clicked" : self.keypad_clicked,
51 "on_button7_clicked" : self.keypad_clicked,
52 "on_button8_clicked" : self.keypad_clicked,
53 "on_button9_clicked" : self.keypad_clicked,
54 "on_button10_clicked" : self.keypad_clicked,
55 "on_button11_clicked" : self.keypad_clicked,
56 "on_vvend_destroy_event" : self.quit,
57 "on_vvend_delete_event" : self.quit }
58 self.wTree.signal_autoconnect (dic)
59 display = self.wTree.get_widget("label1")
60 display.set_text("*5N4CK0RZ*")
64 #s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
65 #s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
69 # s.bind((listenhost, listenport))
70 # # only one connection
73 # #GDK->gtk.gdk in GTK V 2.0
74 # id=gtk.input_add(s, gtk.gdk.INPUT_READ, self.handleNewConnection)
82 def keypad_clicked(self,widget):
83 print "button clicked"
84 print widget.get_label()
85 self.do_send(widget.get_label())
86 sys.stdout.write("\a")
88 def handleNewConnection(self,source,condition):
89 #source is a socket in GTK v 1 and a fd in version 2
90 conn, addr = source.accept()
91 sys.stdout.write(conn.recv(1))
95 # from http://www.pythonbrasil.com.br/moin.cgi/MonitorandoSocketsComPygtk
98 def send(self, data=None, widget=None):
99 text = self.entry.get_text()
101 self.entry.set_text('')
105 def do_send(self, data):
107 # envia ''data'' para todos os clientes conectados
109 for addr, (conn, tag) in self.clients.iteritems():
114 # inicializa o servidor
116 self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
117 self.sock.bind(('localhost', 5051))
123 self.server_tag = gtk.input_add(self.sock, gtk.gdk.INPUT_READ, self.accept)
125 # mantemos uma lista dos clientes conectados
129 def accept(self, source, condition):
132 # esperando para ser aceito
134 conn, addr = source.accept()
135 self.insert("%s:%s conectado\n" % addr)
137 # insere o cliente na lista e registra o método self.write como
138 # callback para quando existirem dados esperando para serem lidos
140 self.clients[addr] = (conn, gtk.input_add(conn, gtk.gdk.INPUT_READ, self.write))
142 def write(self, source, condition):
144 # método chamado quando um cliente envia dados
146 data = source.recv(1024)
147 if data.strip() == 'bye' or not len(data):
149 # se o cliente enviar um ''bye'', desconecte-o :)
152 for addr, (conn, tag) in self.clients.iteritems():
154 gtk.input_remove(tag)
155 self.insert('%s:%s desconectado\n' % addr)
156 del self.clients[addr]
158 self.server_tag = gtk.input_add(self.sock, gtk.gdk.INPUT_READ, self.accept)
160 elif data.strip() == 'quit':
163 for (addr, port), (conn, tag) in self.clients.iteritems():
165 self.insert('%s:%s >>> %s\n'%(addr, port, data.strip()))
170 def insert(self, data):
171 statusbar = self.wTree.get_widget("statusbar1")
173 statusbar.remove(1, self.messageid)
174 self.messageid=statusbar.push(1,data)
176 def quit(self, *args):
177 sys.stdout.write("quiting...\n")
178 gtk.input_remove(self.server_tag)
179 for addr, (conn, tag) in self.clients.iteritems():
180 gtk.input_remove(tag)
185 sys.stdout.write("quit!\n")
187 # we start the app like this...
193 # http://www.async.com.br/faq/pygtk/index.py?req=show&file=faq20.011.htp