对于Perl程序,Windows GUI工具包有哪些好的选择?

时间:2009-09-21 14:46:31

标签: windows perl user-interface

我正在考虑在我的Windows桌面上执行一些任务自动化(例如,对大量音乐/文本/照片文件进行分类等)。

看看我的主要开发人员专业领域是如何在Unix上使用Perl,我更愿意坚持使用Perl来编写我需要做的任何业务逻辑,只是为了提高开发效率。

问题是,如果我想在工作之上打一些GUI(Unix上的ala 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前端:)

7 个答案:

答案 0 :(得分:6)

关于界面的“perlishness”,我建议简单的Tk。不幸的是,它看起来很陈旧,而且非win32-ish。

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

有一些Tk替换实际上是围绕Tcl / Tk的薄包装(我想Tcl :: Tk和Tkx)。它们看起来比Perl / Tk更现代,但我也没有亲身经验。如果您只是针对Windows进行开发,请查看随附(我认为)Tkx的ActivePerl。他们的ppm4包管理器是用它编写的,看起来很漂亮!

答案 1 :(得分:5)

perlfaq3中列出了许多选项,而其他一些选项则没有。我只熟悉基于Tk的那些。

Perl/Tk拥有最“perlish”的界面,但它尚未更新,以利用当前版本的Tk中的tile(本机/主题小部件)支持(可能永远不会)。 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。

答案 2 :(得分:3)

虽然Tk和Qt也可用(最初用于其他语言的一般框架,你也可以使用Perl),而Tk可能最受欢迎,因为它已经存在时间最长,Win32::GUI似乎符合你的要求要求最好。如果您喜欢WISIWYG GUI设计人员,可以在Win32 :: GUI之上使用Loft,但如果您宁愿以编程方式执行所有操作,则不必这样做。

答案 3 :(得分:3)

无耻的插件 - 我正在编写一个纯粹的Perl GUI工具包XUL::Gui,它使用Firefox渲染其GUI。它允许你做任何可以做的事情(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。我鼓励任何人看一看,并向我发送功能请求或错误报告。

答案 4 :(得分:2)

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

答案 5 :(得分:2)

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

Tk有很大的问题,我不会用它。

至于你的性能问题......我很确定如果它显示100000或10 ^ 100个文件,那么没有合适的应用会受到关注,因为很少适合你的 屏幕,这样你就可以some clipping

答案 6 :(得分: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 for VB.NET的Express版本是免费的。

相关问题