Параметр Button отображает только последнюю кнопку, а не нажатую кнопку (python, tkinter).

#python #python-3.x #tkinter

Вопрос:

В настоящее время я работаю над проектом для своего ноутбука с помощью экранной панели, чтобы создать окно быстрого доступа, которое отображает и позволяет мне открывать файлы, которые я часто использую. Я сделал сетку и кнопки, но когда я нажимаю одну из кнопок в сетке, лямбда передает только позицию последней кнопки. Как я могу сделать так, чтобы команда кнопки отправляла положение сетки нажатой кнопки? заранее спасибо

 import tkinter as tk
from tkinter import *
from tkinter import filedialog
from tkinter.filedialog import askopenfilename
import tkinter.font as font
import PIL as pl
from PIL import ImageTk, Image
import ctypes

# ----------WINDOW----------
# new window
root = Tk()
# remove title bar
root.overrideredirect(1)
# roughly move to second monitor
root.geometry(' 100 1000')
# maximize the window
root.state('zoomed')
# window on top
root.attributes('-topmost', 1)

lastClickX = 0
lastClickY = 0

def SaveLastClickPos(event):
    global lastClickX, lastClickY
    lastClickX = event.x
    lastClickY = event.y

def Dragging(event):
    x, y = event.x - lastClickX   root.winfo_x(), event.y - lastClickY   root.winfo_y()
    root.geometry(" %s %s" % (x , y))

# make a frame for the title bar
title_bar = Frame(root, bg='#2e2e2e', relief='raised', bd=2, highlightthickness=0)

# put a close button on the title bar
close_font = font.Font(size=30)
close_button = Button(title_bar, text='X', command=root.destroy, bg='#2e2e2e', padx=20, pady=2, activebackground='red',
                      bd=0, fg='white',highlightthickness=0)
close_button['font'] = close_font

window = Canvas(root, bg='#2e2e2e',highlightthickness=0)

# pack the widgets
title_bar.pack(expand=0, fill=X)
close_button.pack(side=RIGHT)
window.pack(expand=1, fill=BOTH)

title_bar.bind('<Button-1>', SaveLastClickPos)
title_bar.bind('<B1-Motion>', Dragging)

# -------FILE EXPLORER-------
def explore(x, y):
    Tk().withdraw()
    filename = askopenfilename()
    print(filename)

    filepath = open('filepath.txt', 'a')

    N = str(x * 10   y)
    print(N)

    filepath.write(N   " "   filename   'n')
    filepath.close()

# ------------GRID-----------
Grid.rowconfigure(window, 0, weight=1)
Grid.columnconfigure(window, 0, weight=1)

frame=Frame(window)
frame.grid(row=0, column=0, sticky=N S E W)


AddIMG = Image.open(r'C:Usersvan dolderPicturespngImage.png')
Addphoto = ImageTk.PhotoImage(AddIMG)

Density=10
hor=int(Density)
ver=int(hor / 2)
for x in range(hor):
    Grid.columnconfigure(frame, x, weight=1)
    for y in range(ver):
        Grid.rowconfigure(frame, y, weight=1)
        add_button = Button(frame, image=Addphoto, fg='white', bg='#2e2e2e', relief='flat', borderwidth=1)
        add_button.grid(row=y, column=x, sticky=N S E W)
        add_button.config(command=lambda column=x, row=y: explore(x, y))

root.mainloop()
 

Любая помощь будет очень признательна.

Комментарии:

1. Пожалуйста, постарайтесь свести к минимуму свой пример, чтобы помочь людям понять, что не так. Например, является ли функция «Перетаскивания» существенной для вашей проблемы в примере?

Ответ №1:

Вы пытаетесь создать закрытие, но не используете переменные, созданные lambda .

Вам нужно это изменить:

 add_button.config(command=lambda column=x, row=y: explore(x, y))
 

К этому:

 add_button.config(command=lambda column=x, row=y: explore(column, row))
 

Комментарии:

1. Ты просто потрясающая! спасибо за быстрый ответ! это решило все мои проблемы