Создание нескольких кнопок с использованием цикла for и возможность различать их и запускать отдельный код по щелчку мыши. - PullRequest
0 голосов
/ 16 мая 2018

Поэтому я пытаюсь создать функцию, которая автоматически создает 10 кнопок с помощью цикла for, размещает их на экране и называет их от 1 до 10. Затем при нажатии параметр, который был передан во время их создания, указывает другой функции, какая кнопка была нажатаи добавляет разные элементы в список.

def button_placement():
    mover = 227
    button_number = 1
    for items in range(10):
        button_number = IntVar()
        Button(canvas1, width="5", height="2", textvariable=button_number, 
        command= lambda: button_action(button_number)).place(x=150, y=mover)
        mover = mover + 50
        button_number = button_number +1
def button_action(button_identifier):
    global list2
    global list1
    for buttons in range(1,10):
        if button_identifier == buttons:
            if len(list1) > 1:
                list2.append(list1[buttons])

Там, где в списке 1 и 2 уже есть элементы.И прошу прощения за глобальные переменные. В настоящий момент что-то не так с операндом IntVar в button_placement.Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

Я не уверен, почему вы помещаете Button s в Canvas, и не совсем то, что вы пытаетесь сделать с двумя глобальными list s - поэтому я оставил их и просто сделал command функция print() какой идентификатор кнопки теперь передается в качестве аргумента.

Тем не менее, вот исполняемый пример, который показывает, как передать дополнительные аргументы в функцию обработчика команд Button, определив для нее аргумент по умолчанию с желаемым значением в нем при объявлении функции lambda.

Хотя это также можно сделать с помощью partial, как описано в @ Novel's answer , но этот подход, вероятно, является более распространенным способом, чем он, и более кратким, чем использование functools. В любом случае вам не нужно использовать IntVar, чтобы выполнить то, что вы хотите, поскольку теперь вы фактически передадите значение функции.

from tkinter import *

def button_placement(canvas):
    xpos, ypos = 150, 25
    for button_number in range(1, 11):
        button = Button(canvas, width='5', height='2', text=button_number,
                    anchor=CENTER, command=
                    lambda id=button_number: button_action(id))
        window = canvas.create_window(xpos, ypos, window=button)
        ypos += 50

def button_action(button_identifier):
    print('Button {} pressed'.format(button_identifier))

root = Tk()
canvas = Canvas(root, height=500)
button_placement(canvas)
canvas.pack()
canvas.mainloop()

Вот как это работает в моей системе Windows:

screenshot showing buttons

0 голосов
/ 16 мая 2018

Вы не можете использовать lambda в этой ситуации, потому что это поздняя привязка. Вместо этого используйте functools.partial. Кроме того, вам не нужен IntVar, используйте обычное целое число в Python.

from functools import partial

def button_placement():
    mover = 227
    for button_number in range(10):
        btn = Button(canvas1, width="5", height="2", text=button_number, 
            command= partial(button_action, button_number))
        btn.place(x=150, y=mover)
        mover = mover + 50
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...