Реализация пользовательского числового кода в скрипте tkinter - PullRequest
0 голосов
/ 07 февраля 2019

Итак, я работал над небольшим количеством кода, который почти готов.Это простая программа с графическим интерфейсом, которая запускает конкретные уравнения на лету на основе входных данных.Благодаря пользователю на этом сайте (второй мировой войны) я могу использовать произвольный формат ввода чисел в предоставленном им коде.Последнее, что мне нужно сделать, это внедрить его код в мой, чтобы все это работало вместе.В моем коде есть 4 поля ввода, два из которых относятся к определенному местоположению на линии (здесь вводится пользовательский формат чисел) и два, которые относятся к измерениям из этих местоположений на линии в одну и ту же точку.После того, как все поля имеют данные, отображаются два результата.Одним из результатов является длина линии под прямым углом от линии.Вторым результатом является точное местоположение в строке для его размещения (именно здесь выводится пользовательский формат чисел).

Например, если я поместил места измерений в строку 120 и 140, с измерениями из этихместа 10 и 15, соответственно, я получаю результат 7,262 (длина линии под прямым углом от линии) и измерения 126,875.С кодом wwii, который мне помог, я хотел бы, чтобы в полях ввода 120 и 140, а в поле вывода 126,875 использовался числовой формат, который выглядел бы так: 1 + 20,00, 1 + 40,00 и 1 + 26,88.

Код wwii, который мне помог, выполняет прямое преобразование этих числовых форматов, но я хотел бы, чтобы эти поля ввода считывались и преобразовывались, когда он набирается как 1 + 20, и чтобы вычисление отображалосьв пользовательском формате, а также.

Я знаю, что это было долго, но я надеюсь, что это имеет смысл.Вот копия моего кода (не очень длинного) и кода, с которым мне помог wwii.Мне не понравилось, что я разделил на отдельные блоки кода, поэтому код wwii, который мне помог, добавлен внизу блока кода.

from tkinter import *
from math import *

def show_entry_fields():
     try:
          a, c, d, e, = float(e1.get()), float(e3.get()), float(e4.get()), float(e5.get())
          b = e - d
          s = (a + b + c) / 2
          height = (sqrt (s * (s - a) * (s - b) * (s - c)) * 2) / b
          height = float(format(height, '.3f'))
          height_label['text'] = str(height)
          side =((sqrt ((a ** 2) - (height ** 2))) + d)
          side = float(format(side, '.3f'))
          side_label['text'] = str(side)
     except ValueError:
          pass
     master.after(100, show_entry_fields)

master = Tk()
master.attributes("-topmost", True)
master.title("Triangulation Plotting")

Label(master, text="Measurement #1 Station Line Location").grid(row=1, column=0, sticky=W, pady=4)
e4 = Entry(master)
e4.grid(row=1, column=1, sticky=E)

Label(master, text="Triangulation Measurement #1").grid(row=2, column=0, sticky=W, pady=4)
e1 = Entry(master)
e1.grid(row=2, column=1, sticky=E)

Label(master, text="Measurement #2 Station Line Location").grid(row=3, column=0, sticky=W, pady=4)
e5 = Entry(master)
e5.grid(row=3, column=1, sticky=E)

Label(master, text="Triangulation Measurement #2").grid(row=7, column=0, sticky=W, pady=4)
e3 = Entry(master)
e3.grid(row=7, column=1, sticky=E, pady=4)

Label(master, text="Offset from station line").grid(row=8, column=0, sticky=W, pady=4)
height_label = Label(master, text="")
height_label.grid(row=8, column=1)

Label(master, text="Measurement on Station Line").grid(row=9, column=0, sticky=W, pady=4)
side_label = Label(master, text="")
side_label.grid(row=9, column=1)

master.after(100,show_entry_fields)
master.mainloop()

