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)
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)
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()
#!/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()