質問: tk() win32gui.setwindowpos(root,win32con.hwnd_topmost,0,0,200,150,win32con.swp_showwindow) root.mainloop() のようなコードを実行してみたのですが以下のようなエラーメッセージが帰ってきます。 traceback (most recent call last): file "c:\documents and settings\pc user\デスクトップ\python\q2.py", line 9, in -toplevel- win32gui.setwindowpos(root,win32con.hwnd_topmost,1,1,100,50,win32con.swp_showwindow) attributeerror: tk instance has no attribute '__int__' 引数の与え方もいろいろなサイトの切れ端を集めたような感じで書いてしまったのでそもそもの書き方が違っているのかもしれません。 私の検索が不足なのは重々承知ですが、よろしければ実際にはどのように書けばウィンドウを最前面に出すことができるのかと、エラーメッセージの具体的な意味を教えて欲しいです。お願いします。
回答: どうやら無理そうです。 エラーがでている直接的な原因は、 win32gui.setwindowpos(root,win32con.hwnd_topmost,...) では、windowsオブジェクト(この場合rootという名前のtk()のインスタンス)の__int__メソッドが呼ばれるのですが、そもそもtk()には、 これがないためです。 ここで呼び出されようとするものは、 ウィンドウハンドラであり(詳しくは”hwnd”とググって下さい) これを渡しています。 hwnd=winfo_id()なのかな?ということで、変えてみます。 -------------------------------------------------------------- from tkinter import * import win32gui import win32con root = tk() hwnd = root.winfo_id() win32gui.setwindowpos(hwnd,win32con.hwnd_topmost,0,0,0,0, win32con.swp_nomove | win32con.swp_nosize) root.mainloop() -------------------------------------------------------------- エラーは出なくなりますが、最前面固定にはなりません。 tkの動きをwindowsのapiが変えようとしているわけですが、 ネットで調べてみても、win32で、windowsネイティブのapiでguiを作っている例はありますが、tkでの成功例は見当たりませんでした。 短時間に再描画を繰り返すというあんまりな回避策はありましたが、、、。 tkinterのもとは、tkですが、tkだけではそこまで出来なさそうなのと、 tkinter(python←→tk) win32all(python←→windows)のつなぎのモジュールなので、 windowsネイティブな高度な操作は、tkinterでは、多分できないと思います。 常に最前面に出す必要のあるウィンドウといえばエラーダイアログですが、xwpythonならば、”そのアプリ内で”常に再前面のということができます。 他のアプリも含め、すべてのウィンドウより前面に出したいとなると、やはり難しいと思われます。gui全部を、win32gui を使って書くしかないかもしれません。 (常に最前面に出すということは良く考えると危ういものです。) また、本質問の回答からはそれますが、 個人的には、tkinterだけでなくwin32allも入れるくらいなら いっそのこと、wxpythonを使って書いたほうがよいと思います。 (tkinterは、ピュアpythonにこだわりたいときとかで、javaでいうawt,swingという位置づけで考えています。リッチなことをやろうというときは、swt等を使うように、wxpythonがお勧めです。)