我正在制作音乐播放器GUI,但无法使其显示在任务栏或Alt- Tab中。我已将overrideredirect()设置为true以删除边框和标题。我也做到了,这样当用户执行“鼠标单击并拖动”操作时,窗口就会移动。这是代码:
import tkinter import sys import os class Win(tkinter.Tk): global imgfile imgfile = r"play.png" def __init__(self, master=None): def close(): self.destroy() sys.exit() def dirchosen(): global songlist songlist = [] try: os.chdir(dirinput.get()) except: print("Invalid Directory") raise for file in os.listdir(dirinput.get()): songlist.append(file) tkinter.Tk.__init__(self, master) self.overrideredirect(True) self._offsetx = 0 self._offsety = 0 self.bind('<Button-1>', self.clickwin) self.bind('<B1-Motion>', self.dragwin) self.geometry("350x200") self.config(bg="#FF4766") titlelabel = tkinter.Label(self, text="FoxSGR Media Player", bg="#FF4766", font=("Segoe UI", 12)) titlelabel.pack(ipady=4) chdirbutton = tkinter.Button(self, relief="groo", activebackground="#FF8080", command=dirchosen) chdirbutton.config(text="Choose Directory", bg="#FF4766", font=("Segoe UI", 8)) chdirbutton.pack() chdirbutton.place(relx=0.66, rely=0.22) dirinput = tkinter.Entry(self, font=("Segoe UI", 8), width="34") dirinput.pack() dirinput.place(relx=0.05, rely=0.23) xbutton = tkinter.Button(self, text="x", height="1", command=close) xbutton.config(bg="red", activebackground="#FF8080", relief="groo", font=("Segoe UI", 8)) xbutton.pack() xbutton.place(relx=0.90, rely=0.05) def dragwin(self, event): x = self.winfo_pointerx() - self._offsetx y = self.winfo_pointery() - self._offsety self.geometry('+{x}+{y}'.format(x=x, y=y)) def clickwin(self, event): self._offsetx = event.x self._offsety = event.y win = Win() # Had to set the images appart from up there imgplay = tkinter.PhotoImage(file=imgfile) playbutton = tkinter.Button(win, image=imgplay, bg="#FF4766", relief="flat") playbutton.pack() playbutton.place(rely=0.45, relx=0.4) imgnext = tkinter.PhotoImage(file="next.png") nextbutton = tkinter.Button(win, image=imgnext, bg="#FF4766", relief="flat") nextbutton.pack() nextbutton.place(rely=0.45, relx=0.57) imgprev = tkinter.PhotoImage(file="previous.png") prevbutton = tkinter.Button(win, image=imgprev, bg="#FF4766", relief="flat") prevbutton.pack() prevbutton.place(rely=0.45, relx=0.30) win.mainloop()
有什么办法可以使其至少出现在Alt-Tab中?
经过一些研究,我发现有一种方法可以执行此操作,但是它涉及使用ctypes,并且是Windows的唯一解决方案:
import tkinter as tk import tkinter.ttk as ttk from ctypes import windll GWL_EXSTYLE=-20 WS_EX_APPWINDOW=0x00040000 WS_EX_TOOLWINDOW=0x00000080 def set_appwindow(root): hwnd = windll.user32.GetParent(root.winfo_id()) style = windll.user32.GetWindowLongW(hwnd, GWL_EXSTYLE) style = style & ~WS_EX_TOOLWINDOW style = style | WS_EX_APPWINDOW res = windll.user32.SetWindowLongW(hwnd, GWL_EXSTYLE, style) # re-assert the new window style root.wm_withdraw() root.after(10, lambda: root.wm_deiconify()) def main(): root = tk.Tk() root.wm_title("AppWindow Test") button = ttk.Button(root, text='Exit', command=lambda: root.destroy()) button.place(x=10,y=10) root.overrideredirect(True) root.after(10, lambda: set_appwindow(root)) root.mainloop() if __name__ == '__main__': main()
这涉及使用ctypes来操纵Windows样式,但是您需要根据应用程序环境使用正确的Get / Set函数。对于32位窗口,看来您需要使用: GetWindowLongW和SetWindowLongW 或 GetWindowLongA和SetWindowLongA
GetWindowLongW
SetWindowLongW
GetWindowLongA
SetWindowLongA
但64位的需要: GetWindowLongPtrW和SetWindowLongPtrW 或 GetWindowLongPtrA和SetWindowLongPtrA 看到这
GetWindowLongPtrW
SetWindowLongPtrW
GetWindowLongPtrA
SetWindowLongPtrA
或者,如果您默认需要这种行为:
import tkinter as tk from ctypes import windll class Tk(tk.Tk): def overrideredirect(self, boolean=None): tk.Tk.overrideredirect(self, boolean) GWL_EXSTYLE=-20 WS_EX_APPWINDOW=0x00040000 WS_EX_TOOLWINDOW=0x00000080 if boolean: print("Setting") hwnd = windll.user32.GetParent(self.winfo_id()) style = windll.user32.GetWindowLongW(hwnd, GWL_EXSTYLE) style = style & ~WS_EX_TOOLWINDOW style = style | WS_EX_APPWINDOW res = windll.user32.SetWindowLongW(hwnd, GWL_EXSTYLE, style) self.wm_withdraw() self.wm_deiconify()