मैंने एक टिंकर जीयूआई बनाने की कोशिश की जहां आप बंदरगाह निर्दिष्ट करते हैं और यह दिए गए बंदरगाह के साथ एक स्थानीय सर्वर बनाता है, लेकिन जब मैं स्क्रिप्ट निष्पादित करने का प्रयास करता हूं, तो स्थानीय सर्वर काम करता है, लेकिन जीयूआई अब और जवाब नहीं देना चाहता।

enter image description here

यहाँ स्क्रिप्ट का स्रोत कोड है:

https://github.com/Medshi8/Random_Gui/blob/main/testServer.py

0
Mohamed Shili 24 अक्टूबर 2020, 14:33

2 जवाब

सबसे बढ़िया उत्तर

फ़ंक्शन को एक अलग थ्रेड पर करने का प्रयास करें, जैसे:

import threading
....
localcnct = Button(CreatserverFrame, text="Creat Server", fg="green"  , command=threading.Thread(target=LocalServ).start)
localcnct.grid(row = 1, column = 2, rowspan= 2 , ipady = 10, ipadx = 5)

यह आपको फ़ंक्शन को टिंकर थ्रेड के अलावा एक अलग थ्रेड पर शुरू करने की अनुमति देता है, जो आपके द्वारा LocalServ() चलाने पर GUI को फ्रीज नहीं करेगा। हालांकि ध्यान रखें, बटन को एक से अधिक बार दबाने से त्रुटि होगी।

लेकिन चूंकि जीयूआई कभी प्रतिक्रिया नहीं देता है, मुझे नहीं लगता कि सर्वर बनाया जा रहा है (निर्माण की प्रक्रिया में)। GUI को प्रतिक्रिया देने में लगने वाला समय, सर्वर के निर्माण में लगने वाला समय है।

0
Cool Cloud 24 अक्टूबर 2020, 17:34

सर्वर को थ्रेड में चलाने का एक सरल उदाहरण नीचे दिया गया है:

import tkinter as tk
import threading
from http.server import HTTPServer, BaseHTTPRequestHandler

class Serv(BaseHTTPRequestHandler):
    def do_GET(self):
        self.send_response(200)
        self.end_headers()
        self.wfile.write(b'Hello')

server = None

def LocalServ():
    global server
    def server_task():
        print('Starting server ...')
        httpd = HTTPServer(('localhost', 8000), Serv)
        httpd.serve_forever()

    # make sure only one server task is running
    if server is None:
        server = threading.Thread(target=server_task, daemon=True)
        server.start()

root = tk.Tk()
root.geometry('400x300')

tk.Button(root, text='Start Server', command=LocalServ).pack()

root.mainloop()
0
acw1668 24 अक्टूबर 2020, 16:48