私のコードは事前に私に許してくださいが、私は友人のためにこれを作って、曲情報、各曲のチャンネル情報、その曲に付けられた画像。今は、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"
]
}
}
あなたが求められている質問とは無関係であるように思われる多くのコードを掲載しました。これを外部データファイルに依存しない[mcve]に凝縮させてください。 –
ボタンフィールドにマウスを移動するたびにトップレベルフレームを作成するのではなく、 '__init__'セクションにフレームを作成してから、' on_entry'を実行すると、フレームがグリッドマネージャに配置され、あるいは、必要に応じてトップレベルを上下させるために 'tkraise()'メソッドを使うことさえできます。 –
問題を再現できません。マウスカーソルがボタンの中にある限り、「」と「」イベントは発生しません。彼らは私が実際に窓を離れるときにのみ発火する。ただ明確にする:ボタンの境界を離れずにマウスを動かすと、あなたは ''イベントの火を見ていますか? –