如何在另一个模块中设置全局变量?

Posted

技术标签:

【中文标题】如何在另一个模块中设置全局变量?【英文标题】:How to set a global variable in another module? 【发布时间】:2020-10-29 23:47:17 【问题描述】:

我想将一个实例(如指针)从我的主模块传递到另一个模块,因此我将能够更改我的主模块的条目值。在我的示例中 - 当用户单击按钮时,它会使用 lambda 函数通过引用发送对象,一切正常。

但是,在我的 calc.py 模块中,我有很多功能。所以我需要将入口对象附加到我所有的按钮和第二个模块中的接收函数。

是否有一种简单的方法可以将入口对象的地址传递给第二个模块,以便那里的所有函数都能够访问该对象(就像它对它们来说是全局的),而不必显式地将它传递给每个模块功能?

我附上了我的部分代码。我是 Python 的初学者。

MyApp.py

# module 1 (main)


import tkinter
import tkinter.ttk
from calc import* 


window = tkinter.Tk()

e1 = tkinter.ttk.Entry(frame5, width=62)
e1.grid()

insert7_btn = tkinter.ttk.Button(frame5, text="7", command=lambda: insert_num(7,e1))
insert7_btn.grid()

button_plus = tkinter.ttk.Button(frame5, text="+", command=lambda: memory('+',e1))
button_plus.grid()

....
....
window.mainloop()
  

计算.py

# module 2

import tkinter          
import tkinter.ttk
import math           

def insert_num(number,e1):
    .....


def memory(operation,e1):
    ..... 
......

【问题讨论】:

在 calc 中导入 Myapp 并使用 Myapp.e1。无需将其作为参数。 那么如果我通过引用传递一个变量呢?我问如何以不同的方式做到这一点!!!!!!!!!!!!!!!!!!!!!!!!! 让我们continue this discussion in chat. @eric:这将导致循环导入 - 您不能让 MyApp.py import calc.py 也让 calc.py import MyApp.py。 【参考方案1】:

我建议将calc.py中的所有函数放在一个类中,并在创建该类的实例时传递e1

# calc.py

class CalcUtils:
    def __init__(self, e1):
        self.e1 = e1

    def insert_num(self, number):
        # use self.e1 here
        ...
    
    def memory(self, operation):
        # use self.e1 here
        ...

然后在您的主应用程序中,创建一个CalcUtils 的实例,并以e1 作为参数,并使用该实例调用所需的函数:

import tkinter as tk
from tkinter import ttk
from calc import CalcUtils

window = tk.Tk()

e1 = ttk.Entry(window, width=62)
e1.grid()

utils = CalcUtils(e1)

insert7_btn = ttk.Button(window, text='7', command=lambda: utils.insert_num(7))
insert7_btn.grid()

button_plus = ttk.Button(window, text='+', command=lambda: utils.memory('+'))
button_plus.grid()

window.mainloop()

【讨论】:

哦..所以您正在导入从 calc 创建的类,从该类创建一个对象,同时传递 e1 - 使用 init 自动将他存储到 utils.e1。然后通过对象,您可以使用 lambda 访问类中的方法。我将不得不将所有内容更改为:主模块中的 utils.method_name 和 calc 方法中的 self.e1 我一直在寻找更短的方法而无需做很多更改,但实现它确实是个好主意。非常感谢您的回复!

以上是关于如何在另一个模块中设置全局变量?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Laravel 中设置全局变量?

37如何在函数中设置一个全局变量 ?

如何在 asp.net c# 渲染覆盖中设置全局变量?

在 Xcode 构建阶段运行脚本中设置全局环境变量

从 Node.js 中设置全局环境变量

Postman 中设置全局变量,token