Text hervorheben (Python, Kivy)

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
sinusvonx
User
Beiträge: 6
Registriert: Freitag 9. April 2021, 13:55

Hallo,

Ich arbeite momentan an einem Kartenspiel mit Python und Kivy. Als letztes habe ich ein Hintergrundbild hinzugefügt. Allerdings lässt sich jetzt der Text nicht mehr so gut lesen.
Ich bräuchte dabei Hilfe, den Text irgendwie hervorzuheben. (Den Text, den ich meine, findet man in der kv-Datei bei "Label" oder in der AppVariables.py-Datei unter

Code: Alles auswählen

 return '{1} {0}'.format(cardRanks[rank-1], cardSuits[suit-1]) + " -> Aufgabe: "f"{the_task}"
.

Vielen Dank und beste Grüße!

Hier die Codes:

main.py:

Code: Alles auswählen

from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition
from kivy.properties import ObjectProperty
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.gridlayout import GridLayout
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.core.window import Window
from kivy.core.image import Image
from kivy.graphics import BorderImage
from kivy.graphics import Color, Rectangle
from kivy.uix.image import AsyncImage


from AppVariables import *




class ScreenOne(Screen):
    pass


class ScreenTwo(Screen):
    pass


class ScreenThree(Screen):
    pass




class Manager(ScreenManager):
    screen_one = ObjectProperty(None)
    screen_two = ObjectProperty(None)
    screen_three = ObjectProperty(None)



class Background(BoxLayout):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
    pass


class ScreensApp(App):


    def build(self):
        return Manager()

    def draw_card(self, *args):
        some_var = draw_a_card(self, args)
        print(some_var)
        self.root.screen_two.ids.mylabel.text = some_var


if __name__ == "__main__":
    ScreensApp().run()
screens.kv:

Code: Alles auswählen

#:kivy 1.11.0
#:import WipeTransition kivy.uix.screenmanager.WipeTransition



<Manager>:
    canvas.before:
        Rectangle:
            pos: self.pos
            size: self.size
            source: 'Jacky.jpg'

    transition: WipeTransition()

    screen_one: screen_one
    screen_two: screen_two
    screen_three: screen_three

    ScreenOne:
        id:screen_one
        name: "Screen1"
        text: "Okay!"

    ScreenTwo:
        id: screen_two
        name: "Screen2"

    ScreenThree:
        id: screen_three
        name: "Screen3"
        text: "Okay!"

<ScreenOne>:
    Button:
        text: "Wir wollen trinken!"
        on_press: root.manager.current = 'Screen2'
        size_hint: 0.3, 0.2
        pos_hint: {"x":0.35, "y":0.2}

<ScreenTwo>:
    Button:
        text: "Aufhören, ich bin voll!"
        on_press: root.manager.current = 'Screen3'
        size_hint: 0.3, 0.2
        pos_hint: {"x":0.35, "y":0.1}

    Button:
        text: "Karte ziehen"    # Draw Card
        on_press: app.draw_card()
        size_hint: 0.3, 0.2
        pos_hint: {"x":0.35, "y":0.3}

    Label:
        id: mylabel
        text: ""
        color: 1,0,0,1
        canvas.before:
            Color:
                rgba: 0, 0, 0, 1
        size_hint: 0.3, 0.2
        pos_hint: {"x":0.35, "y":0.6}

<ScreenThree>:
    Button:
        text: "Okay!"
        on_press: root.manager.current = 'Screen1'
AppVariables.py:

Code: Alles auswählen

from random import randint

# Global variables
cardSuits = ['PIK', 'HERZ', 'KARO', 'KREUZ']
courtCards = ['BUBE', 'DAME', 'KÖNIG']
cardRanks = ['ASS'] + ['{}'.format(x) for x in range(7, 11)] + courtCards
cardsDrawn = []
tasks = ["unused!", "Du musst 5 Schlücke trinken!", "Alle müssen 3 Schlücke trinken!", "Verteile 3 Schlücke!", "Derjenige, der am wenigsten getrunken hat, holt 3 Schlücke nach!", "Themenspiel und 3 Schlücke für den Verlierer!", "Alle Buben trinken 3 Schlücke!", "Alle Damen trinken 3 Schlücke!", "Wasserfall!"]

# Functions
def draw_a_card(self, *args):

    # Ein Skatdeck hat 32 Spielkarten
    if len(cardsDrawn) >= 32:
        print("\tcards_drawn=", sorted(cardsDrawn))
        return 'Alle Karten wurden ausgeteilt!'
    
    # Satz mit 32 Spielkarten; 8 von Herz, Kreuz, Karo und Pik
    suit = randint(1, 4)
    rank = randint(1, 8)
    card = '{0}-{1:02d}'.format(suit, rank)
    the_task = tasks[rank]

    if card not in cardsDrawn:
        cardsDrawn.append(card)
        return '{1} {0}'.format(cardRanks[rank-1], cardSuits[suit-1]) + " -> Aufgabe: "f"{the_task}"
        
        
    else:
        return draw_a_card(self, args)
Benutzeravatar
__blackjack__
User
Beiträge: 13006
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@sinusvonx: Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst. Das heisst insbesondere: keine globalen Variablen!

Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (PascalCase).

Die als erstes gezeigte Zeile geht wohl kaum umständlicher und undurchsichtiger. `format()` *und* ``+`` *und* f-Zeichenkettenliteral, und letzteres auch noch so komisch ”versteckt”. Und bei `format()` die Platzhalter in umgekehrter Reihenfolge eingefügt. WTF‽

Code: Alles auswählen

        return '{1} {0}'.format(cardRanks[rank-1], cardSuits[suit-1]) + " -> Aufgabe: "f"{the_task}"
        
        # =>
        
        return f"{cardSuits[suit-1]} {cardRanks[rank-1]} -> Aufgabe: {the_task}"
Wobei das alles immer noch nicht wirklich gut ist. Warum Zahlen zwischen 1 und irgendwas auswürfeln wenn man dann 1 davon abzieht? Da hätte man besser gleich zwischen 0 und irgendwas-1 ausgewürfelt, mit `randrange()` um sich das -1 da auch noch zu sparen. Aber letztlich ist das auswürfeln einer Zahl schon Unsinnig wenn man gar nicht die Zahl sondern ein zufälliges Element aus einer Liste haben möchte: `random.choice()`.

`draw_a_card()` sollte dieses unsinnige unbenutze `*args`-Argument nicht haben.

Rekursion ist kein Ersatz für Schleifen. Die Funktion sollte sich nicht selbst aufrufen. Das Vorgehen insgesamt ist auch inefffizient. Man würfelt nicht solange zufällige Karten aus bis man eine gefunden hat, die noch nicht gezogen wurde, sondern man erstellt am Anfang eine Liste mit allen Karten, mischt die, und entfernt dann einfach jedes mal eine mit `pop()`. Also so wie man das mit echten Karten auch machen würde.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
poldi
User
Beiträge: 20
Registriert: Sonntag 19. April 2020, 08:35

Wo gehört denn der Background hin? Wenn du ein kv file nutzt, solltest du auch dort beschreiben was passieren soll, dort kannst du auch beschreiben wie der Text im Label aussehen soll usw....
Antworten