tkinter帆布颜色不变

时间:2016-08-09 23:20:05

标签: python canvas tkinter

我有一个两个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改变颜色的实现

1 个答案:

答案 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())