2017-01-17 37 views
0

所以我和我的朋友一直在試圖編寫基於kivy的遊戲,但我們被困在這一點,我們無法弄清楚如何通過按另一個按鈕來更改按鈕的顏色或圖像。 遊戲是在一個棋盤上,我們正在嘗試做一個狐狸遊戲,所以這個想法是,當用戶按下獵犬時,棋盤上的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

好了,所以這是所有我可以減少它,希望它有助於

+1

請把它降低到[mcve]。事實上,有很多額外的信息。也就是說,你應該只有一個有兩個按鈕的kivy應用程序。 –

+0

完成!或者至少我試圖減少它。 –

+0

仍然可以[*方式*更小。](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

非常感謝,這真的很有幫助。 –

相關問題