Программа запоминает лишь самый последний процесс
Есть вот такой недоделанный диспетчер задач на tkinter:
root = Tk()
root.title("Splash")
root.geometry("500x500")
root.configure(background='Grey')
root.resizable(0,0)
frame = Frame(root)
for proc in psutil.process_iter():
frameobject = Frame(frame)
label = Label(frameobject, text=f"слитый працес: {proc.name()}", font=("Helvetica", 10), width=70, height=2, bg='black', fg='white')
label.pack()
m = Menu(root, tearoff = 0)
m.add_command(label =proc.name(), command = lambda: print(proc))
def do_popup(event):
try:
m.tk_popup(event.x_root, event.y_root)
finally:
m.grab_release()
label.bind("<Button-3>", do_popup)
frameobject.pack()
frame.pack()
root.mainloop()
он должен вывести все активные процессы и при нажатии на них с пкм должен вывести контекстное меню в котором имя процесса, но место этого в контекстном меню не данный процесс, а как я понял последний в списке процесс:

Ответы (1 шт):
from tkinter import *
import psutil
root = Tk()
root.title("Splash")
root.geometry("500x500")
root.configure(background='Grey')
root.resizable(0,0)
frame = Frame(root)
def do_popup(event, proc):
m = Menu(root, tearoff=0)
m.add_command(label=proc.name(), command=lambda: print(proc))
try:
m.tk_popup(event.x_root, event.y_root)
finally:
m.grab_release()
for proc in psutil.process_iter():
frameobject = Frame(frame)
label = Label(frameobject, text=f"слитый працес: {proc.name()}", font=("Helvetica", 10), width=70, height=2, bg='black', fg='white')
label.pack()
label.bind("<Button-3>", lambda event, proc=proc: do_popup(event, proc))
frameobject.pack()
frame.pack()
root.mainloop()
Процесс приходится передавать таким хитрым способом, потому что в вашем варианте функция видит глобальную переменную proc, которая на момент завершения цикла содержит последний процесс. Когда значение передается через параметр, оно становится локальной переменной функции, не зависящей от состояния внешней переменной.
В принципе, ситуация аналогичная вот этому вопросу, только при биндинге еще нужно принимать в лямбду и передавать в обработчик параметр event.
