2017-08-25 8 views
-1

私のコードは事前に私に許してくださいが、私は友人のためにこれを作って、曲情報、各曲のチャンネル情報、その曲に付けられた画像。今は、YoutubeのプレイリストとSoundcloudのプレイリストから掻き集めているだけです。私はそのすべてが適切に機能していますが、フロントエンドの開発には新しく、彼はまともなアプリケーションを作るために私を恐ろしい場所に残しました。私はできることを心に留めていましたが、今は単に各曲のタイトルをテキストとしてボタンを作成しています。 Here is an image of my progress.まだ、各画像をon_enterイベントの各ボタンにアタッチする方法を見つける必要がありますが、それは後で行います。ご覧のように、私はon_leave関数をコメントアウトしています。私はボタンを残すたびにself.image_windowを削除するためにそれを使用していました。問題は、マウスの動きのわずかな量でさえ、ウィンドウを削除して何十回も再現させることになります。どのように私は静的なので、私はそれが迷惑メールしない/ウィンドウを削除するボタン上にマウスを乗せているようにするのですか?Tkinter <enter>と<leave>イベントが正しく機能しない

ありがとうございます!提供JSONファイルの

from Tkinter import * 
import json 
import os 
import webbrowser 


class GUIPopulator(Frame): 
    def __init__(self, parent): 
     Frame.__init__(self) 
     self.parent = parent 
     self.configure(bg='PeachPuff2') 
     self.columnconfigure(20, weight=1) 
     self.rowconfigure(30, weight=1) 
     self.curtab = None 
     self.tabs = {} 
     self.pack(fill=BOTH, expand=1, padx=5, pady=5) 

     self.column = 0 
     self.row = 0 

    def on_enter(self, event): 

     self.image_window = Toplevel(self) 
     self.img_path = os.getcwd() + '/Rotating_earth_(large).gif' 
     self.img = PhotoImage(file=self.img_path) 

     #self.image_window.minsize(width=200, height=250) 
     self.image_window.title("Preview") 
     canvas = Canvas(self.image_window, width=200, height=200) 
     canvas.pack() 
     canvas.create_image(100, 100, image=self.img) 
    #def on_leave(self, enter): 



    def addTab(self, id): 
     tabslen = len(self.tabs) 

     tab = {} 
     if self.row < 30: 
      btn = Button(self, text=id,highlightbackground='PeachPuff2' ,command=lambda: self.raiseTab(id)) 

      btn.grid(row=self.row, column=self.column, sticky=W+E) 

      btn.bind("<Enter>", self.on_enter) 

      #btn.bind("<Leave>", self.on_leave) 


      tab['id']=id 
      tab['btn']=btn 



      self.tabs[tabslen] = tab 
      self.raiseTab(id) 
      self.row +=1 
     else: 
      self.row = 0 
      self.column +=1 
      btn = Button(self, text=id,highlightbackground='PeachPuff2' ,command=lambda: self.raiseTab(id)) 

      btn.grid(row=self.row, column=self.column, sticky=W+E) 

      tab['id']=id 
      tab['btn']=btn 

      self.tabs[tabslen] = tab 
      self.raiseTab(id) 


    def raiseTab(self, tabid): 
     with open(os.getcwd() + '/../PlaylistListener/CurrentSongs.json') as current_songs: 
      c_songs = json.load(current_songs) 

     print(tabid) 
     if self.curtab!= None and self.curtab != tabid and len(self.tabs)>1: 
      try: 
       #webbrowser.open(c_songs[tabid]['link']) 
       webbrowser.open_new('http://youtube.com') 
      except: 
       pass 



def main(): 
    root = Tk() 
    root.title('Playlist Scraper') 
    root.geometry("1920x1080+300+300") 
    t = GUIPopulator(root) 

    with open(os.getcwd() + '/../PlaylistListener/CurrentSongs.json') as current_songs: 
     c_songs = json.load(current_songs) 

    for song in c_songs: 
      t.addTab(song) 

    root.mainloop() 

if __name__ == '__main__': 
    main() 

例:私は私はあなたが使用することができると思うか、あなたが探しているものであるいくつかのコードが出ているいくつかのテストの後

