Аргументы кнопки tkinter

Я недавно начал изучать питон. У меня мало опыта работы с графическим интерфейсом, и я хотел узнать больше. После небольшого исследования я нашел tkinter, чтобы сделать это реальным. Как проект решил сделать игру вдохновителем.

Что я делаю, так это помещаю несколько строк с помощью OptionMenu с доступными цветами. Справа я поместил кнопку подтверждения, для которой установлена ​​команда «проверить». Дело в том, что я хочу передать разные значения каждой кнопке (кадру и строке) с помощью следующего кода, проблема в том, что он говорит, что строка всегда равна 9.

Я подумал о возможном решении, это сбросить в конце y = 0 и каждый раз, когда я нажимаю кнопку, добавляю 1. Но я думаю, что это должно быть проще.

from tkinter import *

def selectedColor(var):
    print("Value is: " + var)

def validate(frame, row):
    # pass
    print("Frame: " + str(frame) + " row: " + str(row))
    rowToValidate = frame.nametowidget("." + str(row))
    for x in range(0,4):
        columnValue = frame.nametowidget("." + str(x) + str(row))
        print(columnValue)

master = Tk()

OPTIONS

 = [
    "RED",
    "BLUE",
    "YELLOW",
    "VIOLET",
    "ORANGE",
    "GREEN",
    "BROWN",
    "WHITE",
    "BLACK"
]

colorQuantity = 4
tries = 10
for y in range(0, tries):
    frame = Frame(master, name=str(y))
    isEnabled = "disabled" if y != 0 else "normal"
    for x in range(0,colorQuantity):
        variable = StringVar(frame, name=str(x)+str(y))
        variable.set("Choose color") # default value
        # print(str(variable))

        w = OptionMenu(frame, variable, *OPTIONS, command=selectedColor)        
        w.configure(state=isEnabled)
        w.pack(side=LEFT)
    confirmButton = Button(frame, text="Confirm", command= lambda: validate(frame, y+1))
    confirmButton.configure()
    confirmButton.pack(side=TOP)
    print(str(frame))
    frame.pack(side=TOP)


master.mainloop()   

У вас проблема из-за lambda в цикле for (см. stackoverflow.com/questions/2295290/… и stackoverflow.com/questions/17677649/…)

j_4321 10.08.2018 16:08
0
1
89
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я бы сохранил переменные OptionMenu в списке, чтобы упростить получение их значений. Используя partial (ссылка на сайт) в параметре команды, вы можете убедиться, что каждая строка получает правильный номер строки в качестве входных данных.

См. Код ниже (я также добавил немного форматирования в раскрывающиеся списки):


from tkinter import *
from functools import partial

def selectedColor(var):
    print("Value is: " + var)

def validate(args):
    frame = args[0]
    row = args[1]

    for x in range(0,4):
        print(rows[row][x].get())

master = Tk()

OPTIONS = [
    "RED",
    "BLUE",
    "YELLOW",
    "VIOLET",
    "ORANGE",
    "GREEN",
    "BROWN",
    "WHITE",
    "BLACK"
]

colorQuantity = 4
tries = 10
rows =[]
for y in range(0, tries):
    frame = Frame(master, name=str(y))
    isEnabled = "disabled" if y != 0 else "normal"
    row = []
    for x in range(0,colorQuantity):
        variable = StringVar(frame, name=str(x)+str(y))
        variable.set("Choose color") # default value
        # print(str(variable))
        row.append(variable)

        w = OptionMenu(frame, variable, *OPTIONS, command=selectedColor)  
        w.configure(width=len("Choose color"))      
        w.configure(state=isEnabled)
        w.pack(side=LEFT)
    rows.append(row)
    confirmButton = Button(frame, text="Confirm", command=partial(validate,(frame, y)))
    confirmButton.configure()
    confirmButton.pack(side=TOP)
    print(str(frame))
    frame.pack(side=TOP)


master.mainloop()

Другие вопросы по теме