Я недавно начал изучать питон. У меня мало опыта работы с графическим интерфейсом, и я хотел узнать больше. После небольшого исследования я нашел 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()
Я бы сохранил переменные 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()
У вас проблема из-за
lambda
в цикле for (см. stackoverflow.com/questions/2295290/… и stackoverflow.com/questions/17677649/…)