2016-08-01 30 views
0

Ich habe ein Problem mit dem Funktionsumfang. Ich muss "cardTableLayout" aktualisieren, wenn die Schaltfläche "Verwerfen" gedrückt wird, nachdem die Evaluierungsfunktion aufgerufen wurde. Wie mache ich das? Ich weiß, dass dies ein KV-Layout-Sprachproblem ist. Ich bin mir nicht sicher, wie man 'cardTableLayout' von innen 'buttonClick_callback' referenziert. ' Python-Code Kivy aktualisiert ein Widget-Bild von außerhalb der Funktion, die das Layout aufruft

import sys 
from os import path, listdir 
from random import choice 
sys.path.append('libs') 
from good_deal import * 
from kivy.app import App 
from kivy.lang import Builder 
from kivy.uix.screenmanager import ScreenManager, Screen 
from kivy.uix.boxlayout import BoxLayout 
from kivy.uix.floatlayout import FloatLayout 
from kivy.core.audio import SoundLoader 
from kivy.uix.button import Button 
from kivy.uix.image import Image 
from kivy.uix.behaviors import ToggleButtonBehavior 
from kivy.clock import mainthread 
randomSong = choice(listdir('music')) 
backgroundMusic = SoundLoader.load(path.join('music', randomSong)) 
backgroundMusic.play() 
backgroundMusic.loop = True 
cardImagesGlobal = [] 
hand, deck = deal() 
class ScreenManagement(ScreenManager): pass 
class Card(ToggleButtonBehavior, Image): pass 
class GameButton(Button): pass 
def buttonClick_callback(self): 
    buttonClickSound = SoundLoader.load(path.join('sounds', 'buttonClick.ogg')) 
    buttonClickSound.play() 
    index = 0 
    for items in cardImagesGlobal: 
     if items.state == 'down': 
      hand.marked.append(index) 
      index += 1 
    discard(hand, deck) 
    evaluate(hand) 
class CardTableScreen(Screen): 
    @mainthread 
    def on_enter(self): 
     global cardImagesGlobal 
     cardImages = [] 
     self.ids['handType'].text = hand.type 
     index = 0 
     for items in hand.ordered: 
      cardImages.append(Card(source = hand.filenames[index])) 
      self.ids['handLayout'].add_widget(cardImages[index]) 
      index += 1 
     cardImagesGlobal = cardImages 
     discardButton = GameButton(text = 'DISCARD') 
     discardButton.bind(on_press = buttonClick_callback) 
     self.ids['cardTableLayout'].add_widget(discardButton) 
layoutFile = Builder.load_file('main.kv') 
class Main(App): 
    def build(self): 
     self.title = 'Good Deal Poker' 
     return layoutFile 
if __name__ == "__main__": 
    Main().run() 

kv Datei

ScreenManagement: 
    CardTableScreen: 
<Card>: 
    size_hint: (.95, .95) 
<GameButton>: 
    size_hint: (.20, .10) 
<CardTableScreen>: 
    name: 'cardTableScreen' 
    FloatLayout: 
     name: 'cardTableLayout' 
     id: cardTableLayout 
     canvas.before: 
      Color: 
       rgba: 0,.25,0,1 
      Rectangle: 
       pos: self.pos 
       size: self.size 
     Label: 
      name: 'handType' 
      id: handType 
      font_size: '20sp' 
      pos_hint: {'center_x':.5, 'center_y':.95} 
     BoxLayout: 
      size_hint: (1, .30) 
      pos_hint: {'center_x':.5, 'center_y':.75} 
      name: 'handLayout' 
      id: handLayout 
      orientation: 'horizontal' 
      canvas.before: 
       Color: 
        rgba: 0,.25,0,1 
       Rectangle: 
        pos: self.pos 
        size: self.size 

Antwort

0

Der Knopf wurde die cardTableLayout hinzugefügt. Beim Drücken führt es eine Funktion namens buttonClick_callback aus, die sich selbst als erster Parameter übergibt.

Dies ermöglicht die Bezugnahme auf cardTableLayout innerhalb der buttonClick_callback durch den Aufruf self.parent.

+0

Ich weiß, dass Self.parent mir Zugriff auf die Widgets in der übergeordneten Funktion geben sollte, aber ich kann immer noch nicht über die IDs oder Namen Schlüssel in der KV-Datei auf den Widget-Baum zugreifen. print (self.parent.ids) gibt '[]' zurück. Darüber hinaus tut self.parent.ask_update() nichts. auch nicht self.parent.do_layout(). Was ich tun muss, ist die Leinwand für jedes Widget im Layout zu aktualisieren. –

+0

@SteveHostetler Was wird in der Konsole geschrieben, wenn Sie 'print (self.parent)' oder 'print (self)' in 'buttonClick_callback' drücken? Ist das Ergebnis korrekt? Wenn dies der Fall ist, können Sie über die Kinderliste iterieren und ihre Namen anzeigen, z. B. 'name = [c.name für c in self.parent.children]'? – jligeza

0

Das Problem war in der Good_deal-Bibliothek, die importiert wurde. Die übergebenen Werte wurden nicht korrekt aktualisiert. Nach der Behebung wird die Arbeitsfläche korrekt aktualisiert.