他のモジュールから受け取ったデータに基づいて色を変更する必要がある2つのtkinterキャンバスがあります。基本的には0,1 例:キャンバス1〜ブラック、キャンバス2〜グリーン1、受信した場合は0を受信します。tkinterキャンバスの色が変更されない
データを受信するためにマルチプロセッシングキュー手法を使用しましたが、変更を適用しようとしたときに更新されませんでしたか?私はself
と何かがあると仮定します。ここで
は私のコードスニペットは、次のとおりです。 main.py
import multiprocessing
from udpsocket import *
from ui import *
if __name__ == "__main__":
queue = multiprocessing.Queue()
ui = multiprocessing.Process(target=uiMain, args=(queue,))
ui.daemon = True
ui.start()
udpMain(queue)
udpsocket.py:
import time
import struct
import socket
import ui
MYPORT = 51506
MYGROUP_4 = '225.0.0.1'
MYTTL = 1 # Increase to reach other networks
def udpMain(queue):
app = udpsocket(queue)
class udpsocket():
def __init__(self,queue):
print('UDP Socket started')
group = MYGROUP_4
self.receiver('225.0.0.1',queue)
def receiver(self,group,queue):
print('Receiver')
addrinfo = socket.getaddrinfo(group, None)[0]
# Create a socket
s = socket.socket(addrinfo[0], socket.SOCK_DGRAM)
#.... reuse address, binding, add membership
# loop, send data to ui
while True:
data, sender = s.recvfrom(1500)
while data[-1:] == '\0': data = data[:-1] # Strip trailing \0's
print (str(sender) + ' ' + str(ord(data)))
queue.put(ord(data))
ui.do_something(queue)
ui.py:
from tkinter import *
from tkinter import ttk
import multiprocessing
def uiMain(queue):
app = MainWindow()
app.mainloop()
class MainWindow(Frame):
def __init__(self):
Frame.__init__(self)
self.master.title("Test")
self.master.minsize(330, 400)
self.grid(sticky=E+W+N+S)
modeFrame = Frame(self)
modeFrame.pack(side="top", fill="x")
self.canvas1 = Canvas(modeFrame, height=25, width=25)
self.canvas1.create_oval(5, 5, 20, 20, fill="black", tags="SetupLight")
self.canvas1.pack(side="left")
self.canvas2 = Canvas(modeFrame, height=25, width=25)
self.canvas2.create_oval(5, 5, 20, 20, fill="black", tags="RunLight")
self.canvas2.pack(side="left")
def changeLight(self,value):
print('change light ' + str(value))
if(value):
self.canvas1.itemconfig("SetupLight", fill="black")
self.canvas2.itemconfig("RunLight", fill="green")
else:
self.canvas1.itemconfig("SetupLight", fill="green")
self.canvas2.itemconfig("RunLight", fill="black")
def do_something(queue):
t = MainWindow()
MainWindow.changeLight(t,queue.get()) #is this way of calling is correct??
注:私は修正しようとしましたmodeFrame
〜self
wh Canvas
を作成すると、何も起こりませんでした。
私はMainWindow()を何度も作成していたので、キャンバスが色を変えていないという理由から理解しました。私はユースケースの風景で色を変えるのに役立つ実装が必要です
は、なぜあなたはそれが何かである」と仮定します:だから、いくつかの実装のアドバイスとして、私は次のように開始する
(アプリケーション自体は、スレッド内のユーザーのローカライズなど、サーバーのセッションウォッチドッグでした)自己と一緒に? "何らかのエラーが出ていますか? –