当窗口聚焦时,是否聚焦文件时获得用户输入

时间:2020-01-03 01:11:07

标签: python tkinter parallel-processing

这是一个多线程问题,但实际上不是。我有一个Python Tkinter 顶级窗口(已测试Python 2.7和3.5):

wman remove new windows.png

第二个按钮定义为:

    btn2 = tk.Button(button_frame, text='Remove new', \
                     command=self.remove)
    btn2.pack(side=tk.LEFT)

按下按钮时调用此功能:

def remove(self):
    ''' Remove windows on monitor now that weren't there at start '''
    new_windows = []
    new_windows_cnt = 0
(... SNIP out boring stuff ...)

上面的代码在窗口具有焦点并且用户单击按钮时起作用。现在,我正在创建此Ubuntu Unity Keyboard自定义快捷方式:

Ubuntu custom keyboard shortcut.png

注意:快捷方式似乎无效,但这不是一个大问题


现在是问题的并行处理部分

创建一个在顶级窗口没有焦点时连续运行的函数:

def parallel_processing(self)
    while (not_toplevel_destroyed):
        try:
            f = open("/tmp/w")
            self.remove()
        except IOError:
            pass         # TODO: Test if IOError is even, else delete this and above
        finally:
            f.delete()

        time.sleep(.1)

注意:当 Toplevel 窗口具有焦点时,如果此新功能也运行,则可以,这将是1/10秒的延迟加速键。

btn2打包后如何调用此新函数?

Toplevel 被包含以下内容的按钮1破坏时,如何终止此新功能:

btn = tk.Button(button_frame, text='Close', \
                command=self.toplevel.destroy)
btn.pack(side=tk.LEFT)

解决了!

以下可接受的答案有效,但是我的概念草案中存在一些错误。这是最终代码:

import os
import time
(... SNIP ...)

        button_frame = tk.Frame(self.toplevel)
        button_frame.pack(side=tk.BOTTOM, fill=tk.BOTH, expand=True)

        btn = tk.Button(button_frame, text='Close', \
                        command=self.close_toplevel)
        btn.pack(side=tk.LEFT)

        btn2 = tk.Button(button_frame, text='Remove new', \
                         command=self.remove)
        btn2.pack(side=tk.LEFT)

        self.toplevel_active = True
        self.parallel_processing()

    def close_toplevel(self):
        self.toplevel_active = False
        time.sleep(0.2)
        self.toplevel.destroy()

    def parallel_processing(self):
        if os.path.exists("/tmp/w"):
            os.remove("/tmp/w")
            self.remove()

        if self.toplevel_active:
            root.after(100, self.parallel_processing) 

    def remove(self):
        ''' Remove windows on monitor now that weren't there at start '''
        new_windows = []
        new_windows_cnt = 0
(... SNIP ...)

这是测试证明:

$ echo 1 > /tmp/w

$ ll /tmp/w
ls: cannot access '/tmp/w': No such file or directory

该文件不存在,因为python程序正在运行。 parallel_processing(self)函数似乎增加了不到1%的CPU负载。

1 个答案:

答案 0 :(得分:1)

我不确定我是否理解问题。

您可以使用root.after代替whilesleep,它不会阻止root.mainloop()

def parallel_processing(self)
    try:
        f = open("/tmp/w")
        self.remove()
    except IOError:
        pass         # TODO: Test if IOError is even, else delete this and above
    finally:
        f.delete()

    if self.not_toplevel_destroyed:
        root.after(100, self.parallel_processing) 

btn2 = tk.Button(button_frame, text='Remove new', command=self.remove)
btn2.pack(side=tk.LEFT)

self.not_toplevel_destroyed = True
self.parallel_processing()

您可以分配功能,该功能会将not_toplevel_destroyed = False设置为停止功能,并等待几毫秒以确保其成功,然后它将破坏窗口。

def close_app(self)
    self.not_toplevel_destroyed = False
    time.sleep(0.2)
    self.toplevel.destroy()

btn = tk.Button(button_frame, text='Close', command=self.close_app)
btn.pack(side=tk.LEFT)