{ 
    "F\u00d8RD - Shadows (feat. Samsaruh)": { 
    "page_title": "youtube", 
    "link": "youtube.com/watch?v=CNiV6Pne50U&index=32&list=PLkx04k4VGz1tH_pnRl_5xBU1BLE3PYuzd", 
    "id": "CNiV6Pne50U", 
    "channel": "youtube.com/watch?v=CNiV6Pne50U&index=32&list=PLkx04k4VGz1tH_pnRl_5xBU1BLE3PYuzd", 
    "image_path": [ 
     "http://i4.ytimg.com/vi/CNiV6Pne50U/hqdefault.jpg", 
     "CNiV6Pne50U.jpg" 
    ] 
    }, 
    "Katelyn Tarver - You Don't Know (tof\u00fb remix)": { 
    "page_title": "youtube", 
    "link": "youtube.com/watch?v=7pPNv38JzD4&index=43&list=PLkx04k4VGz1tH_pnRl_5xBU1BLE3PYuzd", 
    "id": "7pPNv38JzD4", 
    "channel": "youtube.com/watch?v=7pPNv38JzD4&index=43&list=PLkx04k4VGz1tH_pnRl_5xBU1BLE3PYuzd", 
    "image_path": [ 
     "http://i4.ytimg.com/vi/7pPNv38JzD4/hqdefault.jpg", 
     "7pPNv38JzD4.jpg" 
    ] 
    }, 
    "Illenium - Crawl Outta Love (feat. Annika Wells)": { 
    "page_title": "youtube", 
    "link": "youtube.com/watch?v=GprXUDZrdT4&index=7&list=PLkx04k4VGz1tH_pnRl_5xBU1BLE3PYuzd", 
    "id": "GprXUDZrdT4", 
    "channel": "youtube.com/watch?v=GprXUDZrdT4&index=7&list=PLkx04k4VGz1tH_pnRl_5xBU1BLE3PYuzd", 
    "image_path": [ 
     "http://i4.ytimg.com/vi/GprXUDZrdT4/hqdefault.jpg", 
     "GprXUDZrdT4.jpg" 
    ] 
    } 
} 
+1

あなたが求められている質問とは無関係であるように思われる多くのコードを掲載しました。これを外部データファイルに依存しない[mcve]に凝縮させてください。 –

+1

ボタンフィールドにマウスを移動するたびにトップレベルフレームを作成するのではなく、 '__init__'セクションにフレームを作成してから、' on_entry'を実行すると、フレームがグリッドマネージャに配置され、あるいは、必要に応じてトップレベルを上下させるために 'tkraise()'メソッドを使うことさえできます。 –

+0

問題を再現できません。マウスカーソルがボタンの中にある限り、「」と「」イベントは発生しません。彼らは私が実際に窓を離れるときにのみ発火する。ただ明確にする:ボタンの境界を離れずにマウスを動かすと、あなたは ''イベントの火を見ていますか? –

答えて

0

私はいくつか変更を加えていくつかを追加しました。

最初に、コード内で後で使用できるトップウィンドウのプレースホルダを作成する必要がありました。したがって、__init__セクションのGUIPopulatiorには、self.image_window = Noneが追加されます。私たちはすぐにこの部分について話します。

次へ私はinitにクラス属性として画像パスを作成しました。これは後で必要に応じて変更することができます。

次へ私は、self.image_windowをルートウィンドウを移動しても正しい位置に置いておくのに役立つinitbind()を追加しました。そこでを__init__セクションに追加します。

次に、バインドを作成したメソッドmove_meを作成します。 self.image_windowNoneと等しくなければ、self.image_windowが使用されていますが、これはエラーを防ぐはずですが、ユーザーがトップレベルウィンドウを閉じた後に何が起こるかを処理するためのエラー処理は作成していません。それは難しいことではありませんが、私は手元の主な問題に答えたいと思っていました。ここで

move_me方法です:

def move_me(self, event): 
    if self.image_window != None: 
     h = self.parent.winfo_height() # gets the height of the window in pixels 
     w = self.parent.winfo_width() # gets the width of the window in pixels 

     # gets the placement of the root window then uses height and width to 
     # calculate where to place the window to keep it at the bottom right. 
     self.image_window.geometry('+{}+{}'.format(self.parent.winfo_x() + w - 250, 
                self.parent.winfo_y() + h - 250)) 

