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

Python 按tkinter按钮创建和访问类实例,python,class,tkinter,methods,Python,Class,Tkinter,Methods,我希望在按下一个tkinter按钮时创建一个类的实例,然后在与其他tkinter按钮交互时能够从同一实例访问方法 我有用于控制电源设备(PSU)的代码,其中包括一个名为电源供应的类。我不会在这里显示所有内容,但这包括类中用于初始化各种属性的\uuuu init\uuuu方法,用于搜索和连接PSU的方法,以及用于打开或关闭PSU输出(逻辑1或0)的方法onstate。它还使用库pyvisa import pyvisa class PowerSupply: def __init__(

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

我有用于控制电源设备(PSU)的代码,其中包括一个名为
电源供应
的类。我不会在这里显示所有内容,但这包括类中用于初始化各种属性的
\uuuu init\uuuu
方法,用于搜索和连接PSU的
方法,以及用于打开或关闭PSU输出(逻辑1或0)的方法
onstate
。它还使用库
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\u 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))
但是这在那一行给了我一个错误
namererror:name'smu'没有定义


我不明白这一点,因为实例
smu
应该由
connect\u devices()
函数返回。我猜
smu
对其他按钮不可用,但我不知道为什么不可用或如何使用,任何建议都很好。

命令的返回值未被使用/未分配给任何内容。您可以将
smu
定义为全局变量。@Wups谢谢。使用全局变量确实是我的想法,但我也看到在Python中使用全局变量通常不是一个好主意(因为当代码变得更复杂时,您可能很容易覆盖某些内容?)。我会尝试一下你的建议,但我很想知道是否还有其他方法。我尝试使用全局变量,但失败了。我将
connect_devices
更改为:def connect_devices():global smu smu smu=PowerSupply()smu.connect(),但仍然得到错误
NameError:name'smu'没有像以前一样定义,将smu作为实例变量将是一个更好的解决方案。@Wups我是Python新手,如果这听起来很愚蠢,很抱歉,但您的意思是我需要为GUI中的每种不同类型的按钮以及工具创建一个类吗?这似乎是一个非常复杂的解决方案(如果我理解正确的话),因为我在GUI中有许多其他不同类型的按钮!顺便说一句,我用一个全局变量做了一些工作,我以前的问题是从另一个文件导入命令。