Создание и доступ к экземплярам классов с помощью нажатий кнопок tkinter

#python #class #tkinter #methods

#python #класс #tkinter #методы

Вопрос:

Что я хочу сделать, так это создать экземпляр класса, когда я нажимаю одну кнопку tkinter, а затем иметь возможность доступа к методам из того же экземпляра, когда я взаимодействую с другими кнопками tkinter.

У меня есть код для управления блоком питания (PSU), который включает в себя вызываемый класс PowerSupply . Я не буду показывать здесь все, но это включает в себя __init__ метод внутри этого класса для инициализации различных атрибутов, метод connect поиска и подключения к блоку питания, а также метод onstate включения или выключения вывода блока питания (логика 1 или 0). Он также использует библиотеку pyvisa

 import pyvisa    
class PowerSupply:

   def __init__(self):
    """Initialise attributes"""
    self.name = ""
    self.source_state = 0  # Output On/Off state

def connect(self):
    """Connect to SMU"""
    rm = pyvisa.ResourceManager()  # Set up resource manager
    resource_list = rm.list_resources()  # List of available instruments
    Yoko_str = "0x0B21::0x001E"  # VISA ID should contain this string
    Yokogawa = [i for i, s in enumerate(resource_list) if Yoko_str in s]

    if len(Yokogawa) == 0:
        print("No Yokogawa supplies detected")
    else:
        ID = resource_list[Yokogawa[0]]
        self.name = rm.open_resource(ID)  # Open connection
        print("Yokogawa supply detected")

def onstate(self, state):
    """Turn SMU On or Off"""
    self.source_state = str(state)  # Update source state attribute
    self.name.write(":OUTPUT "   self.source_state)  # Send command
  

Кажется, это работает отлично, так как я могу подключать и включать / выключать инструмент. Например, этот код создаст экземпляр «smu», подключится к инструменту и включит его:

     smu = PowerSupply()
    smu.connect()
    smu.onstate(1)
  

Что я хочу сделать дальше, так это чтобы одна кнопка tkinter создавала экземпляр smu и подключалась к блоку питания, а другая кнопка tkinter использовала onstate метод из этого экземпляра для включения / выключения блока питания.

Мой код кнопки «Подключиться»:

 btn_connect_dev = tk.Button(device_con_frame, text="Connect to Devices",
                            font=("Ariel", 11), command=connect_devices)
  

Который выполняет функцию connect_devices() , сам:

 def connect_devices():
    smu = PowerSupply()
    smu.connect()
    return smu
  

Мой код кнопки «Вкл / выкл»:

 btn_on_off = tk.Button(smu_ctrl_frame, text="Ouput ON/OFF", font=("Ariel", 11), command= smu.onstate(1))
  

Но это выдает ошибку в этой строке NameError: name 'smu' is not defined

Этого я не понимаю, потому что экземпляр smu должен быть возвращен connect_devices() функцией. Я предполагаю, что smu это недоступно для другой кнопки, но я понятия не имею, почему нет или как это сделать, любой совет был бы отличным.

Комментарии:

1. Возвращаемое значение команд не используется / ничему не присваивается. Вы могли бы определить smu как глобальную переменную.

2. @Wups Спасибо. Мне приходило в голову использовать глобальную переменную, но я также видел, что использование глобальных переменных, как правило, не является хорошей идеей в Python (потому что, когда код становится более сложным, вы можете легко что-то перезаписать?). Я попробую ваше предложение, но мне было бы интересно услышать, есть ли другой способ.

3. Я попытался использовать глобальную переменную, но потерпел неудачу. Я изменил connect_devices на: def connect_devices(): глобальный smu smu = PowerSupply() smu.connect() Но все равно выдает ошибку NameError: name 'smu' is not defined , как и раньше

4. Если у вас есть класс для кнопок / интерфейса, лучшим решением было бы сделать smu переменной экземпляра.

5. @Wups Я новичок в Python, поэтому извините, если это звучит глупо, но вы имеете в виду, что мне нужно создать класс для каждого отдельного типа кнопок в графическом интерфейсе, а также для инструментов? Это кажется очень сложным решением (если я правильно понял), поскольку у меня есть много других кнопок в графическом интерфейсе разных типов! Кстати, у меня что-то работает с использованием глобальной переменной, моя предыдущая проблема заключалась в импорте команд из другого файла.