【问题标题】:Python executing function on import (apparently)Python 在导入时执行函数(显然)
【发布时间】:2014-04-14 16:03:46
【问题描述】:

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

定义.py

#!/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()

欢迎.py

#!/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

#!/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”之后会出现

【问题讨论】:

  • 你的输出是什么?你必须给我们更多的信息。你说函数在导入时被调用,哪些函数在哪个文件中?

标签: python button import tkinter


【解决方案1】:

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

查看此线程中提供的精彩答案:What does if __name__ == "__main__": do?

让我们稍微简化一下...

您有一个名为...的文件...假设...libmain.py(一个非常不幸的名字,但是...嗯)您想将其用作库(您可以在某处导入的模块)和您的应用程序主入口点。

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

libmain.py:

print "Current __name__: %s" % __name__

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

foo.py

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?),这就是导致您的代码被执行的原因。

【讨论】:

    【解决方案2】:

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

    在您的情况下,zxc.py 在底部有创建一些窗口的代码。由于您没有通过说“不要在导入时运行它”来保护该代码,因此它会在导入时运行。

    为防止代码运行,您通常将其隐藏在 if 语句后面,如下所示:

    if __name__ == "__main__":
        <your code here>
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-28
      • 2012-02-25
      • 1970-01-01
      • 1970-01-01
      • 2021-11-09
      • 1970-01-01
      相关资源
      最近更新 更多