python - 从另一个 Py 文件传递变量
问题描述
所以我正在尝试使用 tkinter 制作一个 GUI,它应该从其他一些微控制器读取文件。为此,我制作了一个 Uart.py,我很确定它可以正常工作。然后我尝试将它的“工作”传递给另一个 py 文件,我在其中有我的 GUI。但我无法让那部分工作,我从 Uart.py 导入
我的 Uart.py 代码
import serial
import time
data = ""
dataTemp = "b'temperature temp read \r\n'"
dataPh = "b'ph probe read \r\n'"
value = ""
#dataWater = "b'ph dispenser write ' +str(int(waterAmount.get())1000).encode('ascii') + b' \r\n'"
class uart(object):
uart = serial.Serial('/dev/serial0', baudrate=9600)
def write(self, data):
self.uart.write(data.encode())
print("sent")
time.sleep(3)
def read(self, value):
while True:
self.value = self.uart.readline()
time.sleep(2)
print(self.value)
value = self.value
self.uart.flush()
return value
if __name__ == '__main__':
while True:
def tempUart():
myTemp = uart()
myTemp.write(data=dataTemp)
myTemp.read(value)
def phUart():
myPh = uart()
myPh.write(data=dataPh)
myPh.read(value)
# def waterUart():
# water = uart()
# water.write(data=dataWater)
这是我的主程序 GUI.py,我将其导入并通过调用 def phUart 设置 ph 的值
import sys
from Uart import *
if sys.version_info[0] == 2:
from Tkinter import *
else:
from tkinter import *
PhSet = Uart.phUart()
tempSet = Uart.tempUart()
class gui:
def __init__(self):
self.tk = Tk()
self.tk.attributes('-fullscreen', 'True')
self.ph = Label(fg="black", background="#D6D7D6",text = "Ph: ",font=("Helvetica", 40, "bold"))
self.ph.grid(column=0, row=0)
self.temp = Label(fg="black", background="#D6D7D6",text = "Temp: ",font=("Helvetica", 40, "bold"))
self.temp.grid(column=0, row=4)
self.klor = Label(fg="black", background="#D6D7D6", text="Klortabletter tilbage: ", font=("Helvetica", 20,"bold"))
self.klor.grid(column=8,row=8)
# self.waterAmount = Spinbox(from_=1000,to=100000,increment=1000,width=10, font=("Helvetica", 20,"bold"))
# self.waterAmount.grid(column=0, row=6)
# self.waterButtonSet = Button(text = 'Set water amount',command = set_waterAmount,font=("Helvetica",10,"bold"))
# self.waterButtonSet.grid(column=0,row=6)
phSet = dataPh
self.phSet = Label(width=5, fg="black", background="#D6D7D6", textvariable=dataPh, font=("Helvetica", 20,"bold"))
self.phSet.grid(column=1, row=0)
self.tempSet = Label(width=5, fg="black", background="#D6D7D6", textvariable=ph, font=("Helvetica", 20,"bold"))
self.tempSet = grid(column=1, row=4)
## KLOR ##
if __name__ == '__main__':
gui = gui()
gui.tk.mainloop()
我刚开始用 python 编程,所以我什至不确定这是否可行。
解决方案
我看到的问题Uart.py
是运行它的主要方法。如果您想使用 Uart 作为自定义模块,那么您不想Uart.py
运行__main__
循环。相反,Uart.py
应该看起来像:
import serial
import time
data = ""
dataTemp = "b'temperature temp read \r\n'"
dataPh = "b'ph probe read \r\n'"
value = ""
#dataWater = "b'ph dispenser write ' +str(int(waterAmount.get())1000).encode('ascii') + b' \r\n'"
class uart(object):
uart = serial.Serial('/dev/serial0', baudrate=9600)
def write(self, data):
self.uart.write(data.encode())
print("sent")
time.sleep(3)
def read(self, value):
while True:
self.value = self.uart.readline()
time.sleep(2)
print(self.value)
value = self.value
self.uart.flush()
return value
然后,当在 中使用你的uart()
对象时GUI.py
,你会像这样使用它:
import sys
from Uart import *
if sys.version_info[0] == 2:
from Tkinter import *
else:
from tkinter import *
class gui:
def __init__(self):
self.phSet = uart()
self.phSet.write(dataPh)
self.tempSet = uart()
self.tempSet.write(dataTemp)
self.tk = Tk()
self.tk.attributes('-fullscreen', 'True')
self.ph = Label(fg="black", background="#D6D7D6",text = "Ph: ",font=("Helvetica", 40, "bold"))
self.ph.grid(column=0, row=0)
self.temp = Label(fg="black", background="#D6D7D6",text = "Temp: ",font=("Helvetica", 40, "bold"))
self.temp.grid(column=0, row=4)
self.klor = Label(fg="black", background="#D6D7D6", text="Klortabletter tilbage: ", font=("Helvetica", 20,"bold"))
self.klor.grid(column=8,row=8)
# self.waterAmount = Spinbox(from_=1000,to=100000,increment=1000,width=10, font=("Helvetica", 20,"bold"))
# self.waterAmount.grid(column=0, row=6)
# self.waterButtonSet = Button(text = 'Set water amount',command = set_waterAmount,font=("Helvetica",10,"bold"))
# self.waterButtonSet.grid(column=0,row=6)
self.phSet = Label(width=5, fg="black", background="#D6D7D6", textvariable=dataPh, font=("Helvetica", 20,"bold"))
self.phSet.grid(column=1, row=0)
self.tempSet = Label(width=5, fg="black", background="#D6D7D6", textvariable=ph, font=("Helvetica", 20,"bold"))
self.tempSet = grid(column=1, row=4)
## KLOR ##
请注意此处所做的一些更改:
- 由于您使用,因此在实例化新对象时
import * from Uart
无需指定。这意味着我们可以在对象的构造函数中使用. 这同样适用于。Uart.uart()
uart()
phSet
gui
self.phSet = uart()
tempSet
- 从 中删除该
phSet = phData
行GUI.py
。这是因为,使用您版本的语法Uart.py
,看起来您使用该write()
函数将 phData 写入 phSet。您可以在gui()
对象的构造函数中执行此操作,就像我在上面的代码中所做的那样。 - 作为前一点的扩展,没有理由指定
data=foo
何时将参数传递给write()
函数。该data
参数不需要关键字参数。在此处阅读有关默认参数和关键字参数的更多信息。
如果我误解了您的代码的目的,并且实施了不正确的“修复”,我深表歉意。我认为你所得到的和你需要的只是在 Python 中使用自定义模块,并且有很多方法可以实现这一点。我故意省略了为你重写一个__main__
函数,因为你可以这样做,GUI.py
或者你可以编写一个新的app.py
或类似的东西来运行你的__main__
函数,这让你可以更好地控制向自定义模块添加函数和类你在别处写。
希望这可以帮助!
推荐阅读
- python - 为什么我在管理面板中创建的 Post 模型没有显示在管理面板中?
- javascript - 未捕获的类型错误:无法读取 chrome 未注册的 null 属性“classList”(试图显示和消失标题)
- python - 以 Python 变量为参数的 Shell 脚本
- python - 如何使用 xpath 创建循环?
- matlab - 错误:在 NSGA II 中,此操作的数组大小不兼容
- service - 如何使用prometheus operator service monitor监控kubernetes pod中未运行的外部服务
- amazon-web-services - 使用 AWS CLI,我如何获得显示我的 API 网关已服务多少请求的数字?
- spring - Okta 无效令牌
- python - 序列后的python字符串连接
- android - Firestore 搜索数组包含多个值 Android