2017-08-17 174 views
1

Pythonアプリケーションを作成していて、メッセージボックスでエラーを通知すると、Linux(MintとUbuntuでテスト済み)で動作するように動作しますが、 Windowsはタスクバーにアプリケーションを作成しないので、失われます。私はそれを正面にくっつけることもできますが、それはまた少し不快です。ここで私が働いているものです:Windowsタスクバーにtkinterメッセージボックスが表示されない

だから、1つのワークアラウンド私がいたの代わりに、非常にすでに減少し、私はちょうど0に不可視またはルートを設定し、それを最小化し、ルートウィンドウを引き出す見つけた
from tkinter import Tk, messagebox 

root = Tk() 
messagebox.showerror("Oh please work oh please work oh please", "Show up on taskbar! ... *sigh") 
root.withdraw() 
+0

このような動作は、一時的なウィンドウであり、タスクバーの位置を共有することは不思議です。 Windowsでは 'tk_messageBox'をネイティブ' MessageBox'関数のラッパーとして扱うことができ、これはデフォルトでは一時的なモーダルウィンドウです。タスクバー上で別のものにしたい場合は、 'ctypes'ビルトインを使って手動で非過渡的に呼び出すことができます。 – CommonSense

+0

@CommonSenseは行く方法のように聞こえる!残念ながら、私はctypesやMessageBoxのラッパーを作成する方法についてはよく分かりません。私は今それを検討していますが、私が始めるためにいくつかのコードを書いておけば、うまくいきます。 – MANA624

答えて

0

まず最初に何が一時的ウィンドウがルートトップレベルの例であるかを手直ししましょう。

デフォルトでは、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の点でより柔軟ですが、あなたの質問のポイントではありません。

+0

申し訳ありませんが、受け入れるのに私の時間がかかりました。とにかく、これは私が探している行動を与える。私はその理由を後で調べることができます – MANA624

0

- 不可視出口ボタンを押す可能性は低い。その後、OSがWindowsを実行しているかどうかを確認し、そうでなければ、私はrootを撤回します。

from tkinter import Tk, messagebox 
import sys 

root = Tk() # We need a main window 
root.attributes('-alpha', 0.0) 
root.wm_state('iconic') 
if not sys.platform.lower().startswith("win"): 
    root.withdraw() 
messagebox.showerror("Oops!", "Sorry! Could not connect to the server!") 
root.withdraw() 

注:WindowsとLinuxは私がサポートしています唯一の2つのプラットフォームですが、私はこれは同様にMac上で動作します推測しています。あなたが違っていると私に教えてください

関連する問題