`.tk.call` hakkında

from tkinter import *
root = Tk()
menu = Menu(root, tearoff=0)
for i in ('One', 'Two', 'Three'):
    menu.add_command(label=i)
####
if (root.tk.call('tk', 'windowingsystem')=='aqua'):
    root.bind('<2>', lambda e: menu.post(e.x_root, e.y_root))
    root.bind('<Control-1>', lambda e: menu.post(e.x_root, e.y_root))
else:
    root.bind('<3>', lambda e: menu.post(e.x_root, e.y_root))
####
root.mainloop()

Arayüzün herhangi bir yerine tıklanırsa orada bir menü açılıyor. Anlayamadığım kısmı yorum satırları arasına koydum.

.tk.call ile bir tkinter objesi üzerinden alttaki Tcl interpreter’i ile direkt iletişime geçebiliyorsunuz. Paslanan argümanlar Tcl komutu gibi algılanıyor. Sizdeki örnekte

tk windowingsystem

komutu veriliyor:

Returns the current Tk windowing system, one of x11 (X11-based), win32 (MS Windows), classic (Mac OS Classic), or aqua (Mac OS X Aqua).

Dolayısıyla alttaki pencereleme sisteminin Mac OS X Aqua olup olmamasına göre değişik işler yapılıyor. Öyleyse, “mouse’taki orta tık” ile “CTRL+mouse’taki sol tık” olaylarına menü açma fonksiyonu .bind ediliyor; değilse “mouse’taki sağ tık” olayına menü açma fonksiyonu bağlanıyor (menü açma fonksiyonu tekrar edilmiş o açıdan iyi bir kod değil).

Bu arada root üzerinden veya menu üzerinden çağrılması bir fark oluşturmuyor; maksat oraya ulaşmak:

>>> root.tk.call == menu.tk.call
True

Aynı yere bakıyorlar.

1 Beğeni

Teşekkür ederim. e neyi temsil ediyor burada root’u mu?

.bind'ın dokümantasyonuna bakarsak (help(root.bind) ile görülebilir)

Signature: root.bind(sequence=None, func=None, add=None)
Docstring:
Bind to this widget at event SEQUENCE a call to function FUNC.
...
FUNC will be called if the event sequence occurs with an
instance of Event as argument.

İlk pasladığınız argüman "olay"dır, yani “event”. Bu event gerçekleştiğinde (örneğin mouse’taki sağ tıka basmak) ikinci argüman func çağrılır; bu fonksiyona da bir olay objesi (tk.Event class’ının) paslanıyor. Dolayısıyla e de onu temsil ediyor. Bu obje size olayla ilgili bilgiler verebilir, örneğin burada e.x_root ile olayın (mouse’a tıklama) gerçekleştiği pozisyonun (ekrana göre) x koordinatını elde ediyoruz (sonra da orada menü açılıyor mesela).

1 Beğeni