首页 文章

来自另一个类的Tkinter条目插入

提问于
浏览
0

我现在正在学习一些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

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

    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()
    

    让我知道这个是否奏效 .

相关问题