#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, поэтому извините, если это звучит глупо, но вы имеете в виду, что мне нужно создать класс для каждого отдельного типа кнопок в графическом интерфейсе, а также для инструментов? Это кажется очень сложным решением (если я правильно понял), поскольку у меня есть много других кнопок в графическом интерфейсе разных типов! Кстати, у меня что-то работает с использованием глобальной переменной, моя предыдущая проблема заключалась в импорте команд из другого файла.