Я экспериментировал как с Twisted, так и с Tkinter. У меня работает небольшая программа, в которой я могу нажать кнопку в Tkinter, и она отправит запрос на локальный сервер. Это делается путем вызова MessageCFactory. Это работает нормально, однако, когда сервер возвращает ответ, мой метод «данные получены» не ловит его. Вероятно, это из-за того, что я не понимаю петлю реактора.
Надеюсь, кто-то может указать мне правильное направление
Спасибо!
class Client(protocol.Protocol):
def mainGUI(self):
print("hello")
now = datetime.datetime.now()
root = Tk()
tksupport.install(root)
root.geometry("300x300+200+200")
root.title('GUI')
root.geometry('{}x{}'.format(460, 350))
middleFrame = Frame(root)
middleFrame.pack()
Label(middleFrame, text="Initial IP").grid(row=0, column=2, sticky=W)
initialIP = Entry(middleFrame, width=19)
initialIP.grid(row=1, column=2, sticky=W)
Label(middleFrame, text="Port").grid(row=2, column=2, sticky=W)
initialPort = Entry(middleFrame, width=19)
initialPort.grid(row=3, column=2, sticky=W)
Label(middleFrame, text="Username").grid(row=4, column=2, sticky=W)
username = Entry(middleFrame, width=19)
username.grid(row=5, column=2, sticky=W)
Button(middleFrame, text='Enter',
command=lambda arg1=initialIP, arg2=username: self.select(initialIP, initialPort, username)).grid(
row=6, column=5, sticky=W)
print("GUI")
def select(self, initialIP, initialPort, username):
initialIP = str(initialIP.get())
initialPort = str(initialPort.get())
"""
General data sanitation from the UI into things that our twisted application can understand
Encoding as bytes for transfer
"""
username = str(username.get())
usernameBytes = str.encode(username)
initialPort = int(initialPort)
reactor.connectTCP(initialIP, initialPort, MessageCFactory(usernameBytes))
print("message: %s" % (username))
class MessageCProto(protocol.Protocol):
def connectionMade(self):
self.transport.write(self.factory.message)
self.transport.loseConnection()
def dataReceived(self, data):
print('echo:', data)
class MessageCFactory(ClientFactory):
protocol = MessageCProto
def __init__(self, message):
self.message = message
def dataReceived(self, data):
print('echo:', data)
def main():
reactor.callLater(0, Client)
reactor.run()