は、それがNoneと等しくないかどうかをクラス属性self.image_windowNoneと等しい場合、我々は、我々が使用できるトップレベルウィンドウを作成するためにon_enter方法を変更する必要があり、次のif文のelse部分はイメージを更新するだけです。ここで

が修正on_enter方法であって、

def on_enter(self, event): 

    if self.image_window == None: 
     self.image_window = Toplevel(self) 
     #this keeps the toplevel window on top of the program 
     self.image_window.attributes("-topmost", True) 

     h = self.parent.winfo_height() 
     w = self.parent.winfo_width() 
     self.image_window.geometry('+{}+{}'.format(self.parent.winfo_x() + w - 250, 
                self.parent.winfo_y() + h - 250)) 
     self.img = PhotoImage(file=self.img_path) 
     self.image_window.title("Preview") 
     self.canvas = Canvas(self.image_window, width=200, height=200) 
     self.canvas.pack() 
     self.canv_image = self.canvas.create_image(100, 100, image=self.img) 

    else: 
     self.img = PhotoImage(file= self.img_path) 
     self.canvas.itemconfig(self.canv_image, image = self.img) 

全てということでは、しかし、この答えが正しい方向にあなたを指している必要があります対処する必要がありますあなたのコードと他のいくつかの問題があると述べました。以下は

あなたが交換する必要があなたのコードのセクションです。これにより

class GUIPopulator(Frame): 
    def __init__(self, parent): 
     Frame.__init__(self) 
     self.parent = parent 
     self.configure(bg='PeachPuff2') 
     self.columnconfigure(20, weight=1) 
     self.rowconfigure(30, weight=1) 
     self.curtab = None 
     self.tabs = {} 
     self.pack(fill=BOTH, expand=1, padx=5, pady=5) 

     self.column = 0 
     self.row = 0 

    def on_enter(self, event): 

     self.image_window = Toplevel(self) 
     self.img_path = os.getcwd() + '/Rotating_earth_(large).gif' 
     self.img = PhotoImage(file=self.img_path) 

     #self.image_window.minsize(width=200, height=250) 
     self.image_window.title("Preview") 
     canvas = Canvas(self.image_window, width=200, height=200) 
     canvas.pack() 
     canvas.create_image(100, 100, image=self.img) 
    #def on_leave(self, enter): 

class GUIPopulator(Frame): 
    def __init__(self, parent): 
     Frame.__init__(self) 
     self.parent = parent 
     self.configure(bg='PeachPuff2') 
     self.columnconfigure(20, weight=1) 
     self.rowconfigure(30, weight=1) 
     self.curtab = None 
     self.image_window = None 
     self.img_path = os.getcwd() + '/Rotating_earth_(large).gif' 
     self.tabs = {} 
     self.pack(fill=BOTH, expand=1, padx=5, pady=5) 
     self.parent.bind("<Configure>", self.move_me) 
     self.column = 0 
     self.row = 0 

    def move_me(self, event): 
     if self.image_window != None: 
      h = self.parent.winfo_height() 
      w = self.parent.winfo_width() 
      self.image_window.geometry('+{}+{}'.format(self.parent.winfo_x() + w - 250, 
                 self.parent.winfo_y() + h - 250)) 

    def on_enter(self, event): 

     if self.image_window == None: 
      self.image_window = Toplevel(self) 
      self.image_window.attributes("-topmost", True) 

      h = self.parent.winfo_height() 
      w = self.parent.winfo_width() 
      self.image_window.geometry('+{}+{}'.format(self.parent.winfo_x() + w - 250, 
                 self.parent.winfo_y() + h - 250)) 
      self.img = PhotoImage(file=self.img_path) 
      self.image_window.title("Preview") 
      self.canvas = Canvas(self.image_window, width=200, height=200) 
      self.canvas.pack() 
      self.canv_image = self.canvas.create_image(100, 100, image=self.img) 

     else: 
      self.img = PhotoImage(file= self.img_path) 
      self.canvas.itemconfig(self.canv_image, image = self.img) 
関連する問題