在tkinter脚本中实现自定义数字代码

时间:2019-02-07 04:42:50

标签: python python-3.x tkinter

所以我一直在研究几乎完成的代码。这是一个简单的GUI程序,可根据输入动态运行特定的方程式。感谢该站点(wwii)上的用户,我能够在他提供的代码中使用自定义数字输入格式。我要做的最后一件事是实施他的代码以使所有代码协同工作。在我的代码中,有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时读取并转换这些输入字段,并在自定义中显示计算结果格式也是如此。

我知道这已经long绕了,但是,我希望这是有道理的。这是我的代码的副本(不是很长),还有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 :(得分:0)

因此wwii为您提供的代码可以在格式之间转换。因此,您无需为了使代码正常工作就可以对其进行处理。首先,将代码形式wwii移至程序的开头。然后,您只需要在函数Highcharts.SVGRenderer中更改2行。

第一个是:Highcharts.setOptions({ chart: { inverted: true, marginLeft: 135, type: 'bullet', events: { render: function() { var chart = this, point = chart.series[0].points[0], width = point.shapeArgs.height, height = point.shapeArgs.width, x = chart.plotLeft, xEnd = x + width, y = chart.plotTop + point.shapeArgs.x, dashWidth = 15, dashBreakWidth = 5, dashColor = '#000', dashElem, dashAmount, realDashBreakWidth; if (chart.dashedColl) { chart.dashedColl.forEach(function(oldDashElem) { oldDashElem.destroy(); }); } point.graphic.element.remove(); chart.dashedColl = []; dashAmount = Math.floor(width / (dashWidth + dashBreakWidth)); realDashBreakWidth = (width - dashAmount * dashWidth) / (dashAmount - 1); while (x < xEnd) { dashElem = chart.renderer.rect(x, y, dashWidth, height) .attr({ fill: dashColor }) .add() .toFront(); chart.dashedColl.push(dashElem); x += dashWidth + realDashBreakWidth; } } } }, title: { text: null }, legend: { enabled: false }, yAxis: { gridLineWidth: 0 }, plotOptions: { series: { pointPadding: 0.25, borderWidth: 0, color: 'red', targetOptions: { width: '200%' } } }, credits: { enabled: false }, exporting: { enabled: false } }); 您必须将其更改为: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()))

完成此操作后,您可以在测量#1站线位置测量#2站线位置附近的条目中输入1 + 20和1 + 40,然后在站线上的测量处获取转换后的结果。

所有这些操作的主要思想是在输入之后和任何计算之前进行转换(因此在第一行中进行更改),并在所有计算之后但是在显示输出之前进行转换(因此在输出中进行更改)。第二行)。

这是整个代码段:

side = float(format(side, '.3f'))