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

2024-06-26 14:48:58 发布

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

我对Python非常陌生,目前正在Tkinter中构建一个GUI界面,并且有一个完整的工作代码。我想这将是很好的,有一个按钮的工作,从键盘按“回车”键

它的代码行是:win.bind('<Return>', testButton.functionName) 然后把“event”放在函数括号akafunctionName(event)中,一切都很好

现在的问题是,当你按下GUI界面中的按钮时,它就不工作了,这意味着我需要复制和重命名其中一个函数来同时拥有这两个函数

因为它是一个相同的代码,所以将它作为一个模块会更有意义。然而,当我导入我的模块时,它似乎看不到我的代码的其余部分,并且声称我的变量不存在

这是一个简单的例子,我是如何做到这一点

我的模块另存为模块测试:

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()

我误解了什么,做错了什么


Tags: 模块函数代码testimportevent界面return
3条回答

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

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

以及

import moduleTest

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

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

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

通常的处理方法是不使用globals

对于您的玩具示例,您可以def test(a, b):,然后从主模块调用test(a, b),这通常是正确的解决方案,但并不总是合适的

其他选项包括:

  • 使用类,并在创建实例时传入值
  • 将需要共享的全局数据存储在第三个模块中,mainmoduleTest都可以作为import thirdmodule访问。这通常适用于共享配置值之类的情况
  • 将globals存储为两段代码都已访问的其他东西的属性

下面是我的代码的几个单独片段,让您了解一下:

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标签的一部分

相关问题 更多 >