2012-04-27 25 views
4

私はpython 2.7とtkinterでアプリケーションを書いています。私は様々なオプションを表示するそれぞれのトップウィンドウを開くいくつかのボタンを備えたツールバーを作成しました。オプションウィンドウが開いているか閉じているかを示す指標として、「ツールボタン」スタイルのttk.Checkbuttonを使用しました。現在どのtkinterウィンドウが上にあるかを調べる

問題は、別のウィンドウが選択されている場合、オプションウィンドウが背面に移動することです。現在、ツールボタンを再度選択すると、オプションウィンドウが閉じます。しかし、私はそれが上にある場合、ウィンドウを閉じたいだけです。オプションウィンドウが上にない場合は、ウィンドウを前面に移動します。

Iが作動しているコードの一部:ここ

class MainWindow: 
    def __init__(self,application): 
     self.mainframe=tk.Frame(application) 
     application.geometry("900x600+30+30") 

     self.otherOptionsSelect=tk.IntVar() 
     self.otherOptions_Button=ttk.Checkbutton(application,style='Toolbutton',variable=self.otherOptionsSelect, 
               onvalue=1, offvalue=0,image=self.optionsIcon, command=self.otherOptions) 
    def otherOptions(self): 

     if self.otherOptionsSelect.get()==0: 
      self.otherOptions.destroy() 
      return 

     self.otherOptions=tk.Toplevel() 
     self.otherOptions.title("IsoSurface Options") 
     self.otherOptions.geometry("200x165+"+str(int(application.winfo_x())+555)+"+"+str(int(application.winfo_y())+230)) 

     self.otherOptApply_button=ttk.Button(self.otherOptions,text="Apply",command=self.showFrame) 
     self.otherOptApply_button.place(x=20,y=80,width=50,height=30) 

     self.otherOptClose_button=ttk.Button(self.otherOptions,text="Close",command=self.otherOptionsClose) 
     self.otherOptClose_button.place(x=80,y=80,width=50,height=30) 

    def otherOptionsClose(self): 
     self.otherOptionsSelect.set(0) 
     self.otherOptions.destroy() 

全体私が書かれているアプリケーションの画像である:上記画像における enter image description here

、各ウィンドウは、それぞれttk.checkbuttonを有します。現時点では、チェックボタンを切り替えると、ウィンドウが開閉されます。しかし、私が本当にやりたいことは、ウィンドウがアプリケーションの前にある場合はウィンドウを閉じ、アプリケーションの後ろにある場合はウィンドウを前面に持っていくことです。

これによっていくつかの問題が解決されることを願っています。

ありがとうございます!

+0

チェックボタンを選択した場合、チェックボタン付きのウィンドウは常に上に表示されませんか、または背景ウィンドウのボタンをクリックできるウィンドウマネージャはありますか? –

+0

おそらく私は少しこれをクリアする必要があります。私は、複数のチェックボタンを備えたツールバーがある「メインウィンドウ」を持っています。各チェックボタンは "トップレベル"ウィンドウを開閉しますが、 "メインウィンドウ"はまだアクティブです。 「トップレベル」のウィンドウは、常に「メインウィンドウ」の上にあるわけではありません。バックグラウンドに移動できます。たぶん私はいくつかの画像を投稿しようとします。 – Onlyjus

+0

私はイメージを投稿しようとしましたが、私はもっと評判が必要です... – Onlyjus

答えて

5

実際には、ウィンドウの積み重ね順序を確認することは可能です。 Tkinterを使って、情報を得るために面白いtclのevalsをしなければなりません。私はのセクションのTkDocで答えを見つけ、「Stacking Order」になるまでスクロールダウンします。このコードは私が対話的に遊び始めるまで私を困惑させました。私のテストコードはでした:

import Tkinter as tk 
root = tk.Tk() 
root.title('root') 
one = tk.Toplevel(root) 
one.title('one') 
two = tk.Toplevel(root) 
two.title('two') 

2は、上にそれらすべて下記ことと、ルートの下の一つであったように、私は、ウィンドウを操作します。その構成では、以下のすごみはあなたの窓の相対的なレイヤー伝えることができます:「はい、ウィンドウ2は、ウィンドウのルート上にある」という意味の

root.tk.eval('wm stackorder '+str(two)+' isabove '+str(root)) 

1を返し、意味

root.tk.eval('wm stackorder '+str(root)+' isabove '+str(two)) 

0を返し、次ながら「いいえ、ウィンドウのルートがウィンドウ2の上ではありません。」

root.tk.eval('wm stackorder '+str(root)) 

このような奇妙な文字列に何かの形で順に積層フルウィンドウバックできます::

'. .68400520L .68401032L' 

あなたがコマンドを実行したときに理解するために開始します。また、コマンドを使用することができます:「 『

str(root) 
str(one) 
str(two) 

とルートは内部名を持っていることを把握、一つは』 .68400520L」であり、2つは「.68401032L」です。 root.tk.eval('wm stackorder '+str(root))の出力を後方に読むので、2つが上にあり、1つがその下にあり、ルートが両方の下にあるということです。

関連する問題