我有一个两个tkinter画布,需要根据我从其他模块收到的数据来改变颜色。基本上是0,1 例如:如果收到1,则canvas1为黑色,canvas2为绿色,反之如果为0,则为
我使用多处理队列技术来接收数据,但是当我尝试应用更改时,它没有更新?我假设有一些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
修改为Canvas
,但没有任何可能发生的事情
我从下面的链接tkinter canvas not updating color中了解到我一次又一次地创建了MainWindow(),这就是画布没有改变颜色的原因。我需要一个可以帮助我用usecase scenerio改变颜色的实现
答案 0 :(得分:1)
正如您自己提到的那样,您正在df['D_diff'] = df.groupby('B')['D'].diff()
print (df)
A B C D D_diff
0 foo one 1.996084 0.580177 NaN
1 bar one 1.782665 0.042979 -0.537198
2 foo two -0.359840 1.952692 NaN
3 bar three -0.909853 0.119353 NaN
4 foo two -0.478386 -0.970906 -2.923598
5 bar two -1.289331 -1.245804 -0.274898
6 foo one -1.391884 -0.555056 -0.598035
7 foo three -1.270533 0.183360 0.064007
中创建MainWindow
课程的全部实例。
其次,do_something
函数调用对我来说有点奇怪。
我更喜欢
do_something
如果这是一种更加pythonic的方式可能是有争议的,但我认为在几乎所有的教程中,操作方法和示例代码都会像我提到的那样看到它。
上次我实施了这样的事情,我采取了不同的方法。
我从GUI启动了Threads,将队列传递给它并让线程处理流量。
GUI更新了循环(每100毫秒),它检查队列中的项目,并根据队列内部更新GUI的内容。
每次更新完成后再次启动的线程。 (应用程序本身是服务器的会话监视程序,包括线程内用户的本地化)
因此,作为一些实现建议,我将从以下开始:
def do_something(queue):
t = MainWindow()
t.changeLight(queue.get())