- 论坛徽章:
- 0
|
现在有个很棘手的问题,pygtk是怎样支持线程的?
我的主线程显示gtk界面
但是子线程需要修改一个控件的属性
好象一修改就死掉了呀
这可怎么搞
高手帮忙看看
不行了睡觉了
现在的版本是这样的
基本运行但是还有问题
- #!/usr/bin/env python
- import pygtk
- pygtk.require('2.0')
- import gtk, gtk.glade, pango, socket, threading, time, sys, time
- HOST="0.0.0.0"
- SENDADD="192.168.1.255"
- PORT=5000
- SENDPORT=5001
- lock=threading.RLock()
- def on_keypress(widget, event):
- if event.keyval == gtk.keysyms.Return:
- on_button1_clicked(None)
- if event.keyval == gtk.keysyms.Escape: #may be have better way
- gtk.main_quit()
- def on_button1_clicked(button):
- global send_socket
- tv = textv
- input_str = entry_send.get_text()
- if len(input_str) <= 0:
- return
- #get text string need send
- string = entry_name.get_text() + ': ' + input_str + '\n'
- #write to textview
- tvbuffer = tv.get_buffer()
- iter_last = tvbuffer.get_iter_at_line(tvbuffer.get_line_count())
- tvbuffer.insert(iter_last, string)
- tv.scroll_to_iter(iter_last, tv.get_left_margin(), False, 0.5, 0.5)
- #clean input entry
- entry_send.set_text('')
- #send out now!
- send_socket.sendto(string, (SENDADD, SENDPORT))
- class Get(threading.Thread):
- def __init__(self):
- try:
- self.sock_listen = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
- self.sock_listen.bind((HOST, SENDPORT))
- except socket.error:
- sys.exit("bind %d port error" % SENDPORT)
- threading.Thread.__init__(self, name = "thread1")
- def run(self):
- while True:
- packet, address = self.sock_listen.recvfrom(1024)
- if (not packet) or address == SENDADD:
- break
- else:
- #add to TextView...
- print "Get:",packet
- gtk.gdk.threads_enter()
- tv = textv
- tvbuffer = tv.get_buffer()
- iter_last = tvbuffer.get_iter_at_line(tvbuffer.get_line_count())
- tvbuffer.insert(iter_last, packet)
- tv.scroll_to_iter(iter_last, tv.get_left_margin(), False, 0.5, 0.5)
- gtk.gdk.threads_leave()
- #listen thread
- thread = Get()
- thread.start()
- try:
- send_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
- send_socket.bind((HOST, PORT))
- except socket.error:
- sys.exit("bind %d port error" % SPORT)
- xml = gtk.glade.XML('office-talk.glade')
- win = xml.get_widget('window1')
- button = xml.get_widget("button1")
- textv = xml.get_widget('tv1')
- entry_send = xml.get_widget('entry1')
- entry_name = xml.get_widget('entry2')
- win.connect('destroy', gtk.main_quit)
- button.connect("clicked", on_button1_clicked)
- entry_send.connect('key_press_event', on_keypress)
- gtk.gdk.threads_enter()
- gtk.main()
- gtk.gdk.threads_leave()
复制代码
[ 本帖最后由 bleem1998 于 2006-2-7 23:39 编辑 ] |
|