• 0
iranio

كيف اشغل الواجهة الرسومية مع السوكيت من دون أن يتجمد البرنامج

سؤال

كيف اشغل الواجهة الرسومية مع السوكيت من دون أن يتجمد البرنامج في الكود اسفل: كما ترون عند الضغط على زر لفتح البورت يتجمد الزر و البرنامج ككل.

و شكرا لكـم

 

from tkinter import *
import socket

port = 6000
host = ""
BufferSize = 1024

#def listen_btn():
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind((host, port))
sock.listen(5)
while True:
        #Receiving from client
        clnt, address = sock.accept()
        data = clnt.recv(1024)
        if data:
                print(data.decode("ascii"))

                

def Close_btn():
        clnt.close

def send_bnt():
        clnt.send("Server ".encode("ascii"))

        

fen1 = Tk()
fen1.title("Chat")
fen1.geometry("310x278")

def prin_ok():
        txto=text1.get()
        label1 = Label(fen1,text = text1.get())
        label1.pack()
        text1.delete(0,END)
        fen1.title(txto)



text1 = Entry(fen1, width=38)
text1.place(x=5,y=210)

richText=Text(font = '{MS Sans Serif} 10')
richText.place(x=5,y=5,width=300,height=200)

bou1 = Button(fen1, text="Send", command=send_bnt, width=9, height=1)
bou1.place(x=240,y=210)

bou2 = Button(fen1, text="Listen", command=listen_btn, width=9, height=1)
bou2.place(x=5,y=250)

bou3 = Button(fen1, text="Close", command=Close_btn, width=9, height=1)
bou3.place(x=240,y=250)

fen1.mainloop()

 

تم تعديل بواسطه iranio
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

2 إجابة على هذا السؤال .

  • 1

accept هي من تسبب لك التوقف الملاحظ في خيط المعالجة الرئيسي main thread، حيث ستوقف خيط المعالجة حتى تستقبل اتصال، والمشكلة ستحدث كذلك مع recv و send، حيث ستسبب الأولى بإيقاف الخيط الى أن تستقبل شيء أو ينهي ارسال البيانات في الثانية، الواجهة الرسومية تحتاج أن لايتوقف خيط المعالجة التي تعمل به كي تتمكن من معالجة الأحداث في mainloop والا ستتجمد الواجهة.

يلزمك إعادة هيكلة البرنامج بحيث تفصل الخادم في خيط معالجة فرعي وتترك معالجة أحداث الواجهة الرسومية في خيط المعالجة الرئيسي، مثال سريع:

from tkinter import *
import socket
import threading

port = 6000
host = ""

class ChatServer(threading.Thread):
    def __init__(self):
        super().__init__()
    def run(self):
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.bind((host, port))
        sock.listen(5)
        while True:
                print('Waiting for incoming connections')
                clnt, address = sock.accept()
                print('Accepted a connection from {}, closing'.format(address))
                ...
                clnt.close()

chatServer = ChatServer()
# Child thread
chatServer.start()

root = Tk()
# Main thread
root.mainloop()

 

3

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

شكـرا لـك أخـي

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .