コード例 #1
0
import sys

from src.client import Client

port = sys.argv[1]
server_ip = sys.argv[2]
team_name = sys.argv[3]

Client.run(port, server_ip, team_name)
コード例 #2
0
ファイル: gui.py プロジェクト: Apollon76/decentralized_chat
class Interface:
    def __init__(self, chat_addr=None, server_port=None):
        if chat_addr is None and server_port is None:
            server_port, chat_addr = self.get_port_and_ip()
        self.buttons = []
        self.root = None
        self.main_frame = None
        self.messages_box = None
        self.message_input_box = None
        self.client = None
        self.refresher = utils.Daemon(name='refreshing', target=self.refresh, timeout=0.1)
        self.users_list = None
        if server_port is None:
            self.close()
            return
        nickname = self.get_nickname()
        self.client = Client(nickname, chat_addr, server_port)

    @staticmethod
    def get_port_and_ip():
        root = Tk()
        root.title('Чат')
        port, ip = None, None

        def create_new():
            nonlocal port, ip, root, server_port_field
            try:
                port = int(server_port_field.get())
            except ValueError:
                return
            ip = None
            root.destroy()

        def connect():
            nonlocal root, port, ip
            try:
                port = int(server_port_field.get())
            except ValueError:
                return
            try:
                ip = chat_ip_field.get(), int(chat_port_field.get())
            except ValueError:
                return
            root.destroy()

        server_port_label = Label(root, text='Введите порт: ')
        server_port_label.focus_set()
        server_port_label.pack()
        server_port_field = Entry(root)
        server_port_field.insert(END, '9090')
        server_port_field.pack()

        button_create_new = Button(root, text='Создать', width=len('Создать') + 2, command=create_new)
        button_create_new.pack()
        button_create_new.pack_propagate(False)

        ip_label = Label(root, text='Введите IP: ')
        ip_label.focus_set()
        ip_label.pack()
        chat_ip_field = Entry(root)
        chat_ip_field.pack()

        port_label = Label(root, text='Введите порт подключения: ')
        port_label.pack()
        chat_port_field = Entry(root)
        chat_port_field.pack()

        button_connect = Button(root, text='Подключиться', width=len('Подключиться') + 2, command=connect)
        button_connect.pack()
        button_connect.pack_propagate(False)
        root.mainloop()
        return port, ip

    def init_UI(self):
        self.root = Tk()
        self.root.title('Чат')
        self.root.minsize(width=700, height=300)
        menu = Menu(self.root)
        self.root.config(menu=menu)
        settings = Menu(menu)
        menu.add_cascade(label='Настройки', menu=settings)
        settings.add_command(label='Сменить ник', command=self.change_nickname)
        self.users_list = UserList(self.root, self.client, width=200)
        self.users_list.pack(fill=Y, side=LEFT, anchor=SW)
        self.users_list.pack_propagate(0)
        self.main_frame = Frame(self.root, width=600, height=300)
        self.main_frame.pack(fill=BOTH, expand=1, side=LEFT, anchor=SW)
        self.root.protocol('WM_DELETE_WINDOW', self.close)

        self.messages_box = MessagesList(self.main_frame, height=7, width=30, font=('Times New Roman', 11))
        self.messages_box.config(state=DISABLED)
        self.messages_box.pack(fill=BOTH, expand=1)

        self.message_input_box = InputBox(self.main_frame, height=3, width=30,
                                          font=('Times New Roman', 11), func=self.send)
        self.message_input_box.pack(fill=BOTH, expand=1)
        self.message_input_box.focus_set()
        self.make_button('Отправить', 0, 2, self.send)

    def make_button(self, text: str, x: int, y: int, command):
        button = Button(self.main_frame, text=text, width=len(text) + 2, command=command)
        button.pack()
        button.pack_propagate(False)
        self.buttons.append(button)
        return button

    def get_nickname(self) -> str:
        try:
            return NicknameBar().get()
        except GeneratorExit:
            if self.client is None or not self.client.nickname:
                self.close()

    def change_nickname(self, _=None):
        nickname = self.get_nickname()
        self.client.send_message(Message(MessageType.SHARED, 'Сменил ник на ' + nickname))
        self.client.nickname = nickname  # TODO critical section

    def send(self, _=None):
        beginning = '0.0'
        message = self.message_input_box.get(beginning, END)
        # TODO encapsulate
        self.message_input_box.delete(beginning, END)
        message = message.rstrip(u'\n')
        if message == '':
            return
        message = Message(MessageType.SHARED, message)
        self.client.send_message(message)

    def run(self):
        self.init_UI()
        self.client.run()
        self.refresher.run()
        self.users_list.run()
        self.root.mainloop()

    def refresh(self):
        message = self.client.get()
        if message is not None:
            self.get_message(message)

    def get_message(self, message: Message):
        nickname_start, nickname_end = message.get_nick_position()
        message = str(message) + '\n'
        self.messages_box.config(state=NORMAL)
        need_to_scroll = False
        if self.messages_box.yview()[1] > 0.9:
            need_to_scroll = True
        cur_line, cur_column = map(int, self.messages_box.index(END).split('.'))
        cur_line -= 1
        self.messages_box.insert(END, message)
        self.messages_box.tag_add('nickname', '{}.{}'.format(cur_line, nickname_start),
                                  '{}.{}'.format(cur_line, nickname_end))
        self.messages_box.tag_config('nickname', foreground='blue')
        self.messages_box.config(state=DISABLED)
        if need_to_scroll:
            self.messages_box.see(END)

    def close(self):
        self.refresher.stop()
        if self.users_list is not None:
            self.users_list.close()
        if self.root is not None:
            self.root.destroy()
            self.root.quit()
        if self.client is not None:
            self.client.close()
        sys.exit(0)
コード例 #3
0
ファイル: __main__.py プロジェクト: eduardorubim/pytcc
from subprocess import Popen
from src.globals import *

# config

sim = None

try:
    if SIMULATION:
        sim = Popen(["python", "_simulation.py"])

    from src.client import Client
    client = Client()
    client.run()

except Exception as e:
    print("[main] Erro:", e)

finally:
    if not sim == None:
        print("[main] Parando a simulação")
        sim.terminate()
コード例 #4
0
#!/usr/bin/env python
import sys

if sys.version_info.major <= 2:

    sys.exit(
        "Error: 'CodeBank' requires Python 3.5 and above to run correctly.")

from src.client import Client

myApp = Client()
myApp.run()