Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sys.argv在python PyQt4中的用途是什么_Python_Qt_User Interface_Python 3.x_Pyqt4 - Fatal编程技术网

sys.argv在python PyQt4中的用途是什么

sys.argv在python PyQt4中的用途是什么,python,qt,user-interface,python-3.x,pyqt4,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.setGe

说到编程,我还是个初学者,尤其是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实际上在做什么吗?我不想每次都盲目地把它放进去,希望它能让我的代码正常工作

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

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) 
argc
(参数计数=参数数量)和
argv
(数组或参数值列表,取决于语言)是操作系统作为参数提供给程序的。在另一个世界:“它是如何被命名的”

正如cptPH的回答所明确指出的,这并不是特定于
Qt
Python
。请看这里:

对于C和C++:

对于Python:

甚至shell脚本也有这些称为“位置参数”:

即使您的程序根本不采用任何命令行选项,无论是哪种语言或操作系统(除非非常、非常奇特的),您也必须始终做到最低限度:

  • a
    argc
    1,因为
  • argv
    0号将是调用程序的名称 (这可能会有所不同,例如,如果您通过符号链接调用它,或 仅仅因为您更改了构建过程的目标二进制文件, 您的程序“foo”现在是“bar”-例如:打印输出时不要使用硬编码程序名,而是使用
    argv
    number 0)
迟早,您将编写使用选项/参数的程序。所以你要用这些。示例:您可能需要添加“-verbose”或“-debug”选项。或者“-input file”,如果是关于文件处理的。无论什么您的程序将在启动时解析这些argv,并通过wise编码相应地更改其运行时行为

示例:即使是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网络应用程序。它可以在两种相互排斥的模式下运行:

  • “正常”模式
  • 或“间谍模式”:这是特殊的,因为它需要网络 某些低级操作的管理员权限
因此,我添加了一个CLI
-s/--spy mode
CLI选项。这是可选的
argv

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

  • 如果在没有此选项的“正常”模式下运行,GUI元素将与 “间谍”模式甚至不会显示给用户,也不会显示任何 它的类被实例化了。这是干净的,否则它会 无论如何,在许多对象实例/方法中都会失败,并且 到处都是错误,因为低级调用会失败 无论如何,然后我会用一个非零返回码退出。那不是 好。如果你可能失败,尽快失败
  • 如果使用此
    argv
    选项在“spy”模式下启动,第一件事 我在代码中要做的是检查调用用户是否确实有这样的 “网络管理员”权限,如果没有,则发出 一个明确的错误消息/弹出窗口,解释“您应该 拥有blabla特权,blabal尝试sudo blabla“,然后 使用非零返回码退出,或者如果用户确实有 所需的特权,提供特殊的“间谍模式”GUI元素和 将它们投入使用,没有问题(并隐藏大部分GUI“正常模式” 元素,在此操作模式下无意义)
这就是
argc/argv
的好处。

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

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

app = QtGui.QApplication([])
当您使用
sys.argv
时,第一个参数将自动设置为脚本名称,Qt将使用该参数设置脚本名称。稍后可以通过以下方法访问参数列表:

输出:

$ python test.py -f foo
ARGS: ['test.py', '-f', 'foo']
NAME: 'test.py'
但请注意,有些由Qt内部处理,并将自动从参数中删除:

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

QApplication可以选择性地接受其他命令行参数,例如您有一个带有复选框和滑块的PyQT或PySide程序,并使用以下命令运行该程序:

$ python3 checkbox_slider.py -style fusion  

您会发现样式不同,这意味着sys.argv在某些情况下具有实际用途。从官方网站查看

您是否有机会给出一个示例,说明将向程序传递何种命令行参数?我想知道这跟什么有关to@KierranPurden以@KierranPurden为例,
-style x
将强制应用程序使用运行的style
x
。那篇文章中还有很多其他的东西对调试很有用。@KierranPurden:比如说,你用Qt编写了一个文本编辑器。然后,通常的命令行参数可能是已编辑文件的名称。这只是一个例子。这完全取决于需要通过命令行参数传递什么。但是f
$ python3 checkbox_slider.py -style fusion