2017-01-17 7 views
0

, поэтому я и мои друзья пытались закодировать игру на киви, но мы застряли на этом этапе, мы не можем понять, как для изменения цвета или изображения кнопки, нажав другую. Игра на шахматной доске, мы пытаемся сделать игру Fox & Hound, поэтому идея заключается в том, что, когда пользователь нажимает «Собака», загораются 2 блока на шахматной доске, указывающие, куда вы можете двигаться, а затем, нажав одну из них, измените образ гончей на ту, которая была нажата.Kivy Программирование, как изменить цвет или изображение кнопки, нажав другую кнопку

Вот код, надеюсь, вы можете мне помочь, спасибо.

from kivy.app import App 
from kivy.graphics import * 
from kivy.uix.button import Button 
from kivy.uix.gridlayout import GridLayout 
from kivy.core.window import Window 
from kivy.uix.popup import Popup 
from kivy.app import App 
from kivy.uix.gridlayout import GridLayout 
from kivy.uix.label import Label 
from kivy.uix.textinput import TextInput 
from kivy.uix.button import Button 
from kivy.uix.boxlayout import BoxLayout 
from kivy.uix.stacklayout import StackLayout 
from kivy.clock import Clock 
from kivy.lang import Builder 
from kivy.config import Config 

Window.size = (800, 800) 

intento = 0 
nroboton= [0,0] 

class MainWindow(GridLayout): # main class 
    def popbtns(self): 
     i = 3 
     self.add_widget(Label(text=' ')) 
     self.add_widget(Btn(id=str(i+3), size=(100, 100), background_color=(0,0,0,1))) 
     i = i - 1 

class Btn(Button): # button class 
    def on_release(self): 
     print('self.pos= ' + str(self.id)) 
    def on_press(self): 
     global intento 
     if(intento == 1): 
      nroboton[1] = self.id 
      print('moviendose de ' + str(nroboton[0]) + 'a ' + str(nroboton[1])) 
      intento = 0 
     else: 
      nroboton[0] = self.id 
      intento = 1 
     print('llamada ssh ' + str(self.id)) 

class But(Button): 
    def new(self): 
     self.background_color=(0,250,0,1) 

class Zorro(Button): # button class 
    def on_release(self): 
     print('self.pos= ' + str(self.id)) 
    def on_press(self): 
     global intento 
     if(intento == 1): 
      nroboton[1] = self.id 
      print('moviendose de ' + str(nroboton[0]) + 'a ' + str(nroboton[1])) 
      intento = 0 
     else: 
      nroboton[0] = self.id 
      intento = 1 
     print('llamada ssh ' + str(self.id)) 

class MainApp(App): 

    def build(self): 

     main = MainWindow(cols=3, rows=1) 
     self.root = main # don't use global! 
     # make background 
     with main.canvas: 
      Rectangle(pos=main.pos, size=(10000,10000)) 

     # populate gridlayout with Buttons 
     #main.add_widget(Debug(text='debug', background_color=(1, 0, 0, 1))) 
     main.popbtns() 
     # print position of buttons... 
     Clock.schedule_once(self.delayed_function, 0.1) 

    def delayed_function(self, dt): 
     self.print_buttons_pos() 

    def print_buttons_pos(self): 
     for child in self.root.children: 
      print(str(child) + ' pos is ' + str(child.id)) 

if __name__ == "__main__": 
    MainApp().run() 

И вот изображение Гончих и Фокс. Hound Fox

Ok, так что это все, что я мог бы уменьшить его, надеюсь, что это помогает

+1

Пожалуйста, уменьшите это до [mcve]. Как есть, есть много дополнительной информации. А именно, вы должны просто иметь приложение kivy с двумя кнопками на нем. –

+0

Сделано! Или, по крайней мере, я попытался уменьшить его. –

+0

Все еще могло быть [* way * less.] (Https://gist.github.com/waynew/16818fc29de61d4f41118f5c3b6dea4e) –

ответ

0

Вот код, который показывает, как изменить цвет одной кнопки, нажав на другую кнопку.

Я использую свойство родительского окна ids, что, безусловно, является одним из лучших способов сделать это. Я оставил здесь кучу кода, но вы заметите, что я закончил удаление совсем немного, поскольку это не было частью MCVE.

from kivy.app import App 
from kivy.graphics import * 
from kivy.core.window import Window 
from kivy.uix.gridlayout import GridLayout 
from kivy.uix.button import Button 
from kivy.lang import Builder 

Window.size = (800, 800) 

intento = 0 
nroboton= [0,0] 

setup = ''' 
MyGame: 
    cols: 3 
    rows: 2 
    # This could have just been "Button" 
    # and it would work just fine, too. 
    Btn: 
     # This ID is only valid inside the .kv 
     # stuff, so we have to pass something 
     # else to the pressed/released handlers 
     id: hello_btn 
     text: 'Hello' 
     size: 100,100 
     # These lines are how to identify the 
     # button doing the pressing 
     on_press: root.was_pressed('hello') 
     on_release: root.was_released('hello') 
    Btn: 
     id: world_btn 
     text: 'World' 
     size: 100,100 
     on_press: root.was_pressed('world') 
     on_release: root.was_released('world') 
''' 

# I'm not using any of this code, you may want it 
# if you're trying to do something special with the 
# buttons you're creating. Otherwise just change 
# Btn to Button 
class Btn(Button): # button class 
    def on_release(self): 
     print('self.pos= ' + str(self.id)) 
    def on_press(self): 
     global intento 
     self.background_color = [1,1,1,1] 

     print('IDs: ', self.parent.ids) 
     if(intento == 1): 
      nroboton[1] = self.id 
      print('moviendose de ' + str(nroboton[0]) + 'a ' + str(nroboton[1]) 
      intento = 0 
     else: 
      nroboton[0] = self.id 
      intento = 1 
     print('llamada ssh ' + str(self.id)) 


class MyGame(GridLayout): 
    def was_pressed(self, name): 
     if name == 'hello': 
      btn = self.ids['world_btn'] 
     elif name == 'world': 
      btn = self.ids['hello_btn'] 
     btn.background_color = [255, 0, 0, 1] 

    def was_released(self, name): 
     if name == 'hello': 
      btn = self.ids['world_btn'] 
     elif name == 'world': 
      btn = self.ids['hello_btn'] 
     btn.background_color = [1, 1, 1, 1] 


class MainApp(App): 
    def build(self): 
     return Builder.load_string(setup) 

if __name__ == "__main__": 
    MainApp().run() 
+0

Большое вам спасибо, это было действительно полезно. –