我有一对盒子。一是针对劳动时间。另一个是劳务费。当您输入工时金额时,它会自动计算并填充人工美元框。当您输入人工金额时,它会自动计算并填充工时框。一切都按预期进行。我在函数中使用变量.get() 在输入数字时从输入框中检索数据,然后逐个击键更新数学。
我遇到的问题是,当劳动力美元等于长小数时,计算会稍微出错。最终发生的情况是,在每小时 70.00 的劳动费率下,如果我输入劳动美元金额(例如 127.00),它会自动填充/显示 1.81 小时的劳动,这正是我想要发生的情况。但按每小时 70.00 计算,1.81 劳动小时等于 126.70,因为 127.00 除以每小时 70.00 就是 1.814285714285714 劳动小时,而不是 1.81。
因此,只需松开选项卡按钮即可运行的绑定会导致输入的劳动力美元从 127.00 更改为 126.70。为了让数字保持不变,我需要它能够根据 1.814285714285714 * 70.00 的完整小数进行计算,但出于美观目的,我只希望它显示前两位小数。
我不知道从哪里开始寻找能够在显示截断版本的同时使用完整数字进行计算的方法。
我可以根据需要提供我正在使用的代码,但我认为这个问题非常简单。如果有人可以提供建设性指导,我们将不胜感激。
编辑:添加代码
IE = {}
for i in range(117):
IE[i] = None
def lh_1(event):
lha = lhbox1.get()
if lha.replace('.','',1).isnumeric() == True:
IE[7] = float(lhbox1.get())
IE[8] = float(IE[7])*float(ratesbox1.get())
lbox1.delete(0, tkinter.END)
lbox1.insert(0, "${:.2f}".format(float(IE[8])))
print(IE[7])
print(IE[8])
elif lhbox1.get() == ".":
IE[7] = lhbox1.get()
lbox1.delete(0, tkinter.END)
elif lhbox1.get() == "":
lhbox1.delete(0, tkinter.END)
IE[7] = None
lbox1.delete(0, tkinter.END)
else:
lhbox1.delete(0, tkinter.END)
lhbox1.insert(0, IE[7])
def lh_1_enter(event):
if IE[7] != None:
lhbox1.delete(0, tkinter.END)
lhbox1.insert(0, "{:.2f}".format(float(IE[7])))
def lh_1_leave(event):
if IE[7] != None:
lhbox1.delete(0, tkinter.END)
lhbox1.insert(0, "{:.2f}".format(float(IE[7])))
lhfrm1 = tkinter.Frame(master=wofrm, bg="#b2b4b7", width=48, height=25, borderwidth=2, relief=tkinter.SUNKEN)
lhfrm1.place(x=902, y=110)
lhbox1 = tkinter.Entry(master=wofrm, bg="#b2b4b7", fg="#000000", width=6, borderwidth=0, relief=tkinter.FLAT)
lhbox1.place(x=908, y=114)
WOBOXES.append(lhbox1)
lhbox1.bind("<KeyRelease>", lh_1)
lhbox1.bind("<FocusIn>", lh_1_enter)
lhbox1.bind("<FocusOut>", lh_1_leave)
def l_1(event):
la = lbox1.get()
if la.replace('.','',1).isnumeric() == True:
IE[8] = float(lbox1.get())
IE[7] = float(IE[8])/float(ratesbox1.get())
lhbox1.delete(0, tkinter.END)
lhbox1.insert(0, "{:.2f}".format(IE[7]))
print(IE[8])
print(IE[7])
elif lbox1.get() == ".":
IE[8] = lbox1.get()
lhbox1.delete(0, tkinter.END)
elif lbox1.get() == "":
lbox1.delete(0, tkinter.END)
IE[8] = None
lhbox1.delete(0, tkinter.END)
else:
lbox1.delete(0, tkinter.END)
lbox1.insert(0, "{:.2f}".format(float(IE[8])))
def l_1_enter(event):
if IE[8] != None:
lbox1.delete(0, tkinter.END)
lbox1.insert(0, "{:.2f}".format(float(IE[8])))
def l_1_leave(event):
if IE[8] != None:
lbox1.delete(0, tkinter.END)
lbox1.insert(0, "${:.2f}".format(float(IE[8])))
lfrm1 = tkinter.Frame(master=wofrm, bg="#b2b4b7", width=70, height=25, borderwidth=2, relief=tkinter.SUNKEN)
lfrm1.place(x=952, y=110)
lbox1 = tkinter.Entry(master=wofrm, bg="#b2b4b7", fg="#000000", width=10, borderwidth=0, relief=tkinter.FLAT)
lbox1.place(x=958, y=114)
WOBOXES.append(lbox1)
lbox1.bind("<KeyRelease>", l_1)
lbox1.bind("<FocusIn>", l_1_enter)
lbox1.bind("<FocusOut>", l_1_leave)
所以,这就是我解决问题的方法。
首先,我将事件更改为
<KeyPress>
而不是 <KeyRelease>
。通过这样做,它不会仅通过按 Tab 键进入“条目”框来自动运行该事件。释放 Tab 键会在它已经位于框中之后触发 <KeyRelease>
事件,这将导致它 variable.get()
输入框的内容并进行导致我的问题的计算。但使用 <KeyPress>
时,不会触发该事件,因为按键发生在 进入输入框之前。
接下来,我从 cmd 提示符添加了带有 keyboard
的
pip3 install keyboard
模块。然后我更新了 def lh_1(event)
的代码以包含一个简单的
if
语句。if keyboard.read_key() != "tab":
一旦我进入输入框,如果按下任何键除了
tab 键,它会运行函数的其余部分,测试数字是否为数字,是否包含小数等。但如果它是 Tab 键,那么它什么都不做,字典中存储的值保持不变。这本质上是检查我是否真正更改了输入框的内容,或者只是通过 Tab 键浏览它。最终代码如下所示:
def lh_1(event):
if keyboard.read_key() != "tab":
lha = lhbox1.get()
if lha.replace('.','',1).isnumeric() == True:
IE[7] = float(lhbox1.get())
IE[8] = float(IE[7])*float(ratesbox1.get())
lbox1.delete(0, tkinter.END)
lbox1.insert(0, "${:.2f}".format(float(IE[8])))
elif lhbox1.get() == ".":
IE[7] = lhbox1.get()
lbox1.delete(0, tkinter.END)
elif lhbox1.get() == "":
lhbox1.delete(0, tkinter.END)
IE[7] = None
lbox1.delete(0, tkinter.END)
else:
lhbox1.delete(0, tkinter.END)
lhbox1.insert(0, IE[7])
def lh_1_enter(event):
if IE[7] != None:
lhbox1.delete(0, tkinter.END)
lhbox1.insert(0, "{:.2f}".format(float(IE[7])))
def lh_1_leave(event):
if IE[7] != None:
lhbox1.delete(0, tkinter.END)
lhbox1.insert(0, "{:.2f}".format(float(IE[7])))
lhfrm1 = tkinter.Frame(master=wofrm, bg="#b2b4b7", width=48, height=25, borderwidth=2, relief=tkinter.SUNKEN)
lhfrm1.place(x=902, y=110)
lhbox1 = tkinter.Entry(master=wofrm, bg="#b2b4b7", fg="#000000", width=6, borderwidth=0, relief=tkinter.FLAT)
lhbox1.place(x=908, y=114)
WOBOXES.append(lhbox1)
lhbox1.bind("<KeyPress>", lh_1)
lhbox1.bind("<FocusIn>", lh_1_enter)
lhbox1.bind("<FocusOut>", lh_1_leave)
def l_1(event):
la = lbox1.get()
if la.replace('.','',1).isnumeric() == True:
IE[8] = float(lbox1.get())
IE[7] = float(IE[8])/float(ratesbox1.get())
lhbox1.delete(0, tkinter.END)
lhbox1.insert(0, "{:.2f}".format(IE[7]))
elif lbox1.get() == ".":
IE[8] = lbox1.get()
lhbox1.delete(0, tkinter.END)
elif lbox1.get() == "":
lbox1.delete(0, tkinter.END)
IE[8] = None
lhbox1.delete(0, tkinter.END)
else:
lbox1.delete(0, tkinter.END)
lbox1.insert(0, "{:.2f}".format(float(IE[8])))
def l_1_enter(event):
if IE[8] != None:
lbox1.delete(0, tkinter.END)
lbox1.insert(0, "{:.2f}".format(float(IE[8])))
def l_1_leave(event):
if IE[8] != None:
lbox1.delete(0, tkinter.END)
lbox1.insert(0, "${:.2f}".format(float(IE[8])))
lfrm1 = tkinter.Frame(master=wofrm, bg="#b2b4b7", width=70, height=25, borderwidth=2, relief=tkinter.SUNKEN)
lfrm1.place(x=952, y=110)
lbox1 = tkinter.Entry(master=wofrm, bg="#b2b4b7", fg="#000000", width=10, borderwidth=0, relief=tkinter.FLAT)
lbox1.place(x=958, y=114)
WOBOXES.append(lbox1)
lbox1.bind("<KeyPress>", l_1)
lbox1.bind("<FocusIn>", l_1_enter)
lbox1.bind("<FocusOut>", l_1_leave)