الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

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

بدأه iranio في 4 سبتمبر 2016 · 2 رد · 1,556 مشاهدة · في لغة Python
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

و شكرا لكـم

 

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 في 4 سبتمبر 2016 في 13:01

#2

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▲ 1
#3

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

مواضيع مشابهة