Problem w Tkinter z .destroy() dla okna Toplevel

0
#! /usr/bin/env python3

import tkinter as tk
from tkinter import *

ok_gl = tk.Tk()
ok_gl.title('Dnf-er')
ok_gl.geometry("900x600+600+50")

def f_ok2(event):
	global ok2
	x_ok_gl,y_ok_gl=guzN.winfo_rootx(), guzN.winfo_rooty()
	ok2=Toplevel(ok_gl)
	ok2.title('Okno nr 2')
	ok2.grab_set()
	ok2.transient(ok_gl)
	ok2.resizable(0,0)
	ok2.geometry("300x200+"+str(x_ok_gl+10)+"+"+str(y_ok_gl+10))
	ok2.protocol("WM_DELETE_WINDOW", ok2.destroy)
	return

guzN=tk.Button(ok_gl, text="Nowe",)
guzN.bind("<ButtonRelease-1>",f_ok2)
guzN.place(x=20, y=20)

def f_a(event):
	print('tutaj')
	try:
		global ok2
		ok2.destroy()
	except: pass
	return

ok_gl.bind('<Configure>', f_a)

ok_gl.protocol("WM_DELETE_WINDOW", ok_gl.destroy)
ok_gl.mainloop()

Gdzie mam problem. Funkcja f_a() zamyka dodatkowe okno, gdy ruszę okno, ale dzieje się to po ruchu i puszczeniu. Ja potrzebuję, aby zamknęło się po chwyceniu za pasek tytułu. W przypadku zastosowania w miejsce <Configure> <Button-1> lub <Bx-Motion> to to tylko działa wewnątrz okna.
Ktoś, coś?

Pozdrawiam
Radosław Głębicki

0

Widzę, że nikt nie błądzi moimi ścieżkami.
Znalazłem rozwiązanie stosując inny typ "okna". Teraz stosuję część menu rozwijanego w pozycji pod myszką, ale napotkałem inny problem. Kod poniżej:

from tkinter import *

a=['cut','copy','paste',]

def f_rmb(zd):
	def wybor(s_co):
		wpis.delete(0, "end")
		wpis.insert(0, s_co)
	#cm_list=[]                   # < odhaczyć
	#for i in a:                    # < odhaczyć
		#cm_list+=[(i, lambda: wybor(i))]    # < odhaczyć
	cm_list=[	                  # < zahaczyć
		(a[0], lambda: wybor(a[0])), # < zahaczyć
		(a[1], lambda: wybor(a[1])), # < zahaczyć
		(a[2], lambda: wybor(a[2])), # < zahaczyć
		]                                          # < zahaczyć

	rmenu = Menu(wpis, tearoff=0, takefocus=0)
	for (lbl, cmd) in cm_list:
		rmenu.add_command(label=lbl, command=cmd)
	rmenu.tk_popup(zd.x_root, zd.y_root+20, entry="0")
	return

main = Tk()
main.geometry("300x100+100+100")

wpis=Entry(main)
wpis.bind('<ButtonRelease-3>', f_rmb, add='')
wpis.pack(side="top")

main.mainloop()

Ten kod działa. Tam są linijki do odhaczyć/zahaczyć.
Po zmianie, gdy w pętli generuję kolejne pozycje menu, aktywna pozostaje tylko ostatnia lambda więc wybranie dowolnej pozycji w menu zawsze wstawi do pola "paste". Założenie jest, aby dodawać kolejne pozycje do listy "a" na początku.
A w tym wypadku może ktoś, coś?

Pozdrawiam
Radosław Głębicki

0

Wynalazłem gdzieś w sieci i po dopasowaniu działa:

from tkinter import *

a=['cut','copy','paste','cos extra']

def f_rmb(zd):
    def wybor(s_co):
        wpis.delete(0, "end")
        wpis.insert(0, s_co)

    rmenu = Menu(wpis, tearoff=0, takefocus=0)
    for txt in a:
        rmenu.add_command(label=txt, command=lambda zm=txt: wybor(zm))
    rmenu.tk_popup(zd.x_root, zd.y_root+20, entry="0")
    return

main = Tk()
main.geometry("300x100+100+100")

wpis=Entry(main)
wpis.bind('<ButtonRelease-3>', f_rmb)
wpis.pack(side="top")

main.mainloop()

Jak zwykle: może się komuś przyda. Nazywa się chyba menu dynamiczne.
Pozdrawiam

1 użytkowników online, w tym zalogowanych: 0, gości: 1