Я использую Python 3.8.1 с tkinter версии 8.6.
У меня есть класс GUI, Pressureinput, который принимает входные данные для симулятора датчика давления. Я хочу, чтобы запись была в единицах кПа (исходные единицы измерения датчика), но я также хочу, чтобы пользователь знал, что такое эквивалент в фунтах на квадратный дюйм. Итак, когда пользователь обновляет значение kpa, я хочу, чтобы значение psi обновлялось, но я не хочу, чтобы пользователь мог обновлять значение psi вручную. Я использую поле ввода для обоих. Они начинаются со значения по умолчанию 242 кПа.
Я пытаюсь использовать 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)