Python:在我的GUI应用程序中实现线程的建议

时间:2015-03-13 17:45:54

标签: python multithreading user-interface

我真的很难在我的应用程序中实现线程。这可能会有点长,所以请耐心等待。我的问题更多地围绕我的应用程序的建议结构,而不是围绕添加线程的代码。

首先让我展示一下我的应用程序的视觉效果。比解释一些事情。应用程序通过串行端口上的Arduino提供数据。在坚果壳中,我打开一个串口,逐行读取数据,处理它并在屏幕上直观显示。视觉效果分为两部分。第一个是Arduino通过串口保存和传递的每个赛车的时间。第二个是比赛进展基于比赛的距离,你看到的时钟风格手也在屏幕截图中看到。这一切都是实时发生的,来自Arduino的数据通过串口发生得非常快。

enter image description here

比赛开始后,此功能就是我解析数据并告诉系统如何处理数据。

def letsrace(self):
    def getsome():
        global var1, var2, totalCount
        self.reset() 
        self.senddemo()
        letsRace = 1
        ser.write('!g\n')
        while (letsRace == 1):
            #print mycount
            s = ser.readline()
            s = s.strip('\r\n')
            #Check for :          
            pattern = r'[:]'
            if re.search(pattern, s):
                #print 'VALID : %r' % (s,)
                var1, var2 = s.split(":")
                self.options[var1]()
            else:
                #print 'INVALID : %r' % (s,)
                pass
            if totalCount == 4:
                letsRace = 0
        self.racecomplete()
    thread = threading.Thread(target=getsome)
    thread.start()  

正如你所看到的,我确实有一个主题。这很有效,因为显示每个赛车的计时器会使应用程序陷入困境。一旦我在竞赛功能上添加了线程,我就没有问题了。

我还应该指出,我使用字典作为案例陈述。它属于Race类的ini。它看起来如下。

    self.options = {"0": self.draw_r1,
        "1": self.draw_r2,
        "2": self.draw_r3,
        "3": self.draw_r4,
        "0f": self.racerFinish,
        "1f": self.racerFinish,
        "2f": self.racerFinish,
        "3f": self.racerFinish,
        "x": self.emptyLine,
        "t": self.raceTime,
        "G": self.letsGo,
        "CD": self.countDown,
        "C": self.emptyLine,
        }

根据我从实时数据流中解析的内容,我使用正确的函数处理它。到目前为止我非常基本的东西我认为你会同意。

我刚刚完成了代码,可以在时钟式显示屏上添加赛车表盘。我正在使用Pillow(PIL)来旋转表盘。这也是非常基本的东西。我有一个画布,我在画布上添加了四个图像来表示每个赛车。我为每个赛车使用不同的功能来更新他们在比赛中的位置。它们是您在上面的词典中看到的前四个功能。以下是其中一个示例。除了他们在时钟上更新的图像之外,它们几乎都是相同的。

    def draw_r4(self):
    if self.r4_isdone == 0:
        self.angle = (float(var2) * self.movement ) * -1 
        if self.angle < -360:
           self.angle = 0
        self.canvas.delete(self.canvas_obj4)
        self.newarrow4 = ImageTk.PhotoImage(self.image_r4.rotate(self.angle))
        self.canvas_obj4 = self.canvas.create_image(215, 215, image=self.newarrow4)

如果您熟悉PIL并旋转图像,您就会知道它基本上会反复重绘图形以显示新位置。这是系统现在出现问题的地方。在Win8或Mac上,拨号盘不会真正影响应用程序的性能。在具有有限处理能力的覆盆子PI上。演示比赛需要大约6.4秒才能完成,但是在RPi上,由于图像重绘的处理,大约需要15秒。为了让这个像Raspberry一样工作,我想让每个拨号动画都在自己的线程中运行。

所以,如果你还在阅读这篇文章。我为这个长度道歉。现在我的问题。您如何建议我将每个拨号运动都放入自己的线程中?请记住,上面的主要赛车功能有一个线程。我读过的每个线程示例都是如此基本,以至于在一个完整的gui应用程序中实现任何东西都让我的头脑旋转了一下。

0 个答案:

没有答案