写入龟甲GUI控制台

2024-10-01 04:44:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经为一个特定的存储库创建了一个工具/插件,可以在TortoiseHgGUI中启动

这个工具在.NET控制台应用程序(在bg中运行)中运行一些耗时的任务(3-4分钟),我想知道是否可以以及如何将一些数据写入到Ortoisehg的控制台。只是为了通知用户

我发现了一个有趣的Mercurial.Net库:https://archive.codeplex.com/?p=mercurialnet,在讨论选项卡的网站上,有人问了同样的问题:

Great library! How would one display messages to TortoiseHg? Either as a a message box or in the output log.

有人回答:

It should be enough to just print them to the console, ie. either:
Console.Out.WriteLine("information");

但对我来说,它不起作用

以下是我迄今为止尝试的(简单)代码:

 Mercurial.Client.SetClientPath(@"C:\Program Files\TortoiseHg");
 Mercurial.Repository repo = new Repository(_documentDirectory);
 Console.Out.WriteLine("information");

我错过什么了吗

编辑

我为TortoiseHG创建了一个自定义Python扩展,我将其保存在以下文件夹中:C:\Program Files\TortoiseHG\hText,并在mercurial.ini文件中添加了以下内容:

[extensions]
logger = C:/Program Files/TortoiseHg/hgext/console-logger.py

from mercurial import registrar
from mercurial.i18n import _

cmdtable = {}
command = registrar.command(cmdtable)

@command('WriteToTortoise', [], norepo=True)
def WriteToTortoise(ui, value):
    ui.warn('INFO: ' + value + '\n\n')

这使我可以使用writeTortoose命令: enter image description here

它也可以在cmd中使用,只是在乌龟身上看不到喷射

enter image description here

至少我在C#(初始工具在其中运行)中制作了一个测试控制台应用程序,并拥有此代码

class Program
{
    static void Main(string[] args)
    {
        Mercurial.Repository repo = new Repository(@"C:\Users\Rymo\source\repos\Test");

        Mercurial.Gui.GuiClient.ClientType = GuiClientType.PyQT;
        var cmd = new WriteGuiConsole();
        Mercurial.Gui.GuiClient.Execute(repo, cmd);
        //Mercurial.Gui.GuiClient.InitGui(repo);
        Console.ReadLine();
    }
}

我的命令(请参阅cmd变量):

class WriteGuiConsole : IGuiCommand
{
    public string Command => "WriteToTortoise";

    public IEnumerable<string> Arguments => new string[] { "This message should be visible in Tortoise.." };

    public Collection<string> AdditionalArguments => new Collection<string>();

    public IMercurialCommandObserver Observer => new DebugObserver();

    public int Timeout => 3000;

    public void After(int exitCode, string standardOutput, string standardErrorOutput)
    {
        Console.WriteLine($"exitCode: {exitCode}");
        Console.WriteLine($"standardOutput: {standardOutput}");
        Console.WriteLine($"standardErrorOutput: {standardErrorOutput}");
    }

    public void Before()
    {
    }

    public void Validate()
    {
    }
}

public class CustomDebugObserver : IMercurialCommandObserver
{
    public void ErrorOutput(string line)
    {
        Console.WriteLine($"ErrorOutput: {line}");
    }

    public void Executed(string command, string arguments, int exitCode, string output, string errorOutput)
    {
        Console.WriteLine($"command: {command}");
        Console.WriteLine($"arguments: {arguments}");
        Console.WriteLine($"exitCode: {exitCode}");
        Console.WriteLine($"output: {output}");
        Console.WriteLine($"errorOutput: {errorOutput}");
    }

    public void Executing(string command, string arguments)
    {
        Console.WriteLine($"command: {command}");
        Console.WriteLine($"arguments: {arguments}");
    }

    public void Output(string line)
    {
        Console.WriteLine($"line: {line}");
    }
}

我可以从C#代码(推/拉/还原等)访问所有的乌龟功能,但是一个简单的控制台输出目前似乎是一座过桥

编辑 又是一个没有成功的早晨。。同情将工具的控制台输出重定向到Windows窗体应用程序以通知用户可能会更快

但是一定有人能把我推向正确的方向,或者告诉我我在浪费时间

编辑 这个话题也被发布在龟甲开发者论坛(谷歌集团)上,当我得到答案时,我也会在这里更新它

编辑 我越来越近了。。我对Python扩展进行了如下修改:

    from mercurial import registrar
    from mercurial.i18n import _
    from subprocess import Popen, PIPE, STDOUT

    def uisetup(ui):
        p = Popen('ConsoleToTortoiseTest.exe', stdout = PIPE, stderr = STDOUT, shell = True)
        WriteToTortoise(ui, p.stdout.readline())

    cmdtable = {}
    command = registrar.command(cmdtable)

    @command('WriteToTortoise', [], norepo=True)
    def WriteToTortoise(ui, value):
        ui.warn('INFO: ' + value.replace('+', ' ') + '\n\n')

现在的问题是,它不是实时写入控制台,而是在我调用fe时写入。“hg help”命令,我想这是因为hg命令启动扩展,然后扩展正在执行.NET应用程序的子例程。现在不是解决方案

enter image description here

如有任何建议,将不胜感激


Tags: fromimportuinewstringpublicargumentsmercurial