按tkinter按钮创建和访问类实例

2024-09-26 18:16:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望在按下一个tkinter按钮时创建一个类的实例,然后在与其他tkinter按钮交互时能够从同一实例访问方法

我有控制电源设备单元(PSU)的代码,它包括一个名为PowerSupply的类。我不会在这里显示所有内容,但这包括类中用于初始化各种属性的__init__方法、用于搜索和连接PSU的connect方法以及用于打开或关闭PSU输出的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并连接到PSU,并让另一个tkinter按钮使用此实例的onstate方法打开/关闭PSU

我的“连接”按钮代码是:

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对另一个按钮不可用,但我不知道为什么不可用或如何使用,任何建议都会很好


Tags: 实例方法代码selftkinterdefconnect按钮

热门问题