功能单独工作,但没有分配给Tkinter中的按钮

时间:2014-09-09 10:16:56

标签: python sockets user-interface lambda tkinter

我是python的初学者,我希望有人可以帮助我,我在堆栈中。我正在写一个简单的代码,它与ITCIP的里程表相吻合,回收数据,处理数据并存储在字典中,当达到某个定义的距离时,while循环断开并返回带有数据的字典。这些功能完美无缺。

当我想从带有Tkinter的GUI执行该功能时出现问题,我将该功能分配给一个按钮,当按下按钮时该功能启动,但是在最后一个循环中被阻止,如果我关闭GUI function显示控制台中的数据,但不返回dictinary,出现任何错误。我尝试使用“lambda:”,没有它,用“execfile()”执行外部脚本,在外部文件中调用函数,函数永远不会结束。只有在被Crt + c打破的时候。这是一个简化的“odom.py”代码:

from Tkinter import *  
import socket  
from datetime import datetime, timedelta
v0=Tk()
v0.config(bg="gray")
v0.geometry("400x300")
v0.title("GUI")

def func():
    ITCIPadress='172.17.18.21'
    port=6000

    i=0 #initialize the dictionary
    rueda = {i:{
        'position':i,
        'distance':i}}

    distancetomeasure=float(raw_input("distance to measure(in m): "))
    dist=float(0)
    distincr=float(0)
    rev=0.5 ##odometer wheel circunference in meter
    stepsrev=8192.0#Number of steps/revolution in the odometer

    s = socket.socket()   
    s.connect((ITCIPadress, port))

    while dist<=distancetomeasure: #It works in positive and negative direction
        recibido = s.recv(45)#number of bytes recived
        print "Recibido:", recibido
        Postime_tmp=map(int, re.findall('\d+', recibido))#split the data
        position_tmp=int(Postime_tmp[0])

        rueda.update({i:{'position':Postime_tmp[0],
                          'distance':dist}})

        if i>0: #because when i=0 there is no increment
            incr_tmp=(rueda[i]['position']-rueda[i-1]['position'])
            distincr=(incr_tmp/stepsrev)*rev
            print distincr
            dist=dist+distincr        
            print 'the distance till yet is:', dist

        rueda.update({i:{'position':Postime_tmp[0],
                      'distance':dist}})
        i=i+1
    print "the distance from start point is:", dist
    s.close()            
    return rueda

b1=Button(v0,text='Start the odometer',command= lambda: func())
b1.pack(fill=BOTH, expand=1)          #command= execfile(C:\odometer.py)[calling another file with the function]
v0.mainloop()                         #command= lambda: odometer.measuredistance()[calling another file with the function]

#if __name__ == '__main__':
#    rueda = func()

如果我评论GUI的一部分,并取消阻塞最后两行,它可以完美地工作,但在GUI中没有。我无法理解为什么会发生这种情况。

这是使用GUI,测量1米,它堆叠在最后:

0.037109375
the distance till yet is: 0.896179199219
Recibido: POSITION=25403046 TIMESTAMP=104308321 

0.0422973632812
the distance till yet is: 0.9384765625
Recibido: POSITION=25403756 TIMESTAMP=104502033 

0.0433349609375
the distance till yet is: 0.981811523438
Recibido:

这只是执行1米的功能:

0.037109375
the distance till yet is: 0.896179199219
Recibido: POSITION=25403046 TIMESTAMP=104308321 

0.0422973632812
the distance till yet is: 0.9384765625
Recibido: POSITION=25403756 TIMESTAMP=104502033 

0.0433349609375
the distance till yet is: 0.981811523438
Recibido: POSITION=25404477 TIMESTAMP=104705956 

0.0440063476562
the distance till yet is: 1.02581787109
the distance from start point is: 1.02581787109

这最后一个也返回包含所有兴趣值的字典。任何帮助将不胜感激!感谢

2 个答案:

答案 0 :(得分:2)

你没有看到任何返回的原因是它有效地返回到你用来调用该函数的按钮,正如@Yann所说,你应该尝试建立你的GUI来完成整个程序,否则没有必要让用户可以看到GUI和命令行

答案 1 :(得分:1)

首先,您不应在raw_input调用的函数中使用GUI。相反,请尝试构建您的GUI,并为您的“距离感知”提供一个输入字段。变量

之后,为什么不建立另一个小部件GUI而不是返回结果呢?

自从我上次使用Tkinter以来已经很长时间了,但它很好GUI,如果你有时间,你应该如何建立一个好的例如,访问http://effbot.org/tkinterbook/tkinter-index.htm即可获得应用。

但如果你赶时间,我相信其他人会很乐意帮助你:)