【发布时间】:2021-08-15 04:32:53
【问题描述】:
我想创建一个位于所有其他窗口下方的 tkinter 窗口,并且无法使用 Window 的 SetWindowPos() 函数进行交互。我希望下面的代码可以解决问题,但是出现的窗口可以调整大小,可以接受焦点,接收鼠标点击,并且不在其他所有内容之下。
import time
import ctypes.wintypes
from ctypes import c_bool, c_int
from ctypes.wintypes import HWND, UINT
import tkinter
# Create a window and get its HWND
root = tkinter.Tk()
hwnd = root.winfo_id()
# Flags to move the window to the bottom and keep it from being touched
SWP_NOSIZE = 0x0001
SWP_NOMOVE = 0x0002
SWP_NOACTIVATE = 0x0010
SWP_NOOWNERZORDER = 0x0200
SWP_NOSENDCHANGING = 0x0400
swpFlags = SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOSENDCHANGING
SetWindowPos = ctypes.windll.user32.SetWindowPos
SetWindowPos.argtypes = [HWND, HWND, c_int, c_int, c_int, c_int, UINT]
SetWindowPos.restype = c_bool
HWND_BOTTOM = 1
root.update()
SetWindowPos(hwnd, HWND_BOTTOM, 0, 0, 400, 600, swpFlags)
while True:
time.sleep(0.1)
root.update_idletasks()
root.update()
【问题讨论】:
-
我现在不在windows机器上,所以我不能运行代码,但同时这里有一些建议:Tkinter应用程序开发应该遵循(1)创建的一般流程使用
tk.Tk()的根小部件,(2) 在根上创建小部件,(3) 使用pack、grid或place将小部件放置在根上,以及(4) 运行root.mainloop()。以这种方式重构您的代码可能会神奇地解决您的所有问题。我稍后会回到这个问题来添加更多细节!看这里:docs.python.org/3/library/… -
使用
mainloop()并在.after()回调中安排SetWindowPos()调用不能解决问题。 -
@boof:按照你的建议,没有什么神奇的方法。
-
我认为
root.update_idletasks()调用是不必要的/多余的,因为root.update()应该处理 Tk 事件循环的完整迭代。 -
没有理由打电话给
update_idle_tasks或update()。您没有实际的 tkinter 应用程序正在执行其mainloop()。SetWindowPos()调用似乎没有任何效果,无论您调用一次还是多次。
标签: python windows tkinter tk user32