gpt4 book ai didi

python - 使用Python更新GUI中显示的值:已修订(新困难)

转载 作者:行者123 更新时间:2023-12-01 05:02:57 25 4
gpt4 key购买 nike

我在开发满足自己需求的GUI时遇到了一些麻烦。我正在使用Tkinter和Python,并且已经复习了关于该主题的所有内容,但均未成功。

所以这是我的情况:

背景

我正在开发一个可控制的环境,以维持用户设定的温度和压力。我有一个相当广泛的程序,该程序编写并用于控制和记录压力分量。基本上,它使用线程来同时获取用户输入,控制执行器,记录数据以及仅用于压力的所有操作。最初的目的是对温度进行现场检查,然后从那里进行检查。在开发过程中,很明显,同时记录和显示温度比不这样做更有用。用热电偶测量温度,然后通过DAQ分配温度以获取该数据。我是一名工程师,所以编程不是我的本性,但是我已经完成了一些在线python教程,并且相信对这种语言具有“实际的”知识(松散地使用)。

程序

因此,我着手开发现有程序的新部分。我使用和开发的功能似乎可以满足我的需求。我可以访问DAQ上的所需端口,读取和存储值,并使用导入的功能转换电压(又名,我知道它可以工作)。我目前已将其配置为打印每个值,以便可以检查这些值,并对命令行中的结果感到满意。我将此功能开发为一个单独的程序,该程序将集成到现有程序中,但是由于一些时髦的硬件限制,它是这样做的,但是现在,我正在研究的只是它自己的程序。

现在,问题是:

所以我有工作功能,但需要将它们集成到我的GUI中。如果可以使用,GUI将仅显示一个按钮“ get temp”,并标记“ Temperature:XX”,其中XX将显示程序检索和转换的温度。我的问题与XX值的更新有关。我能够运行必要的功能并将结果存储到变量中,但似乎无法弄清楚如何显示和更新它。我已经在Tkinter上阅读了.get()和.set(value),但是还无法通过几次迭代使它起作用。我得到的最接近的温度是0.0或PY_VARXX。 GUI如下所示

图形用户界面


我怀疑我的问题可能与程序的结构有关。生成GUI的代码在这里:

import LabJackPython
import u3
import sys
import getopt
from threading import Thread
from time import time, sleep
from Tkinter import Tk, Frame, Button, Toplevel, Label, Entry, StringVar, DoubleVar
import tkMessageBox
from datetime import datetime, date

#define global variables
v1 = None
g_get = None
Gain = None
GainE = None
VoltE = None
g_Conv = None
vv1 = None
vr1 = None
v2 = None
vread = None
CJT = None
T1 = None
T1C = None

#configure DAQ
d = u3.U3()
d.configIO(FIOAnalog = 12)

#define functions
#voltage to temperature conversion
def VTT(v, voff, gain):
global v1, T1, vread, CJT, Gain
vread = d.getAIN(2)
v = vread
CJT = d.getTemperature()
gain
if v > 14.9:
print "Invalid Input"
else:
v1 = (v - voff)/gain
T1 = LabJackPython.TCVoltsToTemp(LabJackPython.LJ_ttJ, v1, CJT)
print "vread:", vread
print "v:", v
print "v1:", v1
print "CJT:", CJT
print "T1 (K):", T1

#run VTT on button click with fixed values
def assign(event):
global T1C
VTT(1, 1.25, 201)
T1C = T1 - 273.15
print "T (C):", T1C

#initiate GUI
def main():
global v1, T1, vread, CJT, Gain
root = Tk()
root.title("Temp")

Temp = Frame(root)
Temp.grid()

TempL = Label(Temp, text = "Temperature:", font = 20)
TempL.grid(row = 4, column = 0)
#Define variables
T1C = DoubleVar()
T1C1 = DoubleVar()
T1C1.set(T1C)
#variable
Temperature = Label(Temp, textvariable = T1C1, font = 20)
Temperature.grid(row = 4, column = 1)
#button
g_get = Button(Temp, text = "get temp", height = 2, width = 10)
g_get.bind("<Button-1>", assign)
g_get.grid(row = 2, column = 0)


try:
root.mainloop ()
except KeyboardInterrupt:
print "Keyboard Interrupt Caught!"

exit()


任何人都可以提供的任何帮助都很棒。如果有什么我可以做的更好的事情,我也很乐意听到。我对代码约定或最佳实践的了解不多。我敢肯定代码有很多错误,但是首先我要关注的是规避问题并让T1C的值显示在GUI中。

感谢大家

编辑:我对类方法(而不是使用全局变量)的反应是,当重新集成到较大的程序中时,我将需要能够访问T1C的值(或T1或T1C1,它们基本上是相同的)在多个地方。一个函数正在生成值,而另一个函数将需要检索该值并将其写入日志文件,并且该值将需要在GUI中显示和更新。最终的集成将不是基于按钮的方法,而是按钮可供我在开发中使用。在重新集成中,VTT将连续运行并每隔0.2秒左右写入日志文件,同时还需要读取压力和时间。我可以为这个更大的第一个程序提供代码,但是这很荒谬,而且我不知道它在使用它的上下文之外会产生多大的意义。现在让我来解释一下。

EDIT2:因此,基于关于使用基于类的方法构造GUI的建议,我尝试从头开始重新构建它,并使我认为这是一个更具逻辑性的程序,但仍然存在困难,但是感谢您的帮助。

最佳答案

快速解决方案:

通过重新分配另一个值,原样的代码“破坏”了保存在DoubleVar()T1C变量中的准全局assign()

assign(event):
global T1C
VTT(1, 1.25, 201)
T1C = T1 - 273.15 # shall rather read T1C.set( T1 - 273.15 )
print "T (C):", T1C # shall rather read print "T [C]:", T1C.get()


一个干净且可扩展的GUI附加解决方案:

将代码重构为基于类的方法,以便它


封装 <controller> -part device-read-ing和
具有所有 <model>变量的 <state>部分(重复使用和受保护的全班级)
允许智能和流畅的GUI集成,因为Class已准备好用于其 <visual> -part层
避免使用 global变量(可以并且应该依赖Class-instance变量“在内部”是它自己的封装容器……没有其他错误/错误/错误将破坏您的控制值)

关于python - 使用Python更新GUI中显示的值:已修订(新困难),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25673848/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com