【发布时间】:2020-05-16 06:44:30
【问题描述】:
我正在使用 Python 3.8.1 和 tkinter 版本 8.6。
我有一个 GUI 类 Pressureinput,它接受压力传感器模拟器的输入。我希望条目以 kPa 为单位(传感器的本机单位),但我也希望用户知道 psi 等效值是多少。因此,当用户更新 kpa 值时,我希望更新 psi 值,但我不希望用户能够手动更新 psi 值。我对两者都使用了一个输入框。它们以 242 kPa 的默认值开始。
我正在尝试使用validate="focusout" 在 kpa 输入框失去焦点后触发事件。
这是我的代码,因此您可以看到我正在尝试做什么。基本上,如果他们输入任何不是正数甚至整数的东西,我希望它自动将输入框中的值四舍五入,然后我还希望它更新等效的 psi。
我意识到我在 pressurevalid 函数中使用的方法不起作用,因为输入框对象 kpa 和 psi 是不可变的,它不会改变原始对象。
请注意,我已经设置了 StringVar 变量 psitext 和 kpatext。但是,每次我尝试在 pressurevalid 函数中使用它们时,都会收到错误消息,提示它们不存在。
我尝试过的所有其他方法都以无法运行的错误告终,我认为这至少说明了我想要做什么:
import tkinter as tkGUI
#global constants for conversion
global psi2kpa
global kpa2psi
psi2kpa = 6.894757
kpa2psi = 1 / psi2kpa
class Pressureinput(tkGUI.Frame):
def __init__(self,parent):
tkGUI.Frame.__init__(self,parent)
self.parent = parent
self.initialize()
def initialize(self):
kpatext = tkGUI.StringVar()
psitext = tkGUI.StringVar()
self.IDlabel = tkGUI.Label(self,text="Sensor ID (hex):")
self.IDlabel.grid(row=0, column=0)
self.ID = tkGUI.Entry(self)
self.ID.insert(0,"AABBCCDD")
self.ID.grid(row=0, column=1)
self.kpalabel = tkGUI.Label(self,text="Pressure (kPa):")
self.kpalabel.grid(row=1, column=0)
self.kpa = tkGUI.Entry(self)
self.kpa.insert(0,242)
self.kpa.grid(row=1, column=1)
self.psilabel = tkGUI.Label(self,text="Pressure (PSI):")
self.psilabel.grid(row=2, column=0)
self.psi = tkGUI.Entry(self, textvariable=psitext)
self.psi.insert(0,float(self.kpa.get())*kpa2psi)
self.psi.grid(row=2, column=1)
self.psi.config(state='disabled') #state = 'normal' to restore
vpressure = self.register(self.pressurevalid(self.kpa,self.psi))
self.kpa = tkGUI.Entry(self, textvariable=kpatext, validate="focusout", validatecommand=vpressure)
self.sendbutton = tkGUI.Button(self,text="Send Transmission",state="disabled",command=self.send_data)
self.sendbutton.grid(row=9,columnspan=2)
def pressurevalid(self,kpa,psi):
if len(kpa.get()) < 1:
kpa.delete(0,tkGUI.END)
kpa.insert(0,"0");
elif 2*int(round(float(kpa.get())) / 2) != int(kpa.get()):
kpa.delete(0,tkGUI.END)
kpa.insert(0,2 * int(round(float(kpa.get()))) / 2)
psi.config(state='normal')
psi.delete(0,tkGUI.END)
psi.insert(0,float(kpa.get())*kpa2psi)
psi.config(state='disabled')
return True
def send_data(self):
ID = int(self.ID.get(),16)
pressure = int(self.kpa.get())
if pressure >= 510:
pressure = 255
else:
pressure = int(round(pressure/2))
sendstring = str(ID) + "," + str(function_code) + "," + str(pressure)
print (sendstring)
【问题讨论】:
标签: python python-3.x tkinter tkinter-entry