这是一个多线程问题,但实际上不是。我有一个Python Tkinter 顶级窗口(已测试Python 2.7和3.5):
第二个按钮定义为:
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自定义快捷方式:
注意:快捷方式似乎无效,但这不是一个大问题
创建一个在顶级窗口没有焦点时连续运行的函数:
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负载。
答案 0 :(得分:1)
我不确定我是否理解问题。
您可以使用root.after
代替while
和sleep
,它不会阻止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)