プロが教えるわが家の防犯対策術!

少し前から、Tkinterを使って居りウィンドウを常に最前面に表示したいと思い立ちwin32guiとwin32conと言うモジュールが必要で、インポートするところまで辿り着いたのは良いのですが、その後がよくわかりません。

実験的に
from Tkinter import *
import win32gui,win32con
root = 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__'

引数の与え方もいろいろなサイトの切れ端を集めたような感じで書いてしまったのでそもそもの書き方が違っているのかもしれません。
私の検索が不足なのは重々承知ですが、よろしければ実際にはどのように書けばウィンドウを最前面に出すことができるのかと、エラーメッセージの具体的な意味を教えて欲しいです。お願いします。

A 回答 (1件)

どうやら無理そうです。



エラーがでている直接的な原因は、
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がお勧めです。)
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
うーん、無理っぽいんですか・・・
wxPythonも後で調べて見ます。
詳しい解説までして頂きありがとうございました。

お礼日時:2007/05/20 18:17

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!