我正在继续那个加密程序,现在我正在为它开发 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”窗口
最佳答案
这就是 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
,你会得到这个输出:
当前__name__:__main__
而如果您执行导入 libmain 的文件(python ./foo.py
),您将获得:
当前__name__:libmain
因此,为了避免在导入 libmain.py
时执行代码,将该代码放在 if __name__ == "__main__"
下(因为,如示例所示上面,当 libmain
被导入时,__name__
将是 libmain
)
在您的特定情况下,在不了解详细情况的情况下,我会说您正在某处导入 welcome
(或 zxc
?),这就是导致的原因您要执行的代码。
关于Python 在导入时执行函数(显然),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23064838/