I am programming a socket application, I use build-in library socket to make the server, Thread and Tkinter to make GUI.
My problem is I do not know how to insert text into listbox of class MainPage (it is self.msg_list) in main_page.py from function __accept_incoming_connection in class Server in server.py.
Here's my project folder structure:
server
├── main.py
├── server.py
├── views
│ ├── setup_page.py
│ ├── main_page.py
main.py
import tkinter as tk
from tkinter import font as tkfont
from view.setup_page import SetupPage
from view.main_page import MainPage
from server import Server
class App(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
self.title_font = tkfont.Font(family='Helvetica',
size=18,
weight='bold',
slant='italic')
container = tk.Frame(self)
container.pack(side='top', fill='both', expand=True)
container.grid_rowconfigure(0, weight=1)
container.grid_columnconfigure(0, weight=1)
self.frames = {}
for F in (SetupPage, MainPage):
page_name = F.__name__
frame = F(parent=container, controller=self)
self.frames[page_name] = frame
frame.grid(row=0, column=0, sticky='nsew')
self.show_frame('SetupPage')
def show_frame(self, page_name):
frame = self.frames[page_name]
frame.tkraise()
if __name__ == '__main__':
server = Server()
app = App()
app.title('Server')
app.geometry('600x450')
app.mainloop()
server.__del__()
server.py
from socket import socket, AF_INET, SOCK_STREAM
from threading import Thread
HOST = ''
PORT = 3000
ADDRESS = (HOST, PORT)
class Server:
__instance = None
__is_running = False
@staticmethod
def get_instance():
if Server.__instance is None:
Server()
return Server.__instance
def __init__(self):
if Server.__instance is not None:
raise Exception("Server is singleton class")
else:
Server.__instance = self
self.__server = socket(AF_INET, SOCK_STREAM)
self.__server.bind(ADDRESS)
self.__is_running = True
def __del__(self):
self.__is_running = False
self.__accept_thread.join()
self.__server.close()
def __accept_incoming_connection(self):
while self.__is_running:
client, client_address = self.__server.accept()
# I want to insert text into listbox of the MainPage (msg_list) here
def listen(self, num_of_clients):
self.__server.listen(num_of_clients)
self.__accept_thread = Thread(target=self.__accept_incoming_connection)
self.__accept_thread.start()
main_page.py
import tkinter as tk
from socket import AF_INET, socket, SOCK_STREAM
class MainPage(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.controller = controller
self.scrollbar = tk.Scrollbar(self)
self.msg_list = tk.Listbox(self,
height=15,
width=50,
yscrollcommand=self.scrollbar.set)
self.scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
self.msg_list.pack(side=tk.LEFT, fill=tk.BOTH)
self.msg_list.pack()
root.afterbut multithreading with tkinter is tricky. Look at pypi.org/project/tkthread .