2017-02-15 15 views
0

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

from tkinter import * 
import tkinter.messagebox 
import random 

#count=0 

root = Tk() 
TreasureMap = Frame(root) 
TreasureMap.grid() 

root.title("TreasureMap") 
text_box = Entry(TreasureMap, justify=RIGHT) 

text_box.grid(row = 0, column = 0, columnspan = 8,) 
text_box.insert(0, "0") 

amount_to_add='B' 
my_array = [[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],  
[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0], 
[0,0,0,0,0,0,0,0]] 
my_array[random.randrange(len(my_array))].append(amount_to_add) 
my_array[random.randrange(len(my_array))].append(amount_to_add) 
my_array[random.randrange(len(my_array))].append(amount_to_add) 
my_array[random.randrange(len(my_array))].append(amount_to_add) 

Treasure='T' 
my_array[random.randrange(len(my_array))].append(Treasure) 
my_array[random.randrange(len(my_array))].append(Treasure) 
my_array[random.randrange(len(my_array))].append(Treasure) 
my_array[random.randrange(len(my_array))].append(Treasure)  
my_array[random.randrange(len(my_array))].append(Treasure) 
my_array[random.randrange(len(my_array))].append(Treasure) 
my_array[random.randrange(len(my_array))].append(Treasure) 
my_array[random.randrange(len(my_array))].append(Treasure) 
my_array[random.randrange(len(my_array))].append(Treasure) 
my_array[random.randrange(len(my_array))].append(Treasure) 


print(my_array) 


def changelabel(): ` 
     tkinter.messagebox.showinfo('Hellow this button works') `` 
     print('hello this button works') ` `` 
     print(my_array) `` `` 
     return 



i = 0 
bttn = [] 
for j in range(1,9):`  
    for k in range(8): ``  
    bttn.append(Button(TreasureMap, text = ' ', value=random.shuffle  
    (my_array),command=changelabel))  
    bttn[i].grid(row = j, column = k)   
    i += 1 ``  


TreasureMap.mainloop() 

ответ

0

Возможно, это то, что вы хотите сделать.
Заимствование информации от this answer, я положил callback в команду Button, чтобы передать номера строк и столбцов.
Кроме того, 'B' и 'T' добавляются к каждому массиву 0, вместо того, чтобы присваиваться местоположениям в массиве, что, как я думаю, вам нужно.
Я сделал несколько других изменений, в том числе фиксации for петель начать с 0 (первая строка) и т.д.

# previous code 

amount_to_add='B' 
my_array = [[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],  
[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0], 
[0,0,0,0,0,0,0,0]] 

# ... all code up to here unchanged ... 

for _ in range(4): 
    my_array[random.randrange(len(my_array))][random.randrange(len(my_array))] = amount_to_add 

Treasure='T' 
for _ in range(4): 
    my_array[random.randrange(len(my_array))][random.randrange(len(my_array))] = Treasure 

# print my_array # uncomment to check array values before shuffle 
random.shuffle(my_array) 
# print my_array # and after shuffle to confirm button is getting the correct values 

def changelabel(j,k): 
    tkinter.messagebox.showinfo('Button %d,%d' % (j,k), 'Button %d,%d contains a %s' % (j,k, my_array[j][k])) 
     print('hello this button works') 
     # return # not needed 

i = 0 
bttn = [] 

for j in range(0,8): 
    for k in range(8): 
     bttn.append(Button(TreasureMap, text = ' ', command= lambda row = j, column = k: changelabel(row, column))) 
     bttn[i].grid(row = j, column = k)   
     i += 1 

Не стесняйтесь комментировать или задавать вопросы, если это не делать то, что вы просили для. В противном случае, надеюсь, это поможет.

+0

Что делает команда = лямбда row = j, column = k: changelabel (строка, столбец) делать в этом коде ?? Команда –

+0

- это аргумент, переданный кнопке так же, как вы ее использовали. Однако мы также хотим включить в «changelabel» параметры, чтобы узнать, какую строку/столбец вызывала кнопка. [Обратный вызов может быть функцией, связанным методом или любым другим вызываемым объектом Python] (http://effbot.org/tkinterbook/button.htm#Tkinter.Button.config-method), здесь 'changelabel' * - это функция * и [lambda] (http://www.secnetix.de/olli/Python/lambda_functions.hawk) присваивает 'j' и' k' во время выполнения в качестве параметров для перехода на 'changelabel' – davedwards