首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python在导入时执行函数(显然)

Python在导入时执行函数(显然)
EN

Stack Overflow用户
提问于 2014-04-14 16:03:46
回答 2查看 188关注 0票数 1

我正在继续这个加密程序,现在我正在为它开发GUI。不过,我有一个奇怪的问题:在主菜单中,我有一些按钮,可以调用加密和解密子程序,但是它们显然是在按下按钮之前执行的。

definitions.py

代码语言:javascript
复制
#!/usr/bin/env python2.7
#-*- encoding: utf-8 -*
from Tkinter import *
import decoding
import encoding

version="v0.0"


def NewLabel(text, column, row, self):
    label=Label(self, text=text)
    label.grid(column=column,row=row)

def NewButton(text, action, column, row, self, sticky="N"):
    button=Button(self, text=text, command=action)
    button.grid(column=column,row=row,sticky=sticky)

def OnEncode():
    zxc.encode()   #zxc is the new encode
    quit()

def OnDecode():
    decoding.decode(version)

def OnExit():
    quit()

welcome.py

代码语言:javascript
复制
#!/usr/bin/env python2.7
#-*- encoding: utf-8 -*
from Tkinter import *
from definitions import *

import encoding
import decoding
import zxc

main_window=Tk()
mainContainer=Frame(main_window)

NewLabel(u'Welcome to <name> GUI alpha v0.0',0,0,mainContainer)
NewLabel(u'What do you want to do?',0,1,mainContainer)

NewButton(u'1. Encrypt file',OnEncode,0,2,mainContainer)
NewButton(u'2. Decrypt file',OnDecode,0,3,mainContainer)
NewButton(u'Exit',OnExit,0,4,mainContainer)

mainContainer.pack()
main_window.title('<name> GUI')
main_window.mainloop()

zxc.py

代码语言:javascript
复制
#!/usr/bin/env python2.7
#-*- encoding: utf-8 -*
from definitions import *


class encode(Tk):
    def __init__(self,parent):
        Tk.__init__(self,parent)
        self.parent=parent
        self.initialize()

    def harden(number):
        if number<=80: number=53
        elif number>=100: number=((1/2)*number+50)
        elif 82<number<100: number=((number**2-4)*(number**2-1))/number
        return number

    def initialize(self):
        NewLabel('Welcome to <name> GUI v0.0 encoder',0,0,self)



app=encode(None)
app.title('<name> GUI v0.0 encoder')
app.mainloop()

我从这里得到的第一个窗口是“欢迎来到GUI v0.0编码器”窗口,然后关闭带有按钮的“欢迎来到GUI alpha v0.0”窗口。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-14 16:14:17

这就是if __name__ == "__main__"的作用。

查看这个线程中提供的伟大答案:": do?

让我们简化一下..。

你有个文件叫..。比方说..。libmain.py (一个很不幸的名字但是..。您希望将其用作库(您可以在某个地方导入模块)和应用程序的主要入口点。

让我们把它变得非常简单:让libmain.py文件只打印__name__

libmain.py:

代码语言:javascript
复制
print "Current __name__: %s" % __name__

现在,创建另一个只导入libmain的文件(例如libmain)

foo.py

代码语言:javascript
复制
import libmain

如果直接执行python ./libmain.py,将得到以下输出:

Current __name__: __main__

但是,如果您执行导入libmain (python ./foo.py)的文件,您将得到:

Current __name__: libmain

因此,为了避免在导入libmain.py时执行代码,请将该代码放在if __name__ == "__main__"下面(因为,如上面的示例所示,在导入libmain时,__name__将是libmain)。

在您的特殊情况下,在不了解详细情况的情况下,我会说您正在导入welcome (或zxc?)这就是导致代码被执行的原因。

票数 3
EN

Stack Overflow用户

发布于 2014-04-14 16:19:43

当您导入模块时,该模块中的所有代码都会被执行。通常,“执行”意味着定义模块中的所有函数和变量。但是,如果在模块中包含可执行代码,它将执行。

在您的例子中,zxc.py在底部有代码,这会创建一些窗口。由于您不通过说“在导入时不运行此代码”来保护该代码,所以它在import上运行。

要防止代码运行,通常将其隐藏在下面的if语句后面:

代码语言:javascript
复制
if __name__ == "__main__":
    <your code here>

在执行导入时,__name__永远不会被设置为文字字符串"__main__"。只有在尝试直接执行脚本时才会设置它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23064838

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档