模块在主代码中没有看到我的值

时间:2018-04-07 18:08:27

标签: python module global-variables

我是Python的新手,目前正在Tkinter中构建一个GUI界面,并为其提供完整的代码。我认为通过按下"输入"键盘上的按钮工作会很不错。键。

代码行是:win.bind('<Return>', testButton.functionName) 然后你就把#&#34; event&#34;在函数括号中functionName(event)并且一切都很好。

问题是现在当你按下GUI界面内的按钮时它不起作用,这意味着我需要复制并重命名其中一个函数来同时拥有它们。

由于它是一个相同的代码,因此将它作为模块更有意义。但是,当我导入我的模块时,它似乎没有看到我的其余代码并声称我的变量不存在。

以下是我如何做的简化示例。

我的模块保存为moduleTest:

def test():
    sum = a + b
    return sum

主程序:

import moduleTest

a = 10
b = 12
moduleTest.test()

print test()

它一直声称没有定义a和b。

当我导入模块时,我明显误解了模块的工作原因,它只需导入整个代码并执行相同的操作:

import moduleTest

a = 10
b = 12
def test():
    sum = a + b
    return sum

print test()

我误解和做错了什么?

3 个答案:

答案 0 :(得分:2)

Python全局变量是每个模块的全局变量,而不是整个程序。

解决这个问题的通常方法是不使用全局变量。

对于您的玩具示例,您可以def test(a, b):然后从主模块中致电test(a, b),这通常是正确的解决方案,但它并不总是合适的。< / p>

其他选项包括:

  • 使用类,并在创建实例时传递值。
  • 将需要共享的全局变量存储在第三个模块中,mainmoduleTest import thirdmodule thirdmodule.a可以.babelrc访问。这通常适用于共享配置值等情况。
  • 将全局变量存储为两段代码已有权访问的其他东西的属性。

答案 1 :(得分:1)

正如@abarnert所指出的,全局变量对每个模块都是全局的。为了解决这个问题,您可以使用:

def test(a, b):
    sum = a + b
    return sum

import moduleTest

a = 10
b = 12
print(moduleTest.test(a, b))

我想指出你不应该调用变量sum,因为这已经是你要覆盖的现有函数。

答案 2 :(得分:0)

以下是我的代码的几个独立片段,可以为您提供一个想法:

item = "SNAKE"
oldString = "-" * (len(item))
blank = "-" * (len(item))
guesses = 10

def gameOn():
    global guesses
    global oldString
    newString = ""
    i = 0
    x = len(item)
    hanged = ""
    readString = answerIn.get().upper()
    winner = 1
    if not readString:
        if guesses == 10:
            pass
        else:
            hanged = (HANGMAN[(len(HANGMAN) -1) - guesses])
            hangedOutput.config(state=NORMAL)
            hangedOutput.delete("1.0",END)
            hangedOutput.insert(END,hanged)
            hangedOutput.config(state=DISABLED)
        error.config(state=NORMAL)
        error.delete(0,END)
        error.insert(0,"Please enter the value.")
        error.config(state=DISABLED)

win = Tk()
answerIn = Entry(win,width = 3, border = 2)
answerIn.focus_set()
answerIn.grid(row=2, column=0, pady = 10, padx = 200, sticky = W)
win.mainloop()

当我把它变成一个模块时,它不仅要求item和oldString定义,还要求answerIn,hangedOutput等等,这些都是Tkinter标签的一部分。