【问题标题】:What are good options for Windows GUI toolkits for a Perl program?Perl 程序的 Windows GUI 工具包有哪些好的选择?
【发布时间】:2010-11-30 02:32:47
【问题描述】:

我正在考虑在我的 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 的组件 - 哎呀,如果没有更好的显示,我将在我的 PC 上安装 Apache 并构建一个 Web 前端 :)

【问题讨论】:

  • @Brian - 很好的编辑(像往常一样)

标签: windows perl user-interface


【解决方案1】:

关于界面的“perlishness”,我建议使用简单的旧Tk。不幸的是,它看起来相当陈旧且非 win32 风格。

如果你想要原生小部件,我认为你最好的方法是通过Win32::GUIWx 使用原生 Windows GUI。我没有使用 Win32::GUI 的经验,但是 Wx 非常好。然而,它确实有一个相当陡峭的学习曲线,而且界面也不是很“失败”。 C++ 根显示了一点点(无论好坏)。

有一些 Tk 替代品实际上是 Tcl/Tk 的薄包装(我认为是 Tcl::Tk 和 Tkx)。它们看起来比 Perl/Tk 更现代,但我也没有这些方面的实践经验。如果您只为 Windows 开发,请查看(我认为)Tkx 附带的 ActivePerl。他们的 ppm4 包管理器是用它编写的,看起来很不错!

【讨论】:

    【解决方案2】:

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

    Perl/Tk 拥有最“糟糕”的界面,但尚未更新以利用当前版本的 Tk 中的磁贴(本机/主题小部件)支持(可能永远不会)。 Tkx 使用不同的桥接 Tk。它允许访问 Tk 中的所有内容(而且速度也更快),但语法不那么糟糕。 Tkx 被设计成对 Tk 的薄包装;您必须查阅 Tk 文档以了解大部分内容并从 Perl 翻译以使用它。 Tcl/Tk 模块使用与 Tkx 相同的桥接器,但支持与 Perl/Tk 基本相同的语法。

    您是否需要编译任何东西取决于您使用的 Perl 版本。如果您使用 Strawberry Perl,无论您选择什么工具包,您都可能需要编译一些东西。 ActivePerl 发行版从 5.8.x 周期的某个时间开始就包含了 Tkx,并且从 5.10 开始停止捆绑 Tk,尽管它仍然可以通过 PPM 获得。 Tcl/Tk 可从 CPAN 获得,但我无法让它与 ActivePerl 捆绑的 Tk 库一起工作;您可能需要单独安装 Tcl 才能使用它。

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

    【讨论】:

    • Michael - 明确地说,我不太关心语法的 Perlishnes(在我生命中的某个时刻,我编程过 BASIC、Pascal、LOGO、Prolog、Lisp、Scheme、C 、ADA、Perl、Lotus Notes、SQL 和 PowerBuilder。我可以处理任何语法 :) 我只关心不必跳过用 30 行代码表示的 15 圈来完成 perl 在 15 个字符中所做的事情。
    • 哦,感谢您提供兼容性/包容性信息...我的另一项任务是在 AS 和 Strawberry 之间进行选择,此信息会有所帮助。
    【解决方案3】:

    虽然 Tk 和 Qt 也可用(更通用的框架最初是为其他语言设计的,您也可以在其上使用 Perl),而且 Tk 可能最受欢迎,因为它的存在时间最长,Win32::GUI 似乎最能满足您的要求.如果您喜欢 WISIWYG GUI 设计器,您可以在 Win32::GUI 之上使用Loft,但如果您希望以编程方式完成所有操作,则不必这样做。

    【讨论】:

      【解决方案4】:

      无耻插件 - 我正在编写一个纯 Perl GUI 工具包,XUL::Gui,它使用 Firefox 呈现其 GUI。它允许您做任何 Firefox 可以做的事情(XUL、HTML、JavaScript、Flash、其他网络技术)。 Firefox 使用操作系统的原生外观(或您想要的任何其他主题),并且适用于大多数平台。

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

      目前正在开发中,但可能足够稳定,可以开始使用。这个想法是尽可能简单和灭亡。几乎所有样板都是可选的,具有合理的默认值。例如,仅需要 Window 标记,因为我想为窗口命名。

      The module is up on CPAN。我鼓励任何人看一看,并向我发送功能请求或错误报告。

      【讨论】:

      • 有效!在 Windows 上,同样如此。我将不得不对此进行调查。
      • 看起来很好奇——我也去看看!
      【解决方案5】:

      我自己会坚持使用 Tk。 runs on Windows 你已经知道了。

      【讨论】:

        【解决方案6】:

        我会选择 GTK,因为它有一个 study guide(目前我正在使用 Wx,并且在使用 Wx 的 Perl 中有很多可用的源代码,但没有实际的官方文档.. 除了一些文章,所以没有书...没有官方的东西),如果不是 Qt 也是一个选项,它有一些适当的文档(但我没有尝试过)。

        Tk问题很大,我不会用。

        至于您的性能问题...我敢肯定,如果它显示 100000 或 10^100 个文件,则不会担心任何像样的应用程序,因为很少有适合您的 屏幕,所以你可以做some clipping

        【讨论】:

        • 确实,WxPerl 没有翻译成 Perl 的 wxWidgets 文档的副本。但是官方的 wxWidgets 文档适用于 WxPerl 90% 的情况。在那些没有的 10% 中,它说明了 WxPerl(或类似的 WxPython)与 C++ API 有何不同。确实,在阅读参考资料时了解基本的 C++ 语法会有所帮助。
        【解决方案7】:

        如果只是为了在脚本之上获得一个简单的 GUI,那么最简单的路径是 VB.NET(或 C#)。我就是这么做的。

        使用 Visual Studio 的设计器,只需设计表单,双击开始处理的按钮,添加代码以从 GUI 元素中读取参数(例如 TextBox'es 中的文件路径)并传递通过环境变量或命令行参数向脚本提供信息。

        来自我的一个应用程序的示例(由真实用户使用):

        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 for VB.NET Express 版本是免费的。

        【讨论】:

        • 很高兴知道您使用的是 VB.NET/C#,但请注意标题中的“Perl”一词。谢谢
        • @spx2:我只发布了我的答案,因为 OP 放宽了要求:“请注意,我希望这个问题对其他 SO 用户来说是一个很好的学习机会,所以我欢迎任何答案即使它们不一定满足我自己的以下列出的限制/需求”。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-05-02
        • 2011-02-15
        • 1970-01-01
        • 1970-01-01
        • 2012-03-10
        • 1970-01-01
        • 2021-10-31
        相关资源
        最近更新 更多