MultiEast TypeError: аргумент должен быть int или иметь метод fileno () - PullRequest
0 голосов
/ 14 декабря 2018

У меня проблема, я создал многоадресную рассылку с графическим интерфейсом, и моей программе нужно sys.stdin, но в моем графическом интерфейсе есть текстовая строка.

sockets_list = [sys.stdin, server] 
read_sockets,write_socket, error_socket  = select.select(sockets_list,[],[])

Этот код не работает

def message(self, event):
    mess = self.write.get() 
    self.sockets_list = [mess, self.server]
    self.read_sockets, write_socket, error_socket  = select.select(self.sockets_list,[],[]) 
    print self.sockets_list
    self.write.delete(0, Tkinter.END)
    if mess != '':
      self.mess1.configure(state = NORMAL)
      self.all_users.append('Adam')
      for socks in self.read_sockets:
        if socks == self.server:
            message = socks.recv(2048)
            self.mess1.insert(Tkinter.END, '%s> %s \n' %(self.nick, message)) #wyswietla wprowadzony tekst
            self.mess1.see(Tkinter.END) 
        else:
            message = mess
            self.server.send(message)
            print self.nick
            print message
      self.mess1.see(Tkinter.END) 
      self.mess1.configure(state = DISABLED)

Я хочу создать мессенджер на основе многоадресной рассылки Я отправляю сообщение от одного клиента - я иду на сервер и отправляю его наостальные клиенты.Проблема в том, что я не могу использовать сообщение, введенное в графическом интерфейсе, и оно работает в терминале

Весь код

web_pr_less2_client.py - клиент

dup.py - serv

https://github.com/Antoni-Hp/Web_programing/tree/master/Python_web_programing_less2

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

я использовал after() функцию, и она работает.

@ ZalewaPL спасибо за помощь:)

решение:

 def read_from_server(self):
    read_sockets, write_socket, error_socket = 
    select.select([self.connection_socket],[],[], 0.1)
    for socks in read_sockets:
      if socks == self.connection_socket:
        message = socks.recv(2048)
        message = message.split(";;")
        self.mess1.configure(state = NORMAL)
        self.mess1.insert(Tkinter.END, '%s> %s \n' %(message[0], message[1]))
        self.mess1.see(Tkinter.END)
        self.mess1.configure(state = DISABLED)
    self.main.after(1, self.read_from_server)


  def on_message_send_requested(self, event):
    message = self.text_input.get() # pobiera tekst z okienka write
    self.text_input.delete(0, Tkinter.END)
    if message != '':
      self.mess1.configure(state = NORMAL)
      send_message = "%s;;%s" %(self.nick, message)
      self.connection_socket.send(send_message)
      self.mess1.insert(Tkinter.END, '%s> %s \n' %(self.nick, message)) 
      self.mess1.see(Tkinter.END) #pokazuje zawsze najnowszy wpis
      self.mess1.configure(state = DISABLED)
0 голосов
/ 17 декабря 2018

Проблема, указанная автором вопроса, заключается в том, что «код не работает».В то время как автор пытается найти решение для конкретной ошибки, которая приводит к определенному выбросу исключения, его исправление само по себе не решит проблему неработающего кода.Также кажется, что автор только начинает изучать, как кодировать приложения GUI.

У меня мало знаний о Tkinter, но я постараюсь помочь независимо, объясняя, какие проблемы я вижу здесь.

  1. Метод message, представленный ввопрос вызывается в ответ на событие «отправить сообщение».Однако этот метод также пытается прочитать сообщения, которые могут поступить с сервера в любой момент времени.Это означает, что пользователь не увидит никаких новых сообщений с сервера, пока они сами не отправят сообщение.Этот фрагмент кода «чтение с сервера» должен быть удален из этого метода и обрабатываться отдельно.

    Теперь, как я уже говорил ранее, я не знаком с Tkinter, поэтому я не могу утверждать, что знаю, какой здесь лучший подход, но обычно с GUI-приложениями прослушивание фоновых событий должно выполняться либоожидание прибытия «готового» события через функцию обратного вызова или путем опроса событий, которые мы ожидаем в фоновом режиме.Как это достигается, зависит от используемой технологии (таймеры, потоки, функции API ОС с обратными вызовами).

    В вашем случае:

    1.1.Извлеките операции чтения в отдельный метод.
    1.2.Используйте таймер Tkinter для периодического вызова этого метода.
    1.3.select() на сокете с коротким таймаутом (попробуйте 0.01)
    1.4.Если сокет готов к чтению, прочитайте его и добавьте в окно чата.

    Это примитивное решение, так как тайм-аут 0.01 остановит ваше приложение, и в программном обеспечении промышленного уровня это делать нельзя.основной поток, но это хорошая отправная точка.

  2. Исключение при отправке сообщения вызвано попыткой использовать переменную mess, полученную из виджета ввода текста, как если бы онбыл дескриптор ввода / вывода, в то время как на самом деле это str.Дескрипторы ввода / вывода - это файлы, файловые дескрипторы, сокеты, каналы.str является типом данных, и его нельзя передать в select().Тем не менее, вы можете просто отправить его через сокет без особой заботы, т.е.

    def message(self, event):
        message = self.write.get()
        self.write.delete(0, Tkinter.END)
        self.server.send(message)
        self.mess1.configure(state=NORMAL)
        self.mess1.insert(Tkinter.END, '%s> %s \n' %(self.nick, message))
        self.mess1.see(Tkinter.END)
        self.mess1.configure(state=DISABLED)
    

Кроме общих проблем, мои общие рекомендации:

Ваш код не соответствует рекомендациям по стилю PEP8.Хотя это не влияет на ваше программное обеспечение функционально, вы можете пересмотреть следующие правила.Они официально рекомендованы авторами языка Python, и весьма вероятно, что большая часть кода Python, который вы найдете в Интернете, будет следовать им.Выполнение flake8 проверки вашего кода показывает 351 нарушение.

Я также рекомендую сосредоточиться на более точном именовании ваших символов.

  • def message должно быть def on_message_send_requested(Я использовал префикс on, поскольку этот метод можно использовать только в качестве обратного вызова из-за наличия аргумента event),
  • self.server должно быть self.connection_socket,
  • mess должно быть message,
  • self.write должно быть self.text_input
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...