在這一點上,當談到GUI和網絡編程,我仍然是一個小菜鳥,所以我希望這將是一個非常簡單的修復。我已經對tkinter和asyncore模塊有了非常基本的瞭解,並在每個模塊中都構建了一些程序,但是我在使用它們時遇到了麻煩。我把整個用戶界面放在一起,只是發現我無法實現任何重要的異步網絡功能。爲了簡單起見,我將程序解構成最簡單的形式來說明我遇到的基本問題。繼承人的代碼:Asyncore無法正常工作與Tkinter GUI
from Tkinter import *
import asyncore, socket
class Application(object):
def __init__(self, root):
mainFrame = Frame(root)
mainFrame.grid(column=1, row=1, columnspan=3, rowspan=1)
mainButton = Button(mainFrame, text='Click', command=self.makeSocket)
mainButton.grid(column=2, row=1, columnspan=1, rowspan=1, pady=7, padx=40)
def makeSocket(self):
clientSocket()
class clientSocket(asyncore.dispatcher):
def __init__(self):
asyncore.dispatcher.__init__(self)
self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
self.connect(("XXX.XXX.XXX.XXX", XXXX))
print 'init works'
def handle_connect(self):
print 'connect works'
root = Tk()
myApp = Application(root)
root.after_idle(asyncore.loop)
root.mainloop()
所以,當我運行該程序,並單擊該按鈕,我得到的字符串「初始化工作」,表明ClientSocket的對象進行初始化,連接成功。但是,handle_connect方法不運行。如果我實現handle_read方法並在服務器上執行一個命令(將數據發送回客戶端),也不會調用此方法。我在想,有一些常規問題會阻止asyncore循環自行運行。我意識到tkinters事件循環可能是罪魁禍首,但我的印象是after_idle方法會允許在GUI空閒時處理非Tkinter事件。 tkinter事件循環是否仍然會導致問題,或者可能是其他問題?
對於它的價值,asyncore是一種非常古老而笨重的Python技術,雖然仍然處於標準庫中以兼容性,但對於現代項目而言,這是一個相當差的選擇。如果你想要一個更好的異步框架,試試Twisted Python。 (我不建議輕輕扭曲!) – 2010-10-21 13:27:24