Приложение для чата Python, использующее tkinter. Основная проблема - PullRequest
0 голосов
/ 20 апреля 2019

Я пытался написать приложение для чата, используя tkinter и python 3. Я хотел бы объединить функциональность класса Server, который позволяет общаться с другими, с графическим интерфейсом пользователя, содержащимся в классе GUI.

Проблема в том, что при разных подходах я получаю функцию mainloop (), блокирующую другие функции. Не могли бы вы помочь мне определить ошибку?

Я пытался использовать поток для запуска mainloop(), использовать вместо него метод update() и поместить mainloop() в класс и заставить один класс наследовать от другого.

Мой уровень программирования - новичок, и любые советы по поводу хорошей практики создания таких приложений были бы полезны:)

import socket
import time
import threading
from tkinter import *

# ------------GUI--------------------

class GUI:

    message = ''
    name = ''

    def __init__(self):

        self.root = Tk()

        self.label_1 = Label(self.root, text="Name")
        self.entry_1 = Entry(self.root)  # Input field to get the server name
        self.button_connect = Button(self.root, text="Run server", command=self.retrieve_input)
        self.label_1 = Label(self.root, text="Name")

        self.label_1.grid(row=0, sticky=E)
        self.entry_1.grid(row=0, column=1)
        self.button_connect.grid(columnspan=2)

        self.receivebox = Text(self.root, height=10, width=40)
        self.writebox = Text(self.root, height=1, width=40)
        self.sendbutton = Button(self.root, text="Send", command=self.display(self.message))

        self.sendbutton.bind("<Button-3>", self.display(self.message))

        self.receivebox.grid(row=4, sticky=E, columnspan=6)
        self.writebox.grid(row=5, sticky=E, columnspan=6)
        self.sendbutton.grid(row=6, sticky=E, columnspan=6)

        gui = threading.Thread(target=self.root.mainloop())
        gui.daemon = True
        gui.start()

        self.root.mainloop()

    def retrieve_input(self):
        self.name = self.entry_1.get()  # Has a name of the user
        print(self.name)

    def display(self, text):
        print("I am a display method")
        self.receivebox.insert(END, text)

#------------SERVER--------------------

class Server(GUI):

    def __init__(self, startpanel):

        self.startpanel = startpanel

        self.s = socket.socket()
        self.host = socket.gethostname()
        self.port = 9999
        self.s.bind((self.host, self.port))
        self.s.listen(1)
        self.conn, self.addr = self.s.accept()

        sender = threading.Thread(target=self.send_message)
        sender.daemon = True
        sender.start()

        receiver = threading.Thread(target=self.recieve_message)
        receiver.daemon = True
        receiver.start()

    def receive_message(self):
        incoming_message = self.conn.recv(1024)
        incoming_message = incoming_message.decode()
        return incoming_message

    def send_message(self):
        message = input(str(">>"))
        message = message.encode()
        self.conn.send(message)
        return message

    def return_host(self):
        print("return host working")
        return self.host

def main():

    interface = GUI()
    server = Server(interface)

    server.return_host()

    while 1:
        str(server.interface.display(server.send_message()))
        str(server.interface.display(server.receive_message()))

main()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...