【发布时间】:2021-10-17 09:46:09
【问题描述】:
我想完全自定义我的应用程序,所以我创建了一个标题栏并想出了一种方法来拖动它,但现在我的问题是它缺少一些功能,比如调整大小和各种动画,我想知道是否有可能只是摆脱一些图书馆的标题栏?或者也许可以恢复一些功能并让我不必在每次我想隐藏窗口时都使用 overrideredirect?
第一个选项更好,我确实使用ctypes.windll 让窗口回到任务栏,但它似乎也不是最实用的解决方案。
目前的代码如下所示:
import tkinter as tk
from ctypes import windll
GWL_EXSTYLE = -20
WS_EX_APPWINDOW = 0x00040000
WS_EX_TOOLWINDOW = 0x00000080
WS_BORDER = 0x00800000
class Application(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
self.overrideredirect(True)
self.after(10, self.setup_window)
self.geometry('1000x500+500+250')
self.app_hidden = False
self.bind('<Expose>', self.show_app)
# for full customization im using different widgets as buttons
# lets assume its on the custom title bar
text = tk.Label(self, width=10, height=2,
bg='blue', text='close', foreground='white')
text.pack()
text.bind('<ButtonPress-1>', self.hide_app)
# taken from another post
def setup_window(self, t: int = 10):
hwnd = windll.user32.GetParent(self.winfo_id())
style = windll.user32.GetWindowLongPtrW(hwnd, GWL_EXSTYLE)
style = style & ~WS_EX_TOOLWINDOW
style = style | WS_EX_APPWINDOW
res = windll.user32.SetWindowLongPtrW(hwnd, GWL_EXSTYLE, style)
self.wm_withdraw()
self.after(t, self.wm_deiconify)
def hide_app(self):
if not self.app_hidden:
self.overrideredirect(False)
self.iconify()
self.app_hidden = True
def show_app(self, event):
if self.app_hidden:
self.overrideredirect(True)
self.setup_window()
self.app_hidden = False
if __name__ == '__main__':
app = Application()
app.mainloop()
我想要的是能够回到边界,我尝试通过添加来做到这一点
WS_BORDER = 0x00800000
...
def setup_window(self):
...
style = style | WS_BORDER
...
但它没有用,而且我也希望没有已经存在的不必要的绑定,所以主要问题是是否可以在没有 overrideredirect 的情况下使用 overrideredirect,如果那里有一些可以使用的库与高级别的默认窗口管理器交互?
【问题讨论】:
-
overrideredirect without overrideredirect 我相信你在这里看到了问题。所以答案是否定的,要么您自己进行窗口管理,要么将其绑定到可用选项。此外,还有一些示例如何使用
overrideredirect拖放窗口。
标签: python python-3.x windows tkinter customization