什么是python PyQt4中使用的sys.argv

时间:2016-03-18 15:27:25

标签: python qt user-interface python-3.x pyqt4

在编程方面,我还是初学者,在GUI编程方面,我是新手。我正在使用python和PyQt4,我正在遵循教程指南。以下代码块相对容易理解:

import sys
from PyQt4 import QtGui
def window():
    app = QtGui.QApplication(sys.argv)
    w = QtGui.QWidget()
    b= QtGui.QLabel(w)
    b.setText("Hello World!")
    w.setGeometry(100,100,200,50)
    b.move(50,20)
    w.setWindowTitle(“PyQt”)
    w.show()
    sys.exit(app.exec_())
if __name__ == '__main__':
    window()

我可以关注这里发生的事情,但有人可以向我解释一下sys.argv实际上在做什么吗?我不想只是盲目地把它放在每一次,希望它能使我的代码工作!

5 个答案:

答案 0 :(得分:8)

您不需要在PyQt应用程序中使用sys.argv

如果您想使用命令行参数,它才真正有用。如果不这样做,您只需传入一个空列表:

app = QtGui.QApplication([])

当您使用sys.argv时,第一个参数会自动设置为脚本名称,Qt将使用它来设置applicationName()。稍后可以通过arguments()方法访问参数列表:

# test.py
import sys
from PyQt4 import QtGui

app = QtGui.QApplication(sys.argv)

print('ARGS: %s' % app.arguments())
print('NAME: %r' % app.applicationName())

输出:

$ python test.py -f foo
ARGS: ['test.py', '-f', 'foo']
NAME: 'test.py'

但请注意,有些pre-defined arguments由Qt内部处理,并会自动从参数中删除:

$ python test.py -f foo -stylesheet=style.qss
ARGS: ['test.py', '-f', 'foo']
NAME: 'test.py'

答案 1 :(得分:2)

sys.argv不是特定于PyQt4的。它包含用于以列表形式启动程序的所有命令行参数。

例如,当你开始 ./ test.py arg1 arg2 sys.argv将包含:

sys.argv[0] == "./test.py"
sys.argv[1] == "arg1"
sys.argv[2] == "arg2"

有了这个你可以计算参数的数量,这将包括程序本身的名称,如上所示:

len(sys.argv) 

答案 2 :(得分:2)

argc(参数计数=参数数量)和argv(数组或参数值列表,具体取决于语言)是操作系统为程序提供的内容作为参数。在其他世界:“如何被称为”。

正如cptPH的答案所明确指出的那样,这并非针对QtPython。看看这里:

https://en.wikipedia.org/wiki/Entry_point

对于C和C ++:

https://en.wikipedia.org/wiki/Entry_point#C_and_C.2B.2B

对于Python:

https://en.wikipedia.org/wiki/Entry_point#Python

即使shell脚本也有这些,称为“位置参数”:

http://www.tldp.org/LDP/abs/html/othertypesv.html

即使您的程序根本没有命令行选项,无论语言或操作系统如何(除非非常非常异国情调),您将始终只有最低限度:

  • argc为1,因为,
  • argv数字0将是您的程序被调用的名称 (这可能会有所不同,例如,如果您通过符号链接调用它,或者 只是因为你改变了构建过程的目标二进制文件, 你的程序“foo”现在是“bar” - ex use:打印输出时不要使用硬编码的程序名,而是使用argv数字0)。

迟早,你将编写使用选项/参数的程序。所以你会使用这些。示例:您可能需要添加“--verbose”或“--debug”选项。或者“--input-file”如果是关于文件处理的话。随你。您的程序将在启动时解析这些argv,并通过明智的编码,相应地更改其运行时行为。

示例:即使是Python也可以使用很多可选选项,并使用argc / argv处理它们。从Python 3手册页:

   python [ -B ] [ -b ] [ -d ] [ -E ] [ -h ] [ -i ] [ -I ]
          [ -m module-name ] [ -q ] [ -O ] [ -OO ] [ -s ] [ -S ] [ -u ]
          [ -v ] [ -V ] [ -W argument ] [ -x ] [ [ -X option ] -?  ]
          [ -c command | script | - ] [ arguments ]

......对于Python解释器来说,这些都是argv

编辑:

Qt应用程序的真实示例:

我参与了开发的Qt网络应用程序。它可以在2种互斥模式下运行:

  • “正常”模式,
  • 或“间谍模式”:这是特殊的,因为它需要网络 某些低级别操作的管理员权限。

所以我添加了一个CLI -s/--spy-mode CLI选项。这些是可选的argv

在应用程序代码的开头,我检查了这个argv -s/--spy-mode CLI选项

  • 如果在没有此选项的情况下以“正常”模式运行,则GUI元素相关 “间谍”模式甚至根本不显示给用户,也不显示 它的班级实现了。那很干净,因为否则它会 无论如何,在许多物体实例/方法中都失败了 因为低级别的调用会失败,所以整个地方都会出错 无论如何,然后我将以非零返回码退出。那不是 好。如果您可能失败,请尽快失败。
  • 如果使用此argv选项以“间谍”模式启动,则首先要做的事情 我在我的代码中检查调用用户确实有这样的 “网络管理员”权限,然后1 /如果他没有,发出 一个明确的错误消息/弹出窗口,解释“你应该 有blablabla特权,blablabal尝试sudo blablabla“,然后 以非零返回码退出,如果用户确实有,则退出2 所需的权限,提供特殊的“间谍模式”GUI元素和 把它们使用,没问题(并隐藏大部分GUI“正常模式” 元素,在这种操作模式中毫无意义)。

这是argc/argv的好处。

答案 3 :(得分:0)

sys.argv包含启动时传递给程序的所有命令行参数。 QApplication的构造函数在某些情况下需要这些启动选项,例如调试。

答案 4 :(得分:0)

QApplication可以选择接受其他命令行参数,例如您有一个带有CheckBox和Slider的PyQT或PySide程序,并使用以下命令运行它:

$ python3 checkbox_slider.py -style fusion  

您会发现样式不同,这意味着sys.argv在某些情况下具有实际用途。请参阅官方网站上的more argument options