从另一个Py文件传递varibel

时间:2019-12-10 15:19:50

标签: python user-interface tkinter python-import

所以我正在尝试使用tkinter制作GUI,该GUI应该从其他一些微型控制器读取文件。 为此,我制作了一个Uart.py,我可以肯定它正在正常运行。然后我尝试将其“工作”传递到另一个我拥有GUI的py文件中,但是我无法从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编程,所以我什至不确定这是否可行。

1 个答案:

答案 0 :(得分:1)

我看到的问题是 //Init WebSocketClient client = new StandardWebSocketClient(); WebSocketStompClient stompClient = new WebSocketStompClient(client); stompClient.setMessageConverter(new MappingJackson2MessageConverter()); StompSessionHandler sessionHandler = new CustomStompSessionHandler(); //Connect StompSession stompSession = stompClient.connect("ws://localhost:8080/ws", sessionHandler).get(); //Subscribe stompSession.subscribe("/topic/public", sessionHandler); //Send Message stompSession.send("/app/chat.addUser", new ChatMessage(MessageType.JOIN, "New User Added")); stompSession.send("/app/chat.sendMessage", new ChatMessage(MessageType.CHAT, "Test Message", "Test username")); 正在运行其main方法。如果要将Uart用作自定义模块,则不希望 //Init List<Transport> transports = new ArrayList<>(2); transports.add(new WebSocketTransport(new StandardWebSocketClient())); transports.add(new RestTemplateXhrTransport()); SockJsClient sockJsClient = new SockJsClient(transports); //Connect (Handshake) WebSocketSession webSocketSession = sockJsClient.doHandshake(new CustomWebSocketHandler(), "ws://localhost:8080/ws").get(); //HOW CAN I SUBSCRIBE ????? //Send Message (To where? Which Path? Which topic) WebSocketMessage webSocketMessage = new TextMessage(new String("test Message").getBytes()); webSocketSession.sendMessage(webSocketMessage); 运行Uart.py循环。相反,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()

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

  1. 由于使用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()对象的构造函数中声明phSetgui也是如此。
  2. self.phSet = uart()中删除了tempSet行。这是因为,使用您的phSet = phData版本的语法,似乎您使用了GUI.py函数将phData写入phSet。您可以像上面的代码中那样在Uart.py对象的构造函数中执行此操作。
  3. 作为上一点的扩展,在将参数传递给write()函数时没有理由指定gui()data=foo参数不需要关键字参数。 Undefined Behavior

如果我误解了您的代码的目的,并且实施了错误的“修复”,我深表歉意。我认为您正在获得什么,而您所需要的只是在Python中使用自定义模块,并且您可以实现多种方式。我特意省去了为您重新编写write()函数的步骤,因为您可以在data中进行操作,也可以编写新的__main__或类似方法来运行{{ 1}}函数,这使您可以更好地控制将函数和类添加到在其他地方编写的自定义模块中。

希望这会有所帮助!