小编ekl*_*ekl的帖子

NSEvent全局事件监控在后台进行

我正在编写一个简单的Mac应用程序,旨在在后台运行并在用户单击鼠标按钮时执行某些操作.该应用程序是使用PyObjC用Python编写的.我addGlobalMonitorForEventsMatchingMask用来观看NSLeftMouseDown比赛:

NSEvent.addGlobalMonitorForEventsMatchingMask_handler_(NSLeftMouseDownMask, handler)
Run Code Online (Sandbox Code Playgroud)

在终端中运行时,此代码非常有效.但是,当我将其捆绑为独立应用程序(使用py2app)然后启动它时,应用程序最初不会收到任何事件.(或者至少,如果确实如此,它不会在我的处理程序方法中运行代码.)只有当我点击Dock中的应用程序时它才开始接收事件,之后,它继续接收事件,甚至在它之后返回后台.但是直到激活一次它才会收到任何东西.

我的问题是:如何让我的应用程序在启动后立即开始接收事件,而无需先通过单击Dock图标来激活它?这是一些已知的怪癖NSEvents,或者在PyObjC中我的运行循环可能有问题吗?

非常感谢任何帮助或指导!

编辑:经过进一步测试,事实上,我的应用程序似乎在发布后大约十秒钟内自动开始接收通知,无论我是否激活它.这有点烦人,但很好.

但是,如果我使用其中任何一个LSUIElement = trueLSBackgroundOnly = true我的Info.plist(我最终想要做的,因为这个应用程序应该只在后台运行并且永远不会出现在Dock中)运行应用程序,我从未收到通知.所以我仍然被困住了.

python macos cocoa pyobjc appkit

23
推荐指数
1
解决办法
1113
查看次数

Node.js和Express:异步操作后如何返回响应

我是Node.js的新手,所以我仍然围绕着异步函数和回调.我现在的奋斗是如何在异步操作中从文件读取数据后返回响应.

我的理解是发送响应就像这样(这对我有用):

app.get('/search', function (req, res) {
    res.send("request received");
});
Run Code Online (Sandbox Code Playgroud)

但是,现在我想读取一个文件,对数据执行一些操作,然后在响应中返回结果.如果我想对数据执行的操作很简单,我可以做这样的事情 - 内联执行它们,并保持对res对象的访问,因为它仍在范围内.

app.get('/search', function (req, res) {
    fs.readFile("data.txt", function(err, data) {
        result = process(data.toString());
        res.send(result);
    });
});
Run Code Online (Sandbox Code Playgroud)

但是,我需要执行的文件操作很长很复杂,我已经把它们分成了一个单独的文件中的自己的函数.结果,我的代码看起来更像这样:

 app.get('/search', function (req, res) {
    searcher.do_search(res.query);
    // ??? Now what ???
});
Run Code Online (Sandbox Code Playgroud)

我需要打电话res.send才能发送结果.但是,我无法在上面的函数中直接调用它,因为do_search异步完成.我不能在回调中调用它,do_search因为res对象不在那里.

有人可以帮我理解在Node.js中处理这个问题的正确方法吗?

javascript asynchronous node.js express

15
推荐指数
1
解决办法
1万
查看次数

MongoDB聚合:将所有记录分组到一个结果中

在mongodb聚合调用中,如何使用$ group运算符将管道中的所有文档分组为单个结果?

假设我有一组看起来像这样的记录:

{
    user_id: 234,
    signup_date: 2013-06-27
}
Run Code Online (Sandbox Code Playgroud)

我想使用aggregate函数在数据库中查询在给定日期范围内注册的用户列表,并将其作为列表返回.我想要一个看起来像这样的结果:

{
    users: [234, 235, 236]
}
Run Code Online (Sandbox Code Playgroud)

我的查询看起来像这样:

db.users.aggregate([

    { $match: {
        signup_date: {
            $gte: date_begin_variable,
            $lt: date_end_variable
    }},
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.我现在有一个记录子集,所有记录都有一个所需范围内的注册日期.但这是我遇到麻烦的地方.现在我想将所有这些记录分组到一个包含所有ID列表的结果中.但我不知道如何使用$ group.

    { $group: {
        _id: null
        users: { $addToSet: user_id }
    }}

])
Run Code Online (Sandbox Code Playgroud)

当我尝试_id:null时,我找回了一个空的用户ID列表.

我可以使用find()返回所需的记录集,然后只需手动将ID处理到列表中,但使用aggregate()执行此操作似乎更清晰.我错了吗?什么是完成我所描述的最佳方式,使用聚合或不使用聚合?

database mongodb

9
推荐指数
1
解决办法
5368
查看次数

Mac OS X——最前面的窗口发生变化时收到通知

我想知道 Mac OS X 中是否有一种方法可以在最前面的窗口切换到另一个窗口时接收通知 - 无论是 Objective-C 解决方案、Python、AppleScript 还是其他窗口。我想查看整个系统,而不仅仅是我的应用程序内。我的应用程序试图跟踪用户当前正在处理的文件,并且我有一个轮询解决方案,可以通过运行 AppleScript 经常获取最前面的应用程序和最前面的窗口,但如果我可以运行该解决方案,它会简化我的生活仅当我知道最前面的窗口已更改时才进行检查。

我还研究了 NSDistributedNotificationCenter 和 NSEvents 的全局事件监视器,它们都以不同的方式有用,但似乎无法为我提供我理想中寻找的特定前窗口更改通知。

任何关于我应该尝试的方向的想法,或者这是否可能,将不胜感激!

macos events notifications applescript objective-c

5
推荐指数
1
解决办法
1789
查看次数

将 Python 框架捆绑到 Xcode 应用程序中

我正在使用 Xcode 4.6.2 构建一个 PyObjC 应用程序,并试图弄清楚如何将 Python 框架与我的应用程序捆绑在一起,以便我可以引用它,而不依赖于具有特定 Python 版本的主机系统。

(我之前问过这个问题,但从那时起,我决定嵌入框架是更好的方法。)

我知道这是人们所做的事情——根据我的经验,大多数独立的 Python 应用程序都会在其中打包 Python 安装。但我不知道如何让它为我工作。

我已使用构建阶段“复制文件”面板将 Python.framework 复制到我的项目中,并且 Python.framework确实显示在我的应用程序包中,但我不知道如何让应用程序引用它。

如果我在 Xcode 中的“链接的框架和库”中链接到 Python.framework,该应用程序会正确构建,但在 10.6 上启动时失败,并出现错误

Dyld Error Message:
    Library not loaded: /System/Library/Frameworks/Python.framework/Versions/2.7/Python
    Referenced from: {/path/to/my/app}
    Reason: image not found
Run Code Online (Sandbox Code Playgroud)

...因为 10.6 只有 Python 2.5,并且它正在搜索系统框架,而不是我的应用程序包中包含的框架。

如果我链接到 Xcode 中的 Python 框架,应用程序将无法构建。

那么,我如何告诉我的应用程序我希望它使用捆绑在我的应用程序中的 Python.framework appname.app/Contents/Frameworks/Python.framework,而不是位于 的系统 Python.framework /System/Library/Frameworks/Python.framework

我在这个问题上陷入了僵局,任何帮助将不胜感激。

python macos xcode pyobjc xcode4.5

5
推荐指数
1
解决办法
2526
查看次数

OS X 上的 Python 中的看门狗库——不显示完整的事件路径

我刚刚开始在 Mac 上使用Python 中的Watchdog 库,并且正在进行一些基本测试以确保一切按照我的预期运行。不幸的是,它们不是——我似乎只能获取包含注册事件的文件的文件夹的路径,而不是文件本身的路径。

下面是一个简单的测试程序(对 Watchdog 提供的示例稍加修改),用于在注册事件时打印出事件类型、路径和时间。

import time
from watchdog.observers import Observer
from watchdog.events import LoggingEventHandler
from watchdog.events import FileSystemEventHandler

class TestEventHandler(FileSystemEventHandler):

def on_any_event(self, event):
    print("event noticed: " + event.event_type + 
                 " on file " + event.src_path + " at " + time.asctime())

if __name__ == "__main__":
    event_handler = TestEventHandler()
    observer = Observer()
    observer.schedule(event_handler, path='~/test', recursive=True)
    observer.start()
    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        observer.stop()
    observer.join()
Run Code Online (Sandbox Code Playgroud)

src_path 变量应包含发生事件的文件的路径。

但是,在我的测试中,当我修改文件时, src_path 仅打印包含该文件的文件夹的路径,而不是文件本身的路径。例如,当我修改moon.txt文件夹中的文件时europa,程序会打印以下输出:

event noticed: …
Run Code Online (Sandbox Code Playgroud)

python filesystems macos python-watchdog

3
推荐指数
1
解决办法
2168
查看次数

Firefox是否提供AppleScript支持以获取Windows的URL?

我正在尝试编写一个AppleScript,其中包括获取Firefox中每个打开的网页的URL.

在Safari(和Chrome)中,这非常简单:

tell application "Safari" to return URL of every tab in every window
Run Code Online (Sandbox Code Playgroud)

但是,在我看来,Firefox没有提供真正的AppleScript支持,例如获取任何选项卡或窗口的URL.当我将"Firefox"和"AppleScript"这两个术语放在一起时,我主要得到Firefox错误请求,要求恢复AppleScript支持,最后在2010年或2011年更新(像这样这个).

我是否正确地想,Firefox不再提供任何适当的AppleScript支持?我意识到有一些半解决方法,比如在AppleScript中模拟键命令,但那些对我来说并不实用.

firefox applescript

3
推荐指数
1
解决办法
3072
查看次数