Окно Tkinter падает при нажатии, вероятно, из-за бесконечного цикла.Python 3.7.1 - PullRequest
0 голосов
/ 11 декабря 2018

Я пытаюсь создать программу, которая читает сигналы 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...