Custom number format code from wwii:
def convert(thing):
    if isinstance(thing, str):
        a,b = thing.split('+')
        b,*d = b.split('.')
        d = '00' if not d else d[0]
        thing = round(float(f'{a}{b}.{d}'), 2)
    elif isinstance(thing, (int,float)):
        thing = str(round(thing, 2))
        thing,*d = thing.split('.')
        d = '00' if not d else d[0]
        thing = thing if len(thing) > 2 else '0'+thing
        thing = f'{thing[:-2]}+{thing[-2:]}.{d}'
    return thing

Заранее спасибо за любую помощь.

1 Ответ

0 голосов
/ 07 февраля 2019

Таким образом, код, предоставленный вам wwii, может конвертироваться между форматами.Таким образом, вам не нужно ничего делать со своим кодом, чтобы он работал.Прежде всего, переместите кодовую форму второй мировой войны в начало вашей программы.Затем вам нужно всего лишь изменить 2 строки в функции show_entry_fields.

Первая: a, c, d, e = float(e1.get()), float(e3.get()), float(e4.get()), float(e5.get()) Вы должны изменить ее на: a, c, d, e = float(e1.get()), float(e3.get()), convert(str(e4.get())), convert(str(e5.get()))

Вторая -: side = float(format(side, '.3f')) Вы должны изменить его на: side = convert(float(format(side, '.3f')))

После этого вы можете ввести 1 + 20 и 1 + 40 в записи рядом с Измерение # 1 Расположение линии станции и Измерение# 2 местоположение линии станции , и вы получите конвертированный результат в Измерение на линии станции .

Основная идея всего этого - выполнять преобразования после ввода и долюбые вычисления (отсюда изменения в первой строке) и выполнять преобразование после всех вычислений, но до отображения выходных данных (отсюда изменения во второй строке).

Вот весь фрагмент кода:

from tkinter import *
from math import *


# Custom number format code from wwii:
def convert(thing):
    if isinstance(thing, str):
        a,b = thing.split('+')
        b,*d = b.split('.')
        d = '00' if not d else d[0]
        thing = round(float(f'{a}{b}.{d}'), 2)
    elif isinstance(thing, (int,float)):
        thing = str(round(thing, 2))
        thing,*d = thing.split('.')
        d = '00' if not d else d[0]
        thing = thing if len(thing) > 2 else '0'+thing
        thing = f'{thing[:-2]}+{thing[-2:]}.{d}'
    return thing


def show_entry_fields():
    try:
        a, c, d, e = float(e1.get()), float(e3.get()), convert(str(e4.get())), convert(str(e5.get()))
        b = e - d
        s = (a + b + c) / 2
        height = (sqrt (s * (s - a) * (s - b) * (s - c)) * 2) / b
        height = float(format(height, '.3f'))
        height_label['text'] = str(height)
        side =((sqrt ((a ** 2) - (height ** 2))) + b)
        side = convert(float(format(side, '.3f')))
        side_label['text'] = str(side)
    except ValueError:
        pass
    master.after(100, show_entry_fields)


master = Tk()
master.attributes("-topmost", True)
master.title("Triangulation Plotting")

Label(master, text="Measurement #1 Station Line Location").grid(row=1, column=0, sticky=W, pady=4)
e4 = Entry(master)
e4.grid(row=1, column=1, sticky=E)

Label(master, text="Triangulation Measurement #1").grid(row=2, column=0, sticky=W, pady=4)
e1 = Entry(master)
e1.grid(row=2, column=1, sticky=E)

Label(master, text="Measurement #2 Station Line Location").grid(row=3, column=0, sticky=W, pady=4)
e5 = Entry(master)
e5.grid(row=3, column=1, sticky=E)

Label(master, text="Triangulation Measurement #2").grid(row=7, column=0, sticky=W, pady=4)
e3 = Entry(master)
e3.grid(row=7, column=1, sticky=E, pady=4)

Label(master, text="Offset from station line").grid(row=8, column=0, sticky=W, pady=4)
height_label = Label(master, text="")
height_label.grid(row=8, column=1)

Label(master, text="Measurement on Station Line").grid(row=9, column=0, sticky=W, pady=4)
side_label = Label(master, text="")
side_label.grid(row=9, column=1)

master.after(100, show_entry_fields)
master.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...