Я пытаюсь создать программу, которая читает сигналы ANT и отображает их в окне TKinter.Чтобы отобразить изменяющиеся значения, я обновляю метки (в бесконечном цикле), что до сих пор работает, но всякий раз, когда я пытаюсь переместить окно, программа вылетает (нет ответа).Итак, вот что (финальная программа) должна делать:
- Получать и сохранять данные ANT, которые я читаю с другим файлом (который дает мне силу и частоту кадров)
- Округлять числадо 2-3 десятичных знаков (макс.)
- Считать общую выходную мощность из файла
- Записать данные о мощности в файл (приложение)
- Сумма общей мощностивыходные данные
- отображают текущую скорость, частоту кадров, мощность и общую выходную мощность
Мой код:
# imports
import random
import time
from tkinter import *
# creating root tkinter Window
root = Tk()
root.title("ANT+ Live Data")
# defining Text Variables
running = 0
SAVE_FILE = "power_doc.txt"
HEADLINE_TEXT = StringVar()
HEADLINE_TEXT.set('')
HEADLINE_M = StringVar()
HEADLINE_M.set('')
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 Window Size
root.geometry("800x600")
# creating Label Frame to wrap labels
frame = LabelFrame(root)
frame.pack(padx=20, pady=20)
# creating labels, Headline 1
slabel = Label(root, font = ("Helvetica",48) ,textvariable = HEADLINE_M, justify=CENTER, bg="#FFFFFF", fg = '#000000')
slabel.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
# generate random Numbers for testing purposes
def randomize_number(inputNumber):
inputNumber = float(inputNumber)*random.uniform(0.99, 1.01)
inputNumber = round_number(inputNumber)
return inputNumber
# 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
def get_power(cadence):
power = float(cadence)*0.8
power = round_number(power)
return power
# dummy function to test-print Values, redundant in current state
def print_values(x1, x2, x3):
print("Leistung: {} W Trittfrequenz: {} Geschwindigkeit: {} Km/H" .format(x1, x2, x3))
# 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()
def update_label():
power_total = get_power_total(SAVE_FILE)
cadence = int(50)
cadence = randomize_number(cadence)
root.after(100)
power = get_power(cadence)
root.after(100)
speed = determine_speed(cadence)
root.after(100)
power_total += power
write_file(SAVE_FILE, power)
power_display.set("Leistung: {} W".format(power))
cadence_display.set("Trittfrequenz: {}".format(cadence))
speed_display.set("Geschwindigkeit : {} Km/h".format(speed))
powertotal_display.set("Gesamtleistung seit 10 Uhr: {} W".format(power_total))
root.after(1000)
root.update_idletasks()
# mainloop to display the window
while True:
root.after(1000, update_label())
root.mainloop()
Это в основном просто черновик для импорта ANTданные, следовательно, есть некоторые числа, генерируемые случайным образом, чтобы показать, работает ли функция обновления метки.Я довольно плохо знаком с программированием на Python (или вообще с программированием), так что я почти уверен, что есть и другие проблемы с моим кодом, но, возможно, у кого-то есть предложение, как решить мою проблему.Любая помощь или предложения приветствуются.
Приветствия заранее!
Редактировать: Решено!спасибо Джейсон!
Изменения должны были быть сделаны здесь:
def update_label():
power_display.set("Leistung: {} W".format(power))
cadence_display.set("Trittfrequenz: {}".format(cadence))
speed_display.set("Geschwindigkeit : {} Km/h".format(speed))
powertotal_display.set("Gesamtleistung seit 10 Uhr: {} W".format(power_total))
root.after(1000, update_label)
root.update_idletasks()
root.after(1000, update_label)
root.mainloop()