2

コードについてサポートが必要です。

def start():
   def start_tkinter():
      global main,l
      main.destroy()
      main=Tk()
      l=Listbox(main)
      f1=Frame(main)
      e=Entry(f1)
      b1=Button(main,text="Stop",command=parar)
      l.pack(side=TOP)
      f1.pack(side=BOTTOM)
      e.pack(side=LEFT)
      b1.pack(side=RIGHT)
      main.update()
      start_server()

    def start_server():
     HOST, PORT = "localhost", 9999
     server = SocketServer.UDPServer((HOST, PORT), MyUDPHandler)
     server.serve_forever()
    start_tkinter()

ループを開始すると、Tkinterがフリーズし、使用できなくなります。解決策が必要です。

4

4 に答える 4

4

あなたは正しいです。基本的に、2つの無限ループを並行して実行する必要があります。1つはGUIにサービスを提供するために、もう1つはソケットサーバーにサービスを提供するために必要です。唯一のオプションは、2つのスレッドまたは2つのプロセスを使用することです。*

覚えておくべき主なことは、Tkinterはメインスレッドで実行する必要があり、Tkinterはスレッドセーフではないため、他のスレッドからTkinterオブジェクトに直接アクセスすることはできないということです。ソケットスレッドがTkinterと相互作用するようにしたい場合は、ある種のメッセージパッシングメカニズムを導入する必要があります。

*これらはあなたの唯一の選択肢ではありませんが、最も実用的です。ソケットからデータを読み取る必要がある場合、Tclのfileeventモデルは非常に強力であるため、通常、基盤となるTclインタープリターで実行するTclコードを記述します。少しのTclプログラミングをしなければならないという犠牲を払って、スレッド化された実装の複雑さを失います。しかし、私は逸脱します。

于 2012-06-25T23:41:30.837 に答える
1

さて、私は今、Threaringを使用しています。

t = Thread(target=start_server)
t.start()

しかし、答えてくれてありがとう。

于 2012-06-28T01:00:53.643 に答える
0

マルチプロセッシングモジュールを試してみることをお勧めします。

import multiprocessing
def start():
   def start_tkinter():
      global main,l
      # ...
      main.update()
      proc = multiprocessing.Process(target=start_server)
      proc.start()
   def start_server():
     HOST, PORT = "localhost", 9999
     # ...

しかし、私たちはあなたが何をしたいのかわからないので、あなたのコードは質問で与えられたように実際に実行可能ではないので、私はこの提案をすることはできません。

于 2012-06-25T22:06:18.913 に答える
0

元の問題が「ブロッキング」ソケットの使用に起因するものではなかったと思いますか?その場合、答えは「socket.setblocking(0)」と入力するのと同じくらい簡単です。

于 2014-05-09T00:41:50.377 に答える