Python 按tkinter按钮创建和访问类实例
我希望在按下一个tkinter按钮时创建一个类的实例,然后在与其他tkinter按钮交互时能够从同一实例访问方法 我有用于控制电源设备(PSU)的代码,其中包括一个名为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__(
电源供应
的类。我不会在这里显示所有内容,但这包括类中用于初始化各种属性的\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中有许多其他不同类型的按钮!顺便说一句,我用一个全局变量做了一些工作,我以前的问题是从另一个文件导入命令。