0 oy
Python kategorisinde (120 puan) tarafından soruldu

Merhabalar, python login ekranı olan bir chat aplikasyonu yapıyorum. Kodun tamamı bana ait değil. Ekranlar arası geçiş için class'lı kodu stackoverflow'dan aldım. 

https://stackoverflow.com/questions/7546050/switch-between-two-frames-in-tkinter

Ancak programı çalıştırıp login ekranı gelir gelmez, "OSError: [WinError 10057] Yuva bağlı olmadığından ve (bir veri birimi yuvasında bir sento çağrısı kullanırken) adres sağlanmadığından bir veri gönderme veya alma isteğine izin verilmedi" hatası alıyorum. İlk başta bu hatayı önlemek için aşağıda da gördüğünüz gibi connection_status değişkeni olan bir if statement'ı ile kontrol etmeye çalıştım. Kısmen işe yaradı ama bu sefer de giriş yapınca bu hatayı alıyorum. Nasıl çözülebilir bu?

import tkinter as tk                # python 3
from tkinter import font  as tkfont # python 3
import MySQLdb
from tkinter import messagebox
import socket
import sys
from threading import Thread


db = MySQLdb.connect(host="localhost", user="root", passwd="", db="members")
cursor = db.cursor()

HOST=socket.gethostbyname(socket.gethostname())
PORT=5000
s = socket.socket()
connection_status=""



class SampleApp(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")

        # the container is where we'll stack a bunch of frames
        # on top of each other, then the one we want visible
        # will be raised above the others
        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 (StartPage, PageOne):
            page_name = F.__name__
            frame = F(parent=container, controller=self)
            self.frames[page_name] = frame

            # put all of the pages in the same location;
            # the one on the top of the stacking order
            # will be the one that is visible.
            frame.grid(row=0, column=0, sticky="nsew")

        self.show_frame("StartPage")

    def show_frame(self, page_name):
        '''Show a frame for the given page name'''
        frame = self.frames[page_name]
        frame.tkraise()


class StartPage(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent, width=500, height=500)
        self.controller = controller
        user_id = tk.Entry(self)
        user_id.place(x=210, y=150)
        s = socket.socket()

        label = tk.Label(self, text="Nickname:")
        label.place(x=140, y=150)

        label_2 = tk.Label(self, text="Password:")
        label_2.place(x=140, y=200)

        password = tk.Entry(self, show="*")
        password.place(x=210, y=200)

        def auth_login(event=None):
            global connection_status
            id = user_id.get()
            pswd = password.get()
            cursor.execute(
                "SELECT nickname, password FROM chatmembers WHERE nickname='{}' AND password='{}' ".format(id, pswd))
            if cursor.fetchone():
                try:
                    connection_status+="ONLINE"
                    s.connect((HOST, PORT))
                    controller.show_frame("PageOne")
                except ConnectionRefusedError:
                    messagebox.showerror("Server Error", "The server is not connected.")

            else:
                messagebox.showerror("Wrong credentials", "Either nickname or password is wrong. Please try again.")

        login_button = tk.Button(self, text="Log In", command=auth_login, height=2, width=20)
        login_button.place(x=195, y=250)




class PageOne(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent, width=1000, height=1000)
        self.controller = controller
        messages_frame = tk.Frame(self)
        my_msg = tk.StringVar()
        my_msg.set("Type your messages here")
        scrollbar = tk.Scrollbar(messages_frame)
        msg_list = tk.Listbox(messages_frame, height=37, width=200, yscrollcommand=scrollbar.set)
        scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
        msg_list.pack(side=tk.LEFT, fill=tk.BOTH)
        msg_list.pack()
        messages_frame.pack()

        def recv():
            while True:
                if connection_status=="ONLINE":
                    data = s.recv(1024)
                    if not data: sys.exit(0)
                    msg_list.insert(tk.END, data.decode())

        def send(event=None):
            message = entry_field.get("1.0", "end-1c")
            s.send(message.encode('utf-8'))
            entry_field.delete('1.0', tk.END)
            return "break"

        def shuffle(event=None):
            s.send("?pRG=gmxHD74cEm".encode("utf-8"))

        def on_closing(event=None):
            if messagebox.askokcancel("Quit", "Do you want to quit RChat?"):
                try:
                    s.send("4t7w!z%C".encode("utf-8"))
                finally:
                    self.destroy()

        entry_field = tk.Text(self, height=5, width=150)
        entry_field.bind("<Return>", send)
        entry_field.place(x=72, y=600)

        send_button = tk.Button(self, text="Send", command=send, height=2, width=20)
        send_button.pack()
        send_button.place(x=1150, y=600)

        shuffle_button = tk.Button(self, text="Shuffle", command=shuffle, height=2, width=20)
        shuffle_button.pack()
        shuffle_button.place(x=1150, y=650)

        #self.protocol("WM_DELETE_WINDOW", on_closing)

        t1 = Thread(target=recv)
        t1.start()



if __name__ == "__main__":
    app = SampleApp()
    app.mainloop()

 

Bu soruya cevap vermek için lütfen giriş yapınız veya kayıt olunuz.

Yazılım Biliminin Soru Cevap Platformuna hepiniz hoşgeldiniz. Bu platformda kurallara uyarak diğer geliştiricilerle yardımlaşabilirsiniz.
...