Витая с Ткинтер - PullRequest
       8

Витая с Ткинтер

0 голосов
/ 06 ноября 2018

Я экспериментировал как с 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()
...