另一个班级

时间:2018-03-29 01:19:56

标签: python tkinter

我正在学习一些tkinter,并且遇到了一个我似乎无法解决的问题。

我有一个类(名为' GUI'),其中我首先声明另一个类的对象(名为' client')然后创建一个带有输入字段的简单tkinter GUI用户输入的地址。

然后我有一个按钮,按下后,获取地址并将其传递给客户端类的功能。该函数调用库中的另一个函数,该函数传递给外部源('客户端')并获取该地址的布尔寄存器的值。

到此为止我有工作。

我现在想要使用该布尔寄存器的值更新tkinter GUI中的另一个输入字段。

以下是代码示例:

class GUI:
    def __init__(self, master):
        device = client()
        self.master = master
        #Define size (x,y) and position (top left is 0,0) of window
        master.geometry("800x400+300+300")
        #Disable window resize
        master.resizable(width=False, height=False)

        #GUI Controls
        lbl_read_discrete_output = Label(self.master, text="Read boolean register")
        lbl_read_discrete_output_address = Label(self.master, text="Address:")
        ent_read_discrete_output_address = Entry(self.master)
        btn_read_discrete_output_address = Button(self.master, text='READ', command=lambda: device.read_discrete_output(int(ent_read_discrete_output_address.get())))
        ent_read_discrete_output_value = Entry(self.master, state='disabled')

        #GUI Layout
        lbl_read_discrete_output.grid(column=0, row=6, padx=5, pady=5)
        lbl_read_discrete_output_address.grid(column=0, row=7, padx=5, pady=5)
        ent_read_discrete_output_address.grid(column=1, row=7, padx=5, pady=5)
        btn_read_discrete_output_address.grid(column=2, row=7, padx=5, pady=5)
        ent_read_discrete_output_value.grid(column=3, row=7, padx=5, pady=5)

class client:
    def __init__(self):
        pass

    def read_discrete_output(self, address):
    data = self._client.read_coils(address-1, 1).bits[0:1]
    if not data[0]:
        #Update entry field 'ent_read_discrete_output_value' with "FALSE"
    else:
        #Update entry field 'ent_read_discrete_output_value' with "TRUE"

def main():
    #Create GUI object
    root = Tk()
    app = GUI(root)
    root.mainloop()

if __name__ == '__main__':
    main()

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

你可以这样解决这个问题:

import tkinter as tk
from tkinter import *
from pymodbus.client.sync import ModbusTcpClient as ModbusClient


class GUI:
    def __init__(self, master):
    self.master = master

    #GUI Controls
    lbl_read_discrete_output = Label(self.master, text="Read boolean register")
    lbl_read_discrete_output_address = Label(self.master, text="Address:")
    self.ent_read_discrete_output_address = Entry(self.master)
    btn_read_discrete_output_address = Button(self.master, text='READ', command=lambda: device.read_discrete_output(int(self.ent_read_discrete_output_address.get())))
    self.ent_read_discrete_output_value = Entry(self.master, state='disabled')

    #GUI Layout
    lbl_read_discrete_output.grid(column=0, row=6, padx=5, pady=5)
    lbl_read_discrete_output_address.grid(column=0, row=7, padx=5, pady=5)
    self.ent_read_discrete_output_address.grid(column=1, row=7, padx=5, pady=5)
    btn_read_discrete_output_address.grid(column=2, row=7, padx=5, pady=5)
    self.ent_read_discrete_output_value.grid(column=3, row=7, padx=5, pady=5)
    self.x=self.ent_read_discrete_output_address.get()
    print(self.x) 
    device=clientx(self.ent_read_discrete_output_value,self.ent_read_discrete_output_address.get())

class clientx():
    def __init__(self,ent,address):
    self.address=address
    self.ent=ent
    def read_discrete_output(self, address):
        with ModbusClient('127.0.0.1') as client:
            data = self.client.read_coils(address-1, 1).bits[0:1]

        if not data[0]:
            self.ent.config(state="disabled")
        else:
            self.ent.config(state="disabled")

def main():
    #Create GUI object
    root = tk.Tk()
    app = GUI(root)
    root.mainloop()

if __name__ == '__main__':
    main()

让我知道这是否有效。