まず最初に何が一時的ウィンドウがルートトップレベルの例であるかを手直ししましょう。
デフォルトでは、Toplevel
は一過性ではありませんが、transient
メソッドのおかげで修正できます。ここで はスニペットです:
import tkinter as tk
root = tk.Tk()
tk.Label(root, text='root').pack()
top = tk.Toplevel(root)
tk.Label(top, text='toplevel').pack()
# uncomment to make top transient
# top.transient(root)
root.mainloop()
[OK]を、今、私たちは、特に、Windowsのタスクバーの動作に関する事実を、それについて何かを知っています。
しかし、解決策はどうですか?そこにいくつかのだ、とあなたのアプローチはOKである、のはlittlebitそれを変更してみましょう:
import tkinter as tk
import tkinter.messagebox as msg
root = tk.Tk()
if root._windowingsystem == 'win32':
# windows showerror
top = tk.Toplevel(root)
top.iconify()
msg.showerror("Oh please work oh please work oh please", "Show up on taskbar! ... *sigh", parent=top)
top.destroy()
else:
# non-windows showerror
msg.showerror("Oh please work oh please work oh please", "Show up on taskbar! ... *sigh")
root.destroy()
あなたがtkinter
のボンネットの下にクロールした場合 - あなたはparent
パラメータは本当にオプションではありませんことがわかります、とtkinter
扱いTk
としてあなたがNone
を渡す場合、親。しかし、ダミー・トップレベルでフィードすることができるので、Tk
ではなくトランジェントからToplevel
のメッセージになります。私がコメントで言ったように
また、私たちはネイティブMessageBox
呼び出すことができます。
import tkinter as tk
import tkinter.messagebox as msg
import ctypes
MB_OK = 0x0
ICON_STOP = 0x10
root = tk.Tk()
# non-transient app-wide version
native_showerror = lambda: ctypes.windll.user32.MessageBoxW(0, "Oh please work oh please work oh please",
"Show up on taskbar! ... *sigh", MB_OK | ICON_STOP)
# transient version if we pass hWnd of the root window
native_showerror_transient = lambda: ctypes.windll.user32.MessageBoxW(root.winfo_id(),
"Oh please work oh please work oh please",
"Show up on taskbar! ... *sigh", MB_OK | ICON_STOP)
if root._windowingsystem == 'win32':
# windows showerror
root.update_idletasks()
native_showerror()
else:
# non-windows showerror
msg.showerror("Oh please work oh please work oh please", "Show up on taskbar! ... *sigh")
root.mainloop()
を、それは私のための回避策としてはカウントされていないが(私たちはTkinterのに採用していない、我々は何をすべきか私たちがやりたがっている)、これは何かを再発明するものです。しかし、それはapperanceの点でより柔軟ですが、あなたの質問のポイントではありません。
このような動作は、一時的なウィンドウであり、タスクバーの位置を共有することは不思議です。 Windowsでは 'tk_messageBox'をネイティブ' MessageBox'関数のラッパーとして扱うことができ、これはデフォルトでは一時的なモーダルウィンドウです。タスクバー上で別のものにしたい場合は、 'ctypes'ビルトインを使って手動で非過渡的に呼び出すことができます。 – CommonSense
@CommonSenseは行く方法のように聞こえる!残念ながら、私はctypesやMessageBoxのラッパーを作成する方法についてはよく分かりません。私は今それを検討していますが、私が始めるためにいくつかのコードを書いておけば、うまくいきます。 – MANA624