0

Hi and thanks for reading this. I know what the problem is but I can't figure out how to fix it.

So the problem goes like this (I think), python is trying to run connect() before the user inputs the host name(hostname) therefore python is trying to connect to a blank host('') which in turn causes a [WinError 10061] to happen. I have tried buffering connect() with another function(connect_buffer()), the error kept on happening, even when I added a if statement that set hostname to 'localhost' if hostname was blank(''), but that didn't work either and turned up the same error.

So my Question is how do I fix this?

Here is the error:

Traceback (most recent call last):
  File "H:\server\New folder\Tk_cleint.py", line 89, in <module>
    setup_confirm_button = tk.Button(window,text = 'Connect', command = setup())
  File "H:\server\New folder\Tk_cleint.py", line 18, in setup
    create_sock(host, int(port))
  File "H:\server\New folder\Tk_cleint.py", line 36, in create_sock
    connect(cleintsocket, nhost, nport)
  File "H:\server\New folder\Tk_cleint.py", line 27, in connect
    self.connect((hostname, connectingport))
ConnectionRefusedError: [WinError 10061] No connection could be made because the target machine actively refused it

And here is my code

#---Import statments---#
import socket, os, multiprocessing
import tkinter as tk

#---global variables---#
setup = ''
cleintsocket = ''

#---Defs---#
def setup():
    global host, port, user
    host = setup_host_box.get()
    port = setup_port_box.get()
    user = setup_user_box.get()

def connect_buffer(self, hostname, connectingport):
    connect(self, hostname, connectingport)

def connect(self, hostname, connectingport):
    if hostname == '':
        hostname = 'localhost'
    self.connect((hostname, int(connectingport)))
    print('connected')
    multiprocessing.Process(target = resv()).start()

def create_sock(nhost, nport):
    global cleintsocket
    cleintsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    connect(cleintsocket, nhost, nport)

def send(username, cleintsock):
    '''to send a message'''
    usrmsg = (username + ' - ' + chat_msg_box.get()).encode()
    cleintsock.send(usrmsg)

def resv(sock):
    '''resive subscript, run through mutiprosses module'''
    while True:
        rmsg = sock.recv(1024).decode()
        chat_msg_display_text.insert('end.0.', rmsg)

def chat():
    '''loads chat page'''
    setup_host_text.pack_forget()
    setup_host_box.pack_forget()
    setup_port_text.pack_forget()
    setup_port_box.pack_forget()
    setup_user_text.pack_forget()
    setup_user_box.pack_forget()
    setup_confirm_button.pack_forget()
    chat_msg_display_text.pack()
    chat_msg_box.pack()
    chat_msg_send_button.pack()

def start():
    '''starts the setup page'''
    setup_host_text.pack()
    setup_host_box.pack()
    setup_port_text.pack()
    setup_port_box.pack()
    setup_user_text.pack()
    setup_user_box.pack()
    setup_confirm_button.pack()

def send_button_callback():
    '''add a buffer to allow time for 'cleintsocket' to be defined in "create_sock()"'''
    send(user, cleintsocket)

#---TK Setup---#
#--window setup--#
window = tk.Tk()
window.title('Chat')
window.geometry('600x600')
window.configure(background='#ffffff')
#--connection setup page--#
setup_host_text = tk.Label(window, text = 'Host')
setup_host_box = tk.Entry(window, bg = '#ffffff')
setup_port_text = tk.Label(window, text = 'Port')
setup_port_box = tk.Entry(window, bg = '#ffffff')
setup_user_text = tk.Label(window, text = 'Username')
setup_user_box = tk.Entry(window, bg = '#ffffff')
setup_confirm_button = tk.Button(window,text = 'Connect', command = setup())
#--chat page--#
chat_msg_box = tk.Entry(window, bg='#ffffff')
chat_msg_send_button = tk.Button(window, text = 'send', command = send_button_callback)
chat_msg_display_text = tk.Text(window, width=600, height=500, wrap = 'word')
#--------------#

start()

and here are some links to questions that didn't help:

WinError 10049: The requested address is not valid in its context

Connecting to myself through my public IP through TCP

Webscraping with Python: WinError 10061: Target machine actively refused

Thank you to anyone who helps.

Community
  • 1
  • 1
C.B
  • 32
  • 1
  • 9

1 Answers1

1

On your setup_confirm_button you're using command = setup() this should be command = setup or command = lambda: setup()

By calling setup() you're actually calling the function instead of setting it as a reference to the function for the command, and it's running your function then instead of on the button click.

The reason using lambda: setup() also works is because lambda creates an anonymous function.

Also, in your multiprocessing process you're likewise calling resv() instead of passing resv this is calling the function with a while loop and blocking the main event loop.

Pythonista
  • 11,377
  • 2
  • 31
  • 50