从另一个Py-fi传递varibel

2024-04-25 17:11:40 发布

您现在位置:Python中文网/ 问答频道 /正文

因此,我试图使用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编程,所以我甚至不确定这是否可行


Tags: importselfdatavaluedefcolumnphgrid
1条回答
网友
1楼 · 发布于 2024-04-25 17:11:40

我看到的问题是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

然后,在GUI.py中使用uart()对象时,您可以这样使用它:

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 ##

请注意此处所做的一些更改:

  1. 由于使用了import * from Uart,因此在实例化新的uart()对象时不需要指定Uart.uart()。这意味着我们可以用self.phSet = uart()gui对象的构造函数中声明phSet。这同样适用于tempSet
  2. GUI.py中删除了phSet = phData行。这是因为,使用Uart.py版本中的语法,您似乎使用了write()函数将phData写入phSet。您可以在gui()对象的构造函数中执行此操作,正如我在上述代码中所做的那样
  3. 作为前一点的扩展,在向write()函数传递参数时,没有理由指定data=foodata参数不需要关键字参数Read more about default arguments and keyword arguments here.

如果我误解了您代码的目的,并且实现了不正确的“修复”,我很抱歉。我认为您得到的和需要的只是在Python中使用自定义模块,并且有很多方法可以实现这一点。我故意不为您重新编写__main__函数,因为您可以在GUI.py中完成,也可以编写一个新的app.py或类似的东西来运行__main__函数,这样您就可以更好地控制向其他地方编写的自定义模块添加函数和类

希望这有帮助

相关问题 更多 >