Я пытался написать приложение для чата, используя 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()