diff options
-rw-r--r-- | VisualMatchActivity.py | 30 | ||||
-rw-r--r-- | card.py | 26 | ||||
-rw-r--r-- | deck.py | 26 | ||||
-rw-r--r-- | gencards.py | 46 | ||||
-rw-r--r-- | sprites.py | 121 | ||||
-rwxr-xr-x | visualmatch.py | 42 | ||||
-rw-r--r-- | window.py | 38 |
7 files changed, 174 insertions, 155 deletions
diff --git a/VisualMatchActivity.py b/VisualMatchActivity.py index df5e88e..99c749e 100644 --- a/VisualMatchActivity.py +++ b/VisualMatchActivity.py @@ -63,7 +63,6 @@ from StringIO import StringIO from constants import * from sprites import * import window -import gencards import grid import deck import card @@ -87,7 +86,6 @@ class VisualMatchActivity(activity.Activity): # Set things up. self._read_journal_data() datapath = self._find_datapath(_old_sugar_system) - gencards.generator(datapath, self._numberO, self._numberC) self._setup_toolbars(sugar86) canvas = self._setup_canvas(datapath) self._setup_presence_service() @@ -100,10 +98,10 @@ class VisualMatchActivity(activity.Activity): # # Button callbacks # - def _select_game_cb(self, button, activity, cardtype): + def _select_game_cb(self, button, activity, card_type): if self.vmw.joiner(): # joiner cannot change level return - activity.vmw.cardtype = cardtype + activity.vmw.card_type = card_type activity.vmw.new_game() def _robot_cb(self, button, activity): @@ -139,20 +137,14 @@ class VisualMatchActivity(activity.Activity): if activity.vmw.joiner(): # joiner cannot change decks return activity.vmw.numberO = numberO - gencards.generate_number_cards(activity.vmw.path, - activity.vmw.numberO, - activity.vmw.numberC) - activity.vmw.cardtype = 'number' + activity.vmw.card_type = 'number' activity.vmw.new_game() def _number_card_C_cb(self, button, activity, numberC): if activity.vmw.joiner(): # joiner cannot change decks return activity.vmw.numberC = numberC - gencards.generate_number_cards(activity.vmw.path, - activity.vmw.numberO, - activity.vmw.numberC) - activity.vmw.cardtype = 'number' + activity.vmw.card_type = 'number' activity.vmw.new_game() def _robot_time_spin_cb(self, button): @@ -175,7 +167,7 @@ class VisualMatchActivity(activity.Activity): try: # Try reading restored settings from the Journal. self._play_level = int(self.metadata['play_level']) self._robot_time = int(self.metadata['robot_time']) - self._cardtype = self.metadata['cardtype'] + self._card_type = self.metadata['cardtype'] self._low_score = [int(self.metadata['low_score_beginner']),\ int(self.metadata['low_score_expert'])] self._numberO = int(self.metadata['numberO']) @@ -187,7 +179,7 @@ class VisualMatchActivity(activity.Activity): except: # Otherwise, use default values. self._play_level = 0 self._robot_time = 60 - self._cardtype = 'pattern' + self._card_type = 'pattern' self._low_score = [-1,-1] self._numberO = PRODUCT self._numberC = HASH @@ -458,7 +450,7 @@ class VisualMatchActivity(activity.Activity): self.vmw = window.VisualMatchWindow(canvas, datapath, self) self.vmw.level = self._play_level - self.vmw.cardtype = self._cardtype + self.vmw.card_type = self._card_type self.vmw.robot = False self.vmw.robot_time = self._robot_time self.vmw.low_score = self._low_score @@ -482,7 +474,7 @@ class VisualMatchActivity(activity.Activity): self.metadata['robot_time'] = self.vmw.robot_time self.metadata['numberO'] = self.vmw.numberO self.metadata['numberC'] = self.vmw.numberC - self.metadata['cardtype'] = self.vmw.cardtype + self.metadata['cardtype'] = self.vmw.card_type self.metadata['matches'] = self.vmw.matches self.metadata['robot_matches'] = self.vmw.robot_matches self.metadata['total_time'] = int(self.vmw.total_time) @@ -650,15 +642,15 @@ class VisualMatchActivity(activity.Activity): self._send_event("P:" + str(self.vmw.level)) self._send_event("X:" + str(self.vmw.deck.index)) self._send_event("M:" + str(self.vmw.matches)) - self._send_event("C:" + self.vmw.cardtype) + self._send_event("C:" + self.vmw.card_type) self._send_event("D:" + str(self._dump())) elif text[0] == 'J': # Force a request for current state. self._send_event("j") self.waiting_for_deck = True elif text[0] == 'C': e,text = text.split(':') - _logger.debug("receiving cardtype from sharer " + text) - self.vmw.cardtype = text + _logger.debug("receiving card_type from sharer " + text) + self.vmw.card_type = text elif text[0] == 'P': e,text = text.split(':') _logger.debug("receiving play level from sharer " + text) @@ -32,14 +32,12 @@ from sprites import * # if shape == SELECTMASK then generate special card-selected overlay # class Card: - def __init__(self, sprites, path, cardtype, width, height, attributes): + def __init__(self, sprites, svg_string, attributes): if attributes[0] == SELECTMASK: - self.spr = Sprite(sprites, 0, 0, - self.load_image(path, "selected", width, height)) + self.spr = Sprite(sprites, 0, 0, svg_str_to_pixbuf(svg_string)) self.index = SELECTMASK elif attributes[0] == MATCHMASK: - self.spr = Sprite(sprites, 0, 0, - self.load_image(path, "match", width, height)) + self.spr = Sprite(sprites, 0, 0, svg_str_to_pixbuf(svg_string)) self.index = MATCHMASK else: self.shape = attributes[0] @@ -50,10 +48,7 @@ class Card: self.color*NUMBER*FILLS+\ self.num*FILLS+\ self.fill - self.spr = Sprite(sprites, 0, 0, - self.load_image(path, cardtype+"-"+\ - str(self.index), - width, height)) + self.spr = Sprite(sprites, 0, 0, svg_str_to_pixbuf(svg_string)) def show_card(self): self.spr.set_layer(2000) @@ -62,7 +57,12 @@ class Card: def hide_card(self): self.spr.hide() - def load_image(self, path, file, w, h): - return gtk.gdk.pixbuf_new_from_file_at_size( - os.path.join(path, file+".svg"), int(w), int(h)) - +# +# Load pixbuf from SVG string +# +def svg_str_to_pixbuf(svg_string): + pl = gtk.gdk.PixbufLoader('svg') + pl.write(svg_string) + pl.close() + pixbuf = pl.get_pixbuf() + return pixbuf @@ -19,12 +19,14 @@ import random from sprites import * from constants import * from card import * +from gencards import generate_pattern_card, generate_number_card, \ + generate_word_card # -# Class for defining deck of cards +# Class for defining deck of card # class Deck: - def __init__(self, sprites, path, cardtype, width, height, level=HIGH): + def __init__(self, sprites, card_type, numbers_type, scale, level=HIGH): # Create the deck of cards. self.cards = [] # If level is 'simple', only generate one fill type @@ -37,9 +39,23 @@ class Deck: for color in range(0, COLORS): for num in range(0, NUMBER): for fill in range(0, fill_range): - self.cards.append(Card(sprites, path, cardtype, - width, height, - [shape,color,num,fill])) + if card_type == 'pattern': + self.cards.append(Card(sprites, + generate_pattern_card( + shape,color,num,fill,scale), + [shape,color,num,fill])) + elif card_type == 'number': + self.cards.append(Card(sprites, + generate_number_card( + shape,color,num,fill, + numbers_type,scale), + [shape,color,num,fill])) + else: + self.cards.append(Card(sprites, + generate_word_card( + shape,color,num,fill,scale), + [shape,color,num,fill])) + # Remember the current position in the deck. self.index = 0 diff --git a/gencards.py b/gencards.py index 892275b..fd1e174 100644 --- a/gencards.py +++ b/gencards.py @@ -214,17 +214,18 @@ def svg_star(n, x, y, stroke, fill): def background(stroke,fill,width): return svg_rect(124.5,74.5,11,9,0.25,0.25,stroke,fill,width) -def header(stroke,fill,width): +def header(stroke,fill,width,scale): svg_string = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n" svg_string += "<!-- Created with Emacs -->\n" svg_string += "<svg\n" svg_string += " xmlns:svg=\"http://www.w3.org/2000/svg\"\n" svg_string += " xmlns=\"http://www.w3.org/2000/svg\"\n" svg_string += " version=\"1.0\"\n" - svg_string += " width=\"125\"\n" - svg_string += " height=\"75\">\n" + svg_string += "%s%f%s" % (" width=\"",125*scale,"\"\n") + svg_string += "%s%f%s" % (" height=\"",75*scale,"\">\n") + svg_string += "%s%f%s%f%s" % ("<g\n transform=\"matrix(",scale, + ",0,0,",scale,",0,0)\">\n") svg_string += background(stroke,fill,width) - svg_string += "<g>\n" return svg_string def footer(): @@ -484,37 +485,38 @@ def pattern_card(t, c, n, s): # # Card generators # -def generate_pattern_card(t,c,n,s): - svg_string = header(BLACK,color_pairs[c][1],0.5) +def generate_pattern_card(t,c,n,s,scale): + svg_string = header(BLACK,color_pairs[c][1],0.5,scale) svg_string += pattern_card(card_types[t],color_pairs[c],n+1,fill_styles[s]) svg_string += footer() return svg_string -def generate_number_card(t,c,n,s,mO,mC): +def generate_number_card(t,c,n,s,number_types,scale): stab = {0:5,1:7,2:11} methodO = [number_roman, number_product, number_chinese, number_word] methodC = [dots_in_a_line, dots_in_a_circle, points_in_a_star,\ number_hash, dice] methodX = number_arabic - svg_string = header(BLACK,color_pairs[c][1],0.5) + svg_string = header(BLACK,color_pairs[c][1],0.5,scale) svg_string += number_card(t,(n+1)*stab[s],color_pairs[c][0], - methodX,methodO[mO],methodC[mC]) + methodX,methodO[number_types[0]], + methodC[number_types[1]]) svg_string += footer() return svg_string -def generate_word_card(t,c,n,s): - svg_string = header(BLACK,color_pairs[c][1],0.5) +def generate_word_card(t,c,n,s,scale): + svg_string = header(BLACK,color_pairs[c][1],0.5,scale) svg_string += word_card(t,color_pairs[c],n,word_styles[s]) svg_string += footer() return svg_string -def generate_match_card(): - svg_string = header("#A0A0A0","#F0F0F0",3.0) +def generate_match_card(scale): + svg_string = header("#A0A0A0","#F0F0F0",3.0,scale) svg_string += footer() return svg_string -def generate_selected_card(): - svg_string = header(BLACK,"none",3.0) +def generate_selected_card(scale): + svg_string = header(BLACK,"none",3.0,scale) svg_string += footer() return svg_string @@ -526,7 +528,7 @@ def close_file(f): def generator(datapath,mO=PRODUCT,mC=HASH): generate_pattern_cards(datapath) - generate_number_cards(datapath,mO,mC) + generate_number_cards(datapath,[mO,mC]) generate_word_cards(datapath) generate_extras(datapath) @@ -538,11 +540,11 @@ def generate_pattern_cards(datapath): for s in range(3): filename = "pattern-%d.svg" % (i) f = open_file(datapath, filename) - f.write(generate_pattern_card(t,c,n,s)) + f.write(generate_pattern_card(t,c,n,s,1)) close_file(f) i += 1 -def generate_number_cards(datapath,mO,mC): +def generate_number_cards(datapath,number_types): i = 0 for t in range(3): for c in range(3): @@ -550,7 +552,7 @@ def generate_number_cards(datapath,mO,mC): for s in range(3): filename = "number-%d.svg" % (i) f = open_file(datapath, filename) - f.write(generate_number_card(t,c,n,s,mO,mC)) + f.write(generate_number_card(t,c,n,s,number_types,1)) close_file(f) i += 1 @@ -562,16 +564,16 @@ def generate_word_cards(datapath): for s in range(3): filename = "word-%d.svg" % (i) f = open_file(datapath, filename) - f.write(generate_word_card(t,c,n,s)) + f.write(generate_word_card(t,c,n,s,1)) close_file(f) i += 1 def generate_extras(datapath): f = open_file(datapath, "match.svg") - f.write(generate_match_card()) + f.write(generate_match_card(1)) close_file(f) f = open_file(datapath, "selected.svg") - f.write(generate_selected_card()) + f.write(generate_selected_card(1)) close_file(f) def main(): @@ -73,7 +73,6 @@ class Sprites: for spr in self.list: spr.draw() - # # A class for the individual sprites # @@ -83,11 +82,11 @@ class Sprite: self.x = x self.y = y self.layer = 100 - self.label = None - self.scale = 24 - self.rescale = True - self.horiz_align = "center" - self.vert_align = "middle" + self.labels = [] + self.scale = [24] + self.rescale = [True] + self.horiz_align = ["center"] + self.vert_align = ["middle"] self.fd = None self.color = None self.set_image(image) @@ -122,17 +121,27 @@ class Sprite: self.sprites.append_to_list(self) self.inval() - def set_label(self, label): - if type(label) is str or type(label) is unicode: - self.label = label.replace("\0"," ") # pango doesn't like nulls + def set_label(self, new_label, i=0): + self._extend_labels_array(i) + if type(new_label) is str or type(new_label) is unicode: + # pango doesn't like nulls + self.labels[i] = new_label.replace("\0"," ") else: - self.label = str(label) + self.labels[i] = str(new_label) if self.fd is None: self.fd = pango.FontDescription('Sans') if self.color is None: self.color = self.sprites.cm.alloc_color('black') self.inval() + def _extend_labels_array(self, i): + while len(self.labels) < i+1: + self.labels.append(" ") + self.scale.append(self.scale[0]) + self.rescale.append(self.rescale) + self.horiz_align.append(self.horiz_align[0]) + self.vert_align.append(self.vert_align[0]) + def set_label_font(self, font): self.fd = pango.FontDescription(font) @@ -140,11 +149,12 @@ class Sprite: self.color = self.sprites.cm.alloc_color(r, g, b) def set_label_attributes(self, scale, horiz_align="center", - vert_align="middle", rescale="True"): - self.scale = scale - self.horiz_align = horiz_align - self.vert_align = vert_align - self.rescale = rescale + vert_align="middle", rescale="True", i=0): + self._extend_labels_array(i) + self.scale[i] = scale + self.horiz_align[i] = horiz_align + self.vert_align[i] = vert_align + self.rescale[i] = rescale def hide(self): self.inval() @@ -161,7 +171,7 @@ class Sprite: else: self.sprites.area.draw_drawable( self.sprites.gc, self.image, 0, 0, self.x, self.y, -1, -1) - if self.label is not None: + if len(self.labels) > 0: self.draw_label() def hit(self, pos): @@ -177,38 +187,49 @@ class Sprite: return True def draw_label(self): - if self.label is None: - return - pl = self.sprites.canvas.create_pango_layout(self.label) - self.fd.set_size(int(self.scale*pango.SCALE)) - pl.set_font_description(self.fd) - w = pl.get_size()[0]/pango.SCALE - if w > self.width: - if self.rescale is True: - self.fd.set_size(int(self.scale*pango.SCALE*self.width/w)) - pl.set_font_description(self.fd) - w = pl.get_size()[0]/pango.SCALE - else: - i = len(self.label)-1 - while(w > self.width and i > 0): - label = "…"+self.label[len(self.label)-i:] - pl = self.sprites.canvas.create_pango_layout(label) - self.fd.set_size(int(self.scale*pango.SCALE)) + for i in range(len(self.labels)): + pl = self.sprites.canvas.create_pango_layout(self.labels[i]) + self.fd.set_size(int(self.scale[i]*pango.SCALE)) + pl.set_font_description(self.fd) + w = pl.get_size()[0]/pango.SCALE + if w > self.width: + if self.rescale[i] is True: + self.fd.set_size(int(self.scale*pango.SCALE*self.width/w)) pl.set_font_description(self.fd) - w = pl.get_size()[0]/pango.SCALE - i -= 1 - if self.horiz_align == "center": - x = int(self.x+(self.width-w)/2) - elif self.horiz_align == 'left': - x = self.x - else: # right - x = int(self.x+self.width-w) - h = pl.get_size()[1]/pango.SCALE - if self.vert_align == "middle": - y = int(self.y+(self.height-h)/2) - elif self.vert_align == "top": - y = self.y - else: # bottom - y = int(self.y+self.height-h) - self.sprites.gc.set_foreground(self.color) - self.sprites.area.draw_layout(self.sprites.gc, x, y, pl) + w = pl.get_size()[0]/pango.SCALE + else: + i = len(self.labels[i])-1 + while(w > self.width and i > 0): + pl = self.sprites.canvas.create_pango_layout( + "…"+self.labels[i][len(self.label[i])-i:]) + self.fd.set_size(int(self.scale[i]*pango.SCALE)) + pl.set_font_description(self.fd) + w = pl.get_size()[0]/pango.SCALE + i -= 1 + if self.horiz_align[i] == "center": + x = int(self.x+(self.width-w)/2) + elif self.horiz_align[i] == 'left': + x = self.x + else: # right + x = int(self.x+self.width-w) + h = pl.get_size()[1]/pango.SCALE + if self.vert_align[i] == "middle": + y = int(self.y+(self.height-h)/2) + elif self.vert_align[i] == "top": + y = self.y + else: # bottom + y = int(self.y+self.height-h) + self.sprites.gc.set_foreground(self.color) + self.sprites.area.draw_layout(self.sprites.gc, x, y, pl) + + def label_width(self): + max = 0 + for i in range(len(self.labels)): + print "i %d" % (i) + pl = self.sprites.canvas.create_pango_layout(self.labels[i]) + self.fd.set_size(int(self.scale[i]*pango.SCALE)) + pl.set_font_description(self.fd) + w = pl.get_size()[0]/pango.SCALE + if w > max: + max = w + return max diff --git a/visualmatch.py b/visualmatch.py index f0f8914..b41382e 100755 --- a/visualmatch.py +++ b/visualmatch.py @@ -2,23 +2,15 @@ #Copyright (c) 2009, Walter Bender -#Permission is hereby granted, free of charge, to any person obtaining a copy -#of this software and associated documentation files (the "Software"), to deal -#in the Software without restriction, including without limitation the rights -#to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -#copies of the Software, and to permit persons to whom the Software is -#furnished to do so, subject to the following conditions: - -#The above copyright notice and this permission notice shall be included in -#all copies or substantial portions of the Software. - -#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -#IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -#FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -#AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -#LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -#OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -#THE SOFTWARE. +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the +# Free Software Foundation, Inc., 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. import pygtk pygtk.require('2.0') @@ -45,9 +37,11 @@ class VisualMatchMain: _("Click on cards to create sets of three."))) self.win.connect("delete_event", lambda w,e: gtk.main_quit()) + ''' if not os.path.exists(os.path.join(os.path.abspath('.'), 'images')): os.mkdir(os.path.join(os.path.abspath('.'), 'images')) gencards.generator(os.path.join(os.path.abspath('.'), 'images')) + ''' menu0 = gtk.Menu() menu_items = gtk.MenuItem(_("Toggle level")) @@ -170,7 +164,7 @@ class VisualMatchMain: 'images/')) self.vmw.win = self.win self.vmw.activity = self - self.vmw.cardtype = 'pattern' + self.vmw.card_type = 'pattern' self.vmw.level = 1 self.vmw.robot = False self.vmw.robot_time = 60 @@ -203,7 +197,7 @@ class VisualMatchMain: self.win.set_title(title) def _new_game_cb(self, widget, game): - self.vmw.cardtype = game + self.vmw.card_type = game self.vmw.new_game() return True @@ -222,18 +216,12 @@ class VisualMatchMain: def _number_card_O_cb(self, widget, numberO): self.vmw.numberO = numberO - gencards.generate_number_cards(self.vmw.path, - self.vmw.numberO, - self.vmw.numberC) - self.vmw.cardtype = 'number' + self.vmw.card_type = 'number' self.vmw.new_game() def _number_card_C_cb(self, widget, numberC): self.vmw.numberC = numberC - gencards.generate_number_cards(self.vmw.path, - self.vmw.numberO, - self.vmw.numberC) - self.vmw.cardtype = 'number' + self.vmw.card_type = 'number' self.vmw.new_game() def main(): @@ -31,6 +31,7 @@ from grid import * from deck import * from card import * from sprites import * +from gencards import generate_selected_card, generate_match_card difficulty_level = [LOW,HIGH] @@ -57,9 +58,9 @@ class VisualMatchWindow(): self.canvas.connect("key_press_event", self._keypress_cb) self.width = gtk.gdk.screen_width() self.height = gtk.gdk.screen_height()-GRID_CELL_SIZE - _scale = 0.8 * self.height/(CARD_HEIGHT*5.5) - self.card_width = CARD_WIDTH*_scale - self.card_height = CARD_HEIGHT*_scale + self.scale = 0.8 * self.height/(CARD_HEIGHT*5.5) + self.card_width = CARD_WIDTH*self.scale + self.card_height = CARD_HEIGHT*self.scale self.sprites = Sprites(self.canvas) self.selected = [] self.match_display_area = [] @@ -74,18 +75,17 @@ class VisualMatchWindow(): if hasattr(self, 'deck'): self.deck.hide() - # The first time through, initialize the deck, grid, and overlays. + # The first time through, initialize the grid, and overlays. if not hasattr(self, 'grid'): self.grid = Grid(self.width, self.height, self.card_width, self.card_height) for i in range(0,3): - self.selected.append(Card(self.sprites, self.path, '', - self.card_width, self.card_height, + self.selected.append(Card(self.sprites, + generate_selected_card(self.scale), [SELECTMASK,0,0,0])) - self.match_display_area.append(Card(self.sprites, self.path, "", - self.card_width, - self.card_height, - [MATCHMASK,0,0,0])) + self.match_display_area.append(Card(self.sprites, + generate_match_card(self.scale), + [MATCHMASK,0,0,0])) self.grid.display_match(self.match_display_area[i].spr, i) self._unselect() @@ -93,8 +93,8 @@ class VisualMatchWindow(): # Restore saved state on resume or share. if saved_state is not None: _logger.debug("Restoring state: %s" % (str(saved_state))) - self.deck = Deck(self.sprites, self.path, self.cardtype, - self.card_width, self.card_height, + self.deck = Deck(self.sprites, self.card_type, + [self.numberO, self.numberC], self.scale, difficulty_level[self.level]) self.deck.hide() self.deck.index = deck_index @@ -107,9 +107,9 @@ class VisualMatchWindow(): saved_state[_deck_stop:_deck_stop+3*self.matches]) elif not self.joiner(): _logger.debug("Starting new game.") - self.deck = Deck(self.sprites, self.path, self.cardtype, - self.card_width, self.card_height, - difficulty_level[self.level]) + self.deck = Deck(self.sprites, self.card_type, + [self.numberO, self.numberC], self.scale, + difficulty_level[self.level]) self.deck.hide() self.deck.shuffle() self.grid.deal(self.deck) @@ -233,7 +233,7 @@ class VisualMatchWindow(): if self._match_check([self.deck.spr_to_card(self.clicked[0]), self.deck.spr_to_card(self.clicked[1]), self.deck.spr_to_card(self.clicked[2])], - self.cardtype): + self.card_type): # Stop the timer. if self.timeout_id is not None: @@ -405,7 +405,7 @@ class VisualMatchWindow(): cardarray = [self.grid.grid[i[0]],\ self.grid.grid[i[1]],\ self.grid.grid[i[2]]] - if self._match_check(cardarray, self.cardtype) is True: + if self._match_check(cardarray, self.card_type) is True: if robot_match is True: for j in range(3): self.clicked[j]=self.grid.grid[i[j]].spr @@ -417,7 +417,7 @@ class VisualMatchWindow(): # # For each attribute, either it is the same or different on every card. # - def _match_check(self, cardarray, cardtype): + def _match_check(self, cardarray, card_type): for a in cardarray: if a is None: return False @@ -431,7 +431,7 @@ class VisualMatchWindow(): if (cardarray[0].fill + cardarray[1].fill + cardarray[2].fill)%3 != 0: return False # Special case: only check number when shapes are the same - if cardtype == 'word': + if card_type == 'word': if cardarray[0].shape == cardarray[1].shape and \ cardarray[0].shape == cardarray[2].shape and \ (cardarray[0].num + cardarray[1].num + cardarray[2].num)%3 != 0: |