Perl/Tk Dropsite:拖动具有任意 Unicode 名称的 Windows 文件

问题描述 投票:0回答:1

在 Perl/Tk 应用程序中,我想将具有任意 unicode 文件名的文件拖放到小部件上。

有一个 DropSite 工作示例: perl tk 从 Windows 资源管理器拖放文件夹 但它不适用于包含 unicode 字符的文件名,例如西里尔文与德语混合。特殊字符(不在本地代码页上)被接收为“?”。

有人有解决办法吗?

perl unicode drag-and-drop tk-toolkit
1个回答
0
投票

Ikegami 提到的 Microsoft 帮助页面,如何更改 Windows 代码页还展示了如何更改所有 Windows 的代码页(不仅仅是每个应用程序):

转至 Windows 设置 > 时间和语言 > 语言和区域 > 管理语言设置 > 更改系统区域设置,然后选中 Beta:使用 Unicode UTF-8 获得全球语言支持。然后重新启动电脑以使更改生效。

我这样做了,它对我来说效果很好,也解决了 DropSite 问题。 (但是你需要将接收到的字符串解码为utf8。

因此上述工作脚本的修改版本将是:

use strict;
use warnings;
use Tk;
use Tk::DropSite;
use Encode;

my $textVariable = "drag here";

my $mw = MainWindow->new;

my $frame = $mw->Frame(
)->pack(-side => 'top', -expand => 1, -fill => 'x');

$frame->Label(
    -text => "My Label",
    -anchor => 'w',
    -width => 10,
)->pack(-ipady => 1, -side => 'left');

my $entry = $frame->Entry(
    -textvariable => \$textVariable,
    -width => 40,
)->pack(-side => 'left');

$frame->DropSite(
    -dropcommand => [\&AcceptDrop, $frame],
    -droptypes => ('Win32'),
);

$mw->MainLoop;


sub AcceptDrop {
    my ($widget, $selection) = @_;
    my $filename;

    $filename = decode_utf8 $widget->SelectionGet(
        -selection => $selection, 
        'STRING'
    );
    $textVariable = $filename;
} # /AcceptDrop
© www.soinside.com 2019 - 2024. All rights reserved.