2017-04-26 4 views
0

特定のキーの組み合わせを押すとポップアップするポップアップキャンバスを作成しようとすると、矢印キーを使用してスクロールしてからエスケープキーを使って閉じることができる画像が表示されます。これはすべてキャンバスの上に描かれており、マップ上に矢印キーを使用して地図を移動することができます。私はこれに関して多くの問題を抱えているので、私はちょうど別々の投稿をするのではなく、1つの投稿ですべてを尋ねると思っていました。よくポップアップキャンバスの操作

現在、私はこの問題を解決するためにいくつかのアプローチを試みましたが、今朝はオンラインになってから数分前にもう1つの可能なオプションが表示されます。

質問1:ポップアップキャンバスはどこで作成しますか?元

def __init__(self, parent): 

でか、通常のポップキャンバスを形成するために、ポップアップへの切り替えの時間まで待つのですか?私は両方の方法でそれを試して、両方のアプローチで問題を見てきました。スタートアップ時にそれを形成することにより、ポップアップが画面上に現れ、ポップアップが表示されます。私はeffbot.orgでstate = 'hidden'属性を使用していると見ていますが、それを使用しようとすると「disabled」または「normal」しか使用できないというエラーが表示されます。

質問2:プログラムの開始時にポップアップを作成し、ポップアップキーのコンボが押されるまで待っている場合は、使用するまでポップアップを隠す方法を教えてください。

私は0x0までのポップアップを試してみましたが、キーコンボを押すまで、画面上にはまだ1つのピクセルしか表示されません。

キーコンボがヒットしてポップアップが表示され、2番目の画像に変更する準備が整うまでうまく動作するまで待ってみました。

effbot.orgでは、ポップアップが表示されたときにキャンバスを破棄することなく「無効にする」ために、いくつかの組み合わせを試してみました。私が持っている問題は、私が行って矢印キーを押すと、下のキャンバスにまだフォーカスがあり、ポップアップ上の画像を変更する代わりに地図を移動することです。私はまた、

self.canvas.bind('<FocusOut>') 
self.canvaspopup.bind('<FocusIn>') 

を試してみましたそして、まだ運、下のキャンバスは、まだフォーカスを持っていないし、私はまだ代わりにマップを移動しています...

self.canvas.config(state='disabled') 
self.canvaspopup = Canvas(self, width=800, height=614) 
self.canvaspopup.pack_propagate(0) 
self.canvaspopup.place(x=284,y=52) 
self.png = Label(self.canvaspopup) 
self.png.pack()    
self.canvaspopup.focus_set() 

をeffbotの組み合わせのいくつかを試してみましたポップアップで画像を前進させる。 effbot.orgのEvents and BindingsページにあるFocusIn/Outを見ていると、.configファイルではなく.bindステートメントに記述する必要があると私は思っています。

質問3:フォーカスを取るためにポップアップを取得するにはどうすればいいですか?キーボードフォーカスとマウスフォーカスはほとんど必要ありませんか?

私は、別の場所の下にある地図をクリックしてプログラムをインターネットに接続し、その場所のデータをプルアップしてポップアップが何かであるようにするために、ポップアップを便利にしたいと思っていますプログラムの実行中に何度も使用されます。私が見てきた私が

self.canvaspopup.destroy() 

を使用することができますから、私は知っている。しかし、私は再びそれを再作成しなければならないので、これはキャンバスを破壊します。だから、私はプログラムの冒頭にポップアップの作成を入れて...私はうんざりしており、それを再作成することはできません。これは質問2に戻ります。

間違いなく混乱します。私は大部分がうまく働いています。それはちょうど相互作用であり、このような状況を処理する適切な方法を知っています。

答えて

0

placeを使用しているので、place_forgetを使用してポップアップを非表示にすることができます。フォーカスの場合、focus_setを使用します。ここで

は例です:

import tkinter as tk 

class PopupCanvas(tk.Canvas): 
    def __init__(self, parent, *args, **kwargs): 
     tk.Canvas.__init__(self, parent, *args, **kwargs) 

     self.parent = parent 
     self.text_item=self.create_text(10, 10, anchor="nw") 
     self.bind("<Left>", self.handle_left) 
     self.bind("<Right>", self.handle_right) 
     self.bind("<Escape>", self.hide) 

    def handle_left(self, event=None): 
     self.itemconfigure(self.text_item, text="You clicked left") 

    def handle_right(self, event=None): 
     self.itemconfigure(self.text_item, text="You clicked right") 

    def show(self, event=None): 
     self.place(relx=.5, rely=.5, anchor="center") 
     self.focus_set() 

    def hide(self, event=None): 
     self.place_forget() 
     self.parent.focus_set() 

root = tk.Tk() 
label = tk.Label(root, text="Press 'p' to pop up a canvas, <escape> to hide it\n" + 
       "Press left and right arrows when the popup is visible") 

canvas = tk.Canvas(root, width=400, height=400) 
popup = PopupCanvas(canvas, width=200, height=200, background="pink") 

label.pack(side="top", fill="x") 
canvas.pack(side="top", fill="both", expand=True) 

canvas.focus_set() 
canvas.bind("<p>", popup.show) 

root.mainloop()