Как перенести данные из одного класса в другой в Python? - PullRequest
0 голосов
/ 20 сентября 2019

У меня есть кнопка Connect и кнопка Disconnect в main.py.

Кнопка Connect включена, а кнопка Disconnect отключена.Когда я нажимаю кнопку Connect, вызывается лямбда-выражение, которое переключает соединение устройства (toggle_device_connection) в другом классе Modbus в другом файле modbus.py.У меня есть другое лямбда-выражение сразу после него, которое отключит кнопку «Подключить» и активирует кнопку Disconnect и наоборот (toggle_buttons).

Проблема заключается в том, что всякий раз, когда соединение в 1-м лямбда-выражении вызываетисключение (например, соединение было неудачным), оно все равно будет переключать кнопку с включенного на отключенное, что нежелательно.

Пример кода:

modbus = modbus class

connect_button = Button(parent, text='Connect', command= lambda: (modbus.toggle_device_connection(state=1),
                                                                  toggle_buttons(state=1)))
disconnect_button = Button(parent, text='Disconnect', command= lambda: (modbus.toggle_device_connection(state=0),
                                                                        toggle_buttons(state=0)))

Вопрос: как мнепереносить данные из одного класса в другой?(в данном конкретном примере)

ОТВЕТ

Я думаю, что мой ответ следующий:

# Main.py
self.modbus = Modbus()

connect_button = Button(parent, text='Connect', command= lambda: modbus.toggle_device_connection(state=True)

def toggle_buttons(self, state=False):
    if state:
        # Disable Connect
        # Enable Disconnect
    else:
        # Enable Connect
        # Disable Disconnect

self.modbus.device_connection = lambda bool: toggle_buttons(state=bool)

# Modbus.py
self.device_connection = lambda bool: 'Connection unsuccessful'

def toggle_device_connection(self):
    ...
    if success:
        return True
    else:
        return False
    ...

Ответы [ 2 ]

0 голосов
/ 20 сентября 2019

Это немного больше кода, но вы можете использовать tk.BooleanVar, с trace_add, который прослушивает изменение значения переменной, и механизмом переключения состояния кнопки в зависимости от успеха / неудачисоединение:

Может быть что-то вроде этого:

import random
import tkinter as tk


def connection():
    # has no knowledge of your GUI
    conn = random.choice([False, True, True])   # simulate a network failure 1/3rd of the tim
    status = 'successful' if conn else 'fail'
    print(f'connected {status}')
    return conn   # not a callback, so the return value can be used

def connect_callback():
    print('...connecting')
    # use the return value to alter the connection_status
    # maybe defend it in a try / except block
    connection_status.set(connection())

def disconnect_callback():
    print('...disconnecting')
    connection_status.set(False)

def set_buttons_aspect(*args):
    if connection_status.get():
        btn1.config(state=tk.DISABLED)
        btn2.config(state=tk.NORMAL)
    else:
        btn1.config(state=tk.NORMAL)
        btn2.config(state=tk.DISABLED)        


root = tk.Tk()

connection_status = tk.BooleanVar(root)
connection_status.set(False)

btn1 = tk.Button(root, text='connect', command=connect_callback)
btn1.pack()
btn2 = tk.Button(root, text='disconnect', command=disconnect_callback)
btn2.pack()
set_buttons_aspect()

connection_status.trace_add('write', set_buttons_aspect)  
# listens to changes in connection_status and calls set_buttons_aspect when it occurs

root.mainloop()
0 голосов
/ 20 сентября 2019

Попробуйте использовать функцию.

... lambda: function (params) ...

И выполните функцию

function (params): try:... кроме Исключения как e: print (e) do_something ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...