python ant_python3.7.1ant+TKinter在Tkin中显示来自ANT+设备的实时数据

在尝试将ANT+设备的实时数据(如功率、速度和节奏)显示在Tkinter窗口中时遇到问题。代码在控制台运行正常,但在Tkinter环境中,ANT节点启动时出现MessageTimeoutError,导致Tkinter窗口无法打开。已知while True循环阻碍了窗口显示,目前正寻求解决方法,包括考虑将数据读写分开为两个脚本,以及研究如何在不中断回调循环的情况下更新Tkinter标签。
摘要由CSDN通过智能技术生成

关于我昨天的问题(here),我试图用Bissont创建的fork实现这个python-ant repository。我试着利用他的力量演示塔克斯武士道智能教练机,因为这是同一个设备我使用。

我稍微修改了代码以适合我的Suunto ANT+接收器,并在控制台中运行它,代码就起作用了。现在,我尝试在TKinter环境中实现它,以显示从ANT+设备接收的实时数据,但最终出现以下错误代码,TKinter窗口不再打开:Traceback (most recent call last): File

"/usr/local/lib/python3.5/dist-packages/ant-0.1.1-py3.5.egg/ant/core/node.py",

line 212, in start

self.reset(wait) File "/usr/local/lib/python3.5/dist-packages/ant-0.1.1-py3.5.egg/ant/core/node.py",

line 197, in reset

evm.waitForMessage(message.StartupMessage) File "/usr/local/lib/python3.5/dist-packages/ant-0.1.1-py3.5.egg/ant/core/event.py",

line 163, in waitForMessage

return self.msg.waitFor(class_, timeout) File "/usr/local/lib/python3.5/dist-packages/ant-0.1.1-py3.5.egg/ant/core/event.py",

line 114, in waitFor

raise MessageTimeoutError("%s: timeout" % str(foo), internal=foo) ant.core.exceptions.MessageTimeoutError: : timeout

During handling of the above exception, another exception occurred:

Traceback (most recent call last): File

"/home/pi/python-ant/demos/ant.core/ANT+ power.py", line 47, in

antnode.start() File "/usr/local/lib/python3.5/dist-packages/ant-0.1.1-py3.5.egg/ant/core/node.py",

line 217, in start

raise NodeError(err) ant.core.exceptions.NodeError: : timeout

所以(最终程序)应该做的是:接收并存储ANT数据

将数字四舍五入到2-3位小数(最大)

从文件中读取到目前为止的总功率输出

将电源数据写入文件(append)

总输出功率总和

显示当前速度、节奏、功率和总功率输出

以下是我目前为止的代码:# imports

import random

import time

from tkinter import *

from ant.core import driver

from ant.core.node import Node, Network, ChannelID

from ant.core.constants import NETWORK_KEY_ANT_PLUS, NETWORK_NUMBER_PUBLIC

from ant.plus.power import *

from config import *

# creating root tkinter Window

root = Tk()

root.title("TacX Bushido ANT+ Live Data")

# defining text variables

running = 0

SAVE_FILE = "power_doc.txt"

HEADLINE_TEXT = StringVar()

HEADLINE_TEXT.set('Headline')

HEADLINE_M= StringVar()

HEADLINE_M.set('M')

power_display = StringVar()

power_display.set('0')

cadence_display = StringVar()

cadence_display.set('0')

speed_display = StringVar()

speed_display.set('0')

powertotal_display = StringVar()

powertotal_display.set('0')

# defining ANT variables

device = driver.USB2Driver(log=LOG, debug=DEBUG, idProduct=0x1008)

antnode = Node(device)

antnode.start()

network = Network(key=NETWORK_KEY_ANT_PLUS, name='N:ANT+')

antnode.setNetworkKey(NETWORK_NUMBER_PUBLIC, network)

# defining Window Size

root.geometry("800x600")

# creating Label Frame to wrap labels

frame = LabelFrame(root)

frame.pack(padx=20, pady=20)

# creating labels, Headline 1

Mlabel = Label(root, font = ("Helvetica",48) ,textvariable = HEADLINE_M, justify=CENTER, bg="#FFFFFF", fg = '#000000')

Mlabel.pack(fill=BOTH, padx=20, pady=10)

# headline 2

headLine = Label(root, font=("Helvetica", 26), textvariable= HEADLINE_TEXT, justify=CENTER, bg="#FFFFFF", fg = '#000000')

headLine.pack(fill=BOTH, pady=5)

# power

l1 = Label(root, font = ("Helvetica",20) ,textvariable = power_display, justify=CENTER, bg="#190000", fg = '#B0C4C2')

l1.pack(fill=BOTH)

# cadence

l2 = Label(root, font = ("Helvetica",20), textvariable = cadence_display, justify=CENTER, bg="#190000", fg = '#B0C4C2')

l2.pack(fill=BOTH)

# speed

l3 = Label(root, font = ("Helvetica",20), textvariable = speed_display, justify=CENTER, bg="#190000", fg = '#B0C4C2')

l3.pack(fill=BOTH)

# total Power

l4 = Label(root, font = ("Helvetica",20), textvariable = powertotal_display, justify=CENTER, bg="#190000", fg = '#B0C4C2')

l4.pack(fill=BOTH)

# function to read total power values out of a file

def get_power_total(SAVE_FILE):

power_total = 0

with open(SAVE_FILE, 'r') as inp:

for line in inp:

try:

num = float(line)

power_total += num

except ValueError:

print('{} is not a number!'.format(line))

power_total = round_number(power_total)

return power_total

# rounds numbers to 2 decimals

def round_number(inputNumber):

inputNumber = round(inputNumber, 2)

return inputNumber

# use formula for a 28" Wheel to determine Speed using cadence

def determine_speed(cadence):

speed = float(cadence)*0.356

speed = round_number(speed)

return speed

# write in document to determine total power output

def write_file(SAVE_FILE, power):

f = open(SAVE_FILE, "a+")

f.write(str(power) + '\n')

f.close()

# updates label

def update_label(power, cadence):

power_total = get_power_total(SAVE_FILE)

speed = determine_speed(cadence)

power_total += power

write_file(SAVE_FILE, power)

power_display.set("Power: {} W".format(power))

cadence_display.set("Cadence: {}".format(cadence))

speed_display.set("Speed : {} Km/h".format(speed))

powertotal_display.set("Total Power Output: {} W".format(power_total))

root.after(1000, power_data)

root.update_idletasks()

# find device

def device_found(self, device_number, transmission_type):

print("Detect monitor device number: %d, transmission type: %d" % (device_number, transmission_type))

# determine power

def power_data(eventCount, pedalDiff, pedalPowerRatio, cadence, accumPower, instantPower):

update_label(instantPower, cadence)

power = BicyclePower(antnode, network, callbacks = {'onDevicePaired': device_found,

'onPowerData': power_data})

# Unpaired, search:

power.open()

monitor = None

while True:

try:

time.sleep(1)

except keyboardInterrupt:

break

power.close()

antnode.stop()

# mainloop to display the window

root.after(1000, power_data)

root.mainloop()

我已经知道whiletrue语句会阻止我的Tkinter窗口打开,直到找到一个设备为止,这是不合标准的,但我没有想出更好的办法让它保持原样。在

任何建议,帮助或任何其他高度赞赏。在

提前干杯!在

编辑(对于任何对同一主题感兴趣或陷入同一主题的人):

在进一步检查了图书馆之后,我想打开电源()创建回调的无限循环,这将导致根.mainloop()永远无法到达。我还没有找到一种方法来干预回调循环以获取数据,在主循环中显示数据并继续执行回调循环。

我会尽力提供更多的信息和一个可能的解决方案,一旦我找到它。

如果您对此有想法或不同的方法,请随时投稿:)

编辑2:

由于ANT+模块本身读取和写入数据,一种方法可能是在文件中写入数据,然后让另一个脚本从文件中读取数据。但是,我不知道这在python中是否可行(类似于readonly模式而不阻止来自其他源的访问)。在

编辑3:

解决问题:

将脚本分为两部分(单独的脚本)。

第一个脚本:

读取ANT+数据并将其写入如下文件:

^{pr2}$

第二个脚本:

只读数据和赋值,如下所示:def readFile():

file = open("ultimateFile.txt", "r")

VALUE = file.readline()

file.close()

return VALUE

我将在2019年更新代码/脚本,并将更新后的代码/脚本上传到github。在

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值