kivy button text =""逻辑错误

时间:2014-06-27 20:22:52

标签: python python-3.x kivy

我是python和kivy的新手,我正在尝试通过制作一个小型的扫雷游戏来学习python,但是,我觉得下面的代码中的逻辑是正确的,但似乎无法正常工作:完整的文件如下:

from kivy.uix.button import Button
from kivy.uix.gridlayout import GridLayout
from kivy.uix.boxlayout import BoxLayout
import random

class spot(Button):
    '''
    classdocs
    '''
    def __init__(self, **kwargs):
        '''
        Constructor
        '''
        super(spot,self).__init__(**kwargs)
        self.ismine=False
        self.text="X"
        if 'id' in kwargs:
            self.id=kwargs['id']
        #else:
        #    self.text="X"    


class minesholder(GridLayout):

    def __init__(self,**kwargs):
        super(minesholder,self).__init__(**kwargs)

class game(BoxLayout):
    spots={}
    mines=[]

    def __init__(self,**kwargs):
        super(game,self).__init__(**kwargs)
        self.m=minesholder(rows=5, cols=5)
        self.add_widget(self.m)
        self.attachtogrid()

    def attachtogrid(self):
        self.m.clear_widgets()
        self.spots.clear()
        for r in range(0,5):
            for c in range(0,5):
                idd=str(r)+","+str(c)
                self.spots[idd]=idd
                s = spot(id=idd)
                self.m.add_widget(s)
                s.bind(on_press=self.spottouched)
                print(idd)
        self.createmines()

    def createmines(self):
        self.mines.clear()
        count=0
        while (count <= 10):
            c=str(random.randint(0,4))+','+str(random.randint(0,4))
            print(c)
            if self.mines.count(c)==0:
                self.mines.append(c)
                count+=1        

    def spottouched(self,spotted):        
        #if self.mines.count(str(spotted.id))==1:
        #    spotted.text="BOMB"
        #else: spotted.text=""
        for k in self.mines:
            if k==spotted.id: spotted.text="BOMB"
            else:
                spotted.text=""                

问题是最后4行,当我删除“spotted.text =”“”时,代码工作正常,但当我保留text =“”代码不再工作时,尽管有11个炸弹只有1个被检测到,没有文字=“”,所有炸弹都被正确检测到(text =“BOMB”有效)。

1 个答案:

答案 0 :(得分:1)

每次调用spottouched()时,您都会遍历每个矿井并相应地设置文本。但是,让我们说你有两枚炸弹 - 让我们召唤炸弹['bomb-a', 'bomb-b']

现在,您触摸ID为'bomb-a'的按钮。 spottouched()在地雷中循环。列表中的第一个矿井是'bomb-a' - 因此它将文本设置为"BOMB"。然后它循环 - 列表中的第二个矿井是'bomb-b',因此文本被设置回""。因此,唯一将显示"BOMB"文本的矿井是列表中的最后一个矿井。

尝试这样的事情:

def spottouched(self, spotted):
    spotted.text = "BOMB" if spotted.id in self.mines else ""