@WOLF3252

Возможно ли сделать обработку кнопки в сокете на python?

Хотел бы узнать, можно ли сделать обработку событий кнопки на python в tkinter?
Например. Два клиента, которые уже соединились на сервере. И у каждого клиента есть кнопка. И если один нажмёт, то, например кнопка меняет цвет\текст, и та же кнопка обновит свои атрибуты(цвет\текст) у второго.
Т.е. 1 клиент нажал - кнопка стала зелёной
А у 2 клиента кнопка стала зелёной. А потом например 2 клиент на неё кликает и кнопка стала жёлтой, а у 1 клиента кнопка сменила цвет на жёлтый...

Вот, реально ли такое сделать с кнопками? Текст же можно передавать, а вот события при нажатии на кнопку?
  • Вопрос задан
  • 70 просмотров
Пригласить эксперта
Ответы на вопрос 2
Vindicar
@Vindicar
WOLF3252, ты не понимаешь как работает Tkinter, для начала.
tkinter.Button(btn_0)
Ты попытался создать новую кнопку, передав её в качестве родителя какую-то строку (а нужно передать родительский виджет), и тут же эту кнопку выбросил, ничего с ней не сделав. Вместо того, чтобы конфигурировать (configure()) уже существующую кнопку.
А то я думал, что только текст передавать можно

Через сокеты можно передавать только поток байт. И точка.
Фокус в том, как ты этот поток байт интерпретируешь, т.е. какой у тебя протокол передачи данных. Например, ты можешь решить, что будешь передавать два числа (известного размера в байтах), где первое число - номер кнопки, второе - номер цвета в некотором списке. По нажатию кнопки одна сторона сформирует и отправит эту пару чисел, а другая, увидев, что поступили новые данные, их примет, прочитает и интерпретирует. Это будет очень простой протокол, но он будет работать.

Главная сложность в таких приложениях в другом. По умолчанию сетевые операции останавливаются (блокируют поток) на время своего выполнения. Т.е. если тебе не передали данные, а ты вызвал recv() - программа не вернётся из recv() пока данные не придут или пока соединение не разорвётся.
А оконным приложениям для работы нужен непрерывно работающий цикл обработки действий пользователя, им нельзя "задумываться", иначе приложение на вид "зависает". Бороться с этим можно разными способами, я бы посоветовал освоить функцию select(), чтобы заранее (до вызова recv()) понять, есть ли непрочитанные данные или нет.
Ответ написан
Комментировать
dima9595
@dima9595
Junior PHP
Сокетами можно передавать очень многое. В том числе и нажатие на кнопку. Просто вы должны ловить событие нажатия кнопки и передавать какие-то данные или статус (нажат/не нажат) другому участнику соединения.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы