适用于Perl程序的Windows GUI工具包有哪些好的选项?

13

我打算在Windows桌面上自动化一些任务(例如整理大量音乐/文本/照片文件等)。

考虑到我主要的开发专业知识是Unix上的Perl,为了开发效率,我更愿意使用Perl编写所需完成的业务逻辑,但问题是,如果我想在工作中添加一些GUI(类似于Unix上的Perl::Tk),我的GUI工具包选择有哪些选项,你会建议使用哪一个?

请注意,我希望这个问题能成为其他SO用户的良好学习机会,因此即使回答不一定满足我个人的限制/需求,我也欢迎任何答案,尽管对于与这些考虑相关的解释会很受欢迎。

我的考虑主要是因为我想要一个快速开发的工具,用于个人使用,以节省我手动执行的时间。

  • 最重要的考虑因素是Perlishness开发--正如Perl标语所说,“简单的事情应该很容易完成,复杂的事情应该有可能完成”。特别是第一部分 :)

  • 尽可能使用原生组件,但不强制。例如,宁愿重新使用Windows的文件打开对话框,而不是使用某个自定义Java对话框。

  • 我更希望使用学习曲线较小的内容(例如,无需学习OLE / COM的复杂性),因为目标是快速开发我需要简化生活的工具,而不是专注于与我的日常工作更相关的开发者教育 :)。

    但是,如果在此过程中提出了一些新/酷的Monad GUI组件,我肯定会感兴趣。

  • 性能很重要(例如,我可能需要显示具有> 10000个文件的目录列表),但并非首要关注--我是一个非常好的GUI设计师和开发人员,如果需要,可以始终构建应用程序并设计GUI以实现良好的扩展性。

  • 我强烈倾向于(但并非坚持要求)不需要编译的框架。例如,Perl库比我需要编译的自定义Java代码更可取。但如果该框架在其他方面完美无缺,我也可以接受编译后的解决方案(只要不要求我购买Visual Studio或类似软件 - 我只想为个人使用构建Windows GUI前端,而不是投资成为Windows开发人员)。

  • 除了以上限制,我非常开放和灵活。有一些ActivePerl/Strawberry Perl库、MS PowerShell组件 - 哎呀,如果没有更好的选择,我就在我的电脑上安装Apache并构建一个Web前端 :)


    1
    @Brian - 很好的编辑(像往常一样) - DVK
    7个回答

    6
    关于界面的“珍珠般”的特点,我建议使用老旧的Tk。不幸的是,它看起来相当陈旧和非Win32风格。
    如果想要本地窗口小部件,我认为最好的选择是通过Win32::GUIWx使用本地Windows GUI。我没有使用Win32::GUI的经验,但Wx很好用。然而,它有一个相当陡峭的学习曲线,界面也不是很“珍珠般”。C++的根源有一点(好或坏)。
    还有一些Tk替代品,实际上是Tcl/Tk的薄包装器(我想是Tcl::Tk和Tkx)。它们看起来比Perl/Tk更现代化,但我对这些也没有亲身经历。如果只开发Windows,请查看ActivePerl,它带有(我想)Tkx。他们的ppm4包管理器使用它编写,看起来非常漂亮!

    5

    perlfaq3 中列出了一些选项,还有一些未列出的选项。我只熟悉基于Tk的选项。

    Perl/Tk 拥有最“Perl风格”的界面,但它尚未更新以利用当前版本的Tk中的tile(本地/主题小部件)支持(也可能永远不会)。Tkx 使用不同的桥接到Tk。它允许访问Tk中的所有内容(并且速度更快),但语法不太像Perl。 Tkx旨在成为Tk上的一个轻量级包装器;您必须查阅Tk文档以获取大多数内容,并翻译其在Perl中的使用方式。Tcl/Tk 模块使用与Tkx相同的桥接,但支持的语法与Perl/Tk大致相同。

    是否需要编译任何内容取决于您使用的Perl版本。如果您使用Strawberry Perl,则无论选择哪个工具包,您都可能需要编译某些内容。自5.8.x周期以来,ActivePerl发行版已经包含了Tkx,并在5.10时停止捆绑Tk,尽管它仍然可以通过PPM获得。Tcl/Tk可从CPAN获取,但我无法使其与捆绑在ActivePerl中的Tk库一起使用;您可能需要单独安装Tcl才能使用它。

    就个人而言,我曾经使用Perl/Tk,但现在使用Tkx。


    1
    迈克尔 - 明确一下,我不太关心语法的Perl风格(在我的生活中的某个时刻,我编写过BASIC、Pascal、LOGO、Prolog、Lisp、Scheme、C、ADA、Perl、Lotus Notes、SQL和PowerBuilder。我可以处理任何语法 :) 我只关心不必跳过30行代码中表达的15个障碍来完成Perl可以在15个字符内完成的工作。 - DVK
    1
    哦,感谢您提供的兼容性/包容性信息...我的另一个任务是在AS和Strawberry之间进行选择,这些信息很有帮助。 - DVK

    3
    尽管Tk和Qt也可用(更通用的框架最初是为其他语言而设计的,您也可以在其中使用Perl),而且Tk可能是最受欢迎的,因为它存在最久,但Win32::GUI似乎最符合您的要求。如果您喜欢所见即所得的GUI设计器,则可以在Win32::GUI之上使用Loft,但如果您宁愿以编程方式完成所有操作,则不必这样做。

    3

    不要介意自己的宣传 - 我正在编写一个纯 Perl GUI 工具包,XUL::Gui,它使用 Firefox 渲染其 GUI。它允许您做任何 Firefox 可以做的事情(XUL、HTML、JavaScript、Flash 和其他 Web 技术)。Firefox 使用操作系统的本地外观和感觉(或您想要的任何其他主题),并且适用于大多数平台。

    use XUL::Gui;
    
    display Window title=>'My Application',
        Button( label=>'click me', oncommand=>sub{ shift->label = 'ouch'} );
    

    目前它还在开发中,但可能已经足够稳定以开始使用。其设计理念是尽可能简单和类似于Perl语言。几乎所有的样板代码都是可选的,并且都有合理的默认值。例如,Window标签只是因为我想给窗口命名而需要。

    该模块已上传至CPAN,我鼓励任何人都来看看,并向我发送功能请求或错误报告。


    它运行了!而且是在Windows上。我得研究一下这个。 - Sinan Ünür
    1
    看起来很好奇 - 我也会去看看! - DVK

    2
    我会选择GTK,因为它有一个学习指南(目前我正在使用Wx,尽管有许多使用Wx的Perl源代码可用,但没有实际的官方文档...除了一些文章,所以没有书籍...没有官方资料),如果没有的话Qt也是一个选项,它有一些适当的文档(但我没有尝试过)。

    Tk存在非常大的问题,我不会使用它。

    至于您的性能问题...我非常确定没有一个体面的应用程序会关注它是否显示100000或10^100个文件,因为很少有适合你的屏幕的文件,所以你可以做一些剪裁


    WxPerl确实没有将wxWidgets文档翻译成Perl的副本。但是官方的wxWidgets文档在90%的情况下适用于WxPerl。在那10%的情况下,它会有一条关于WxPerl(或类似的WxPython)与C++ API不同之处的注释。不过,阅读参考文献时了解基本的C++语法确实有所帮助。 - tsee

    2
    如果只是想在脚本上方获取一个简单的GUI,则最简单的路径是使用VB.NET(或C#)。这就是我所做的。
    使用Visual Studio的设计师,只需设计表单,双击启动处理的按钮,添加代码以从GUI元素(例如TextBox中的文件路径)读取参数,并通过环境变量或命令行参数将信息传递给脚本。
    以下是我一个应用程序的示例(由真实用户使用):
    Dim inputFolder As String = txtInputDataMGFfolder.Text
    Dim outputFile As String = txtOutputMGFfile.Text
    
    Dim ws As WshShellClass = New WshShellClass
    
    Dim objEnviron2 As IWshRuntimeLibrary.IWshEnvironment = _
     ws.Environment("PROCESS")
    
    objEnviron2.Item("INDIR") = inputFolder
    objEnviron2.Item("OUTFILE") = outputFile
    
    'It may or may not help for this: the user dialogs for selecting 
    'files may change the current directory and running the Perl
    'script or one of the .pm files would fail.
    ws.CurrentDirectory = appPath()
    
    ws.Run("%COMSPEC% /K   perl -w MultRawPrepare.pl", 1, False)
    

    请注意,对于此操作使用Windows脚本宿主可能并非绝对必要,但如果需要,则需要执行以下步骤:
    'Requires adding reference to project:
    '  menu Project/Add Reference/COM/Windows Script Host Object Model
    '    Note: "Windows", not "Microsoft".
    '
    'Note: the DLL may not be registered;
    '  D:
    '  cd \WINNT\system32
    '  regsvr32 wshom.ocx
    Imports IWshRuntimeLibrary 'For WshShellClass.
    

    appPath()的定义如下(在VB.NET文件开头需要"Imports System.Reflection"):

    Public Shared Function appPath() As String
    
        '"[Assembly]" requires System.Reflection
        Dim strAppDir As String = _
          Path.GetDirectoryName( _
            [Assembly].GetExecutingAssembly().GetModules(False)(0).FullyQualifiedName)
        Return strAppDir
    End Function 'appPath
    

    用户选择文件或文件夹很容易添加,但是需要 HOW-TO 说明和一点样板代码的帮助。

    Visual Studio 的 VB.NET Express 版本是免费的。


    很高兴知道您使用VB.NET/C#,但请注意标题中的“Perl”一词。谢谢。 - xxxxxxx
    2
    @spx2:我只是发布了我的答案,因为 OP 放宽了要求:“请注意,我希望这个问题成为其他 SO 用户的学习机会,所以我欢迎任何答案,即使它们不满足我自己列出的限制/需求。” - Peter Mortensen

    2

    我个人建议您仍然使用Tk。它可以在Windows上运行,而且您已经熟悉它。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接