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
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. –
@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