首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Tkinter实时图形画布将停止更新,直到鼠标移动

Tkinter实时图形画布将停止更新,直到鼠标移动
EN

Stack Overflow用户
提问于 2014-12-08 18:02:17
回答 1查看 309关注 0票数 1

下面是一个来自n00b的Python2.7问题:

我正在运行一个应用程序,它从串口读取数据,并使用Tkinter-Canvas制作实时图形。我没有使用matplotlib,因为这个库在我想要运行程序的A20平台上不可用。(在A20上,mpl的一些依赖项还没有达到必要的版本)

我知道这不是绘制实时图形的最优雅的方式,但对我来说,它似乎是最兼容的,因为它只是依赖于Tkinter作为lib,它确实在每个平台上都可用。我基本上是在删除画布,并在每次新数据进入时使用一个位置偏移重新绘制它。有点闪动,但就像我说的.我是一个n00b。:)

下面是我绘制图表的代码:

代码语言:javascript
复制
class TeleGraph(Canvas):
    def __init__(self, master, FrameTitle, Col, Row, Height):
        Canvas.__init__(self, master)
        self.FrameTitle = FrameTitle
        self.Value1 = range(60)
        self.Value2 = range(60)
        self.Value3 = range(60)
        self.configure(height = Height, width = 750, bg = 'grey', bd = 3,relief = GROOVE)
        self.grid()
        self.grid_propagate(0)
        self.Col = Col
        self.Row = Row
        self.place(y = Col, x = Row)

    def NewEntry(self, NewValue1, NewValue2, NewValue3 = 0, Centerline = False, ThirdLine = False):
        self.delete("all")
        self.create_text( 380,20,text = self.FrameTitle, fill = 'black')
        if Centerline == True:
            self.create_line(0,90,760,90, fill = 'dark grey')
        for x in range(1,59):
            self.Value1[x] = self.Value1[x+1]
            self.Value2[x] = self.Value2[x+1]
            self.Value3[x] = self.Value3[x+1]
        self.Value1[59] = NewValue1
        self.Value2[59] = NewValue2
        self.Value3[59] = NewValue3
        for x in range(0,59):
            self.create_line(-13+(x*13),self.Value1[x],0+(x*13),self.Value1[x+1], fill='blue' )
            self.create_line(-13+(x*13),self.Value2[x],0+(x*13),self.Value2[x+1], fill='red' )
            if ThirdLine == True:
                self.create_line(-13+(x*13),self.Value3[x],0+(x*13),self.Value3[x+1], fill='yellow' )

到目前为止,它工作正常,但我注意到一个奇怪的错误:

大约半分钟后,画布停止更新,即使你的程序本身仍在完美运行。当我将鼠标移到应用程序上时,画布再次更新。我每0.5秒调用一次NewEntry函数。我想过时不时地生成一个鼠标事件,但那将是一项令人讨厌的工作……任何帮助都是非常感谢的!

谢谢,

卡片组

EN

回答 1

Stack Overflow用户

发布于 2014-12-08 20:55:40

首先,我认为新的代码解决了这个问题,但事实证明,这种情况发生的次数更少了。而且,这似乎不会发生在A20ARM上的Debian上。

代码如下:

代码语言:javascript
复制
class TeleGraph(Canvas):
    def __init__(self, master, FrameTitle, Col, Row, Height):
        Canvas.__init__(self, master)
        self.FrameTitle = FrameTitle
        self.Value1 = range(60)
        self.Value2 = range(60)
        self.Value3 = range(60)
        self.Line1 = range(60)
        self.Line2 = range(60)
        self.Line3 = range(60)
        self.configure(height = Height, width = 750, bg = 'grey', bd = 3,relief = GROOVE)
        self.grid()
        self.grid_propagate(0)
        self.Col = Col
        self.Row = Row
        self.place(y = Col, x = Row)
        self.create_text( 380,20,text = self.FrameTitle, fill = 'black')
        for x in range(0,59):
            self.Line1[x] = self.create_line(-13+(x*13),90,0+(x*13),90, fill='blue', width = 0 )
            self.Line2[x] = self.create_line(-13+(x*13),90,0+(x*13),90, fill='red' , width = 0 )
            self.Line3[x] = self.create_line(-13+(x*13),90,0+(x*13),90, fill='yellow' , width = 0 )

    def NewEntry(self, NewValue1, NewValue2 = 0, NewValue3 = 0, Centerline = False, Dritter = False):
        for x in range(1,59):
            self.Value1[x] = self.Value1[x+1]
            self.Value2[x] = self.Value2[x+1]
            self.Value3[x] = self.Value3[x+1]
        self.Value1[59] = NewValue1
        self.Value2[59] = NewValue2
        self.Value3[59] = NewValue3
        for x in range(0,59):
            self.coords(self.Line1[x], -13+(x*13), self.Value1[x],(x*13), self.Value1[x+1])
            self.coords(self.Line2[x], -13+(x*13), self.Value2[x],(x*13), self.Value2[x+1])
            self.coords(self.Line3[x], -13+(x*13), self.Value3[x],(x*13), self.Value3[x+1])
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27355494

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档