Jak działa egzekucja funkcji w pętli while i aktualizacja labelów?

0

Witam, otóż zrobiłem taką funkcje

def fight():
   i = 1
   global var_fightLog
   currentHP = myChar.maxHP
   monsterHP = monsterBeta.maxHP
   while i > 0:
       dmgCharDone = random.uniform(1.0, 1.5) * myChar.DMG
       var_fightLog.set(f" Zadałeś {dmgCharDone}")
       time.sleep(1)
       monsterHP = monsterHP - dmgCharDone
       dmgMonsDone = random.uniform(1.0, 1.5) * monsterBeta.DMG
       var_fightLog.set(f" Monster zadał Ci {dmgMonsDone}")
       time.sleep(1)
       currentHP = currentHP - dmgMonsDone
       if monsterHP < 0:
           var_fightLog.set("wygrałeś")
           break

       if currentHP < 0:
           var.fightLog.set("przegrałeś")
           break
   i = i + 1

Efekt funkcji jest takowy, że wyskakuje tylko komunikat "wygrałeś". Ja natomiast chciałem, aby wyskakiwała swojego typu relacja z walki.
Myślałem, że pomoże time.sleep ale to tylko przedłuża czas wykonywania funkcji, a zmiana stringu za pomocą set jest tylko na końcu - efekt końcowy "wygrałeś" bądź "przegrałeś"
Wiem, że trochę, źle zastosowałem if, ale to później zmienię, chodzi mi natomiast o to, czemu ten set nie działa "live".
Funckja, jest przypisana to przycisku "fight"

fightButton=tk.Button(mainFrame)
fightButton.config(command=fight, text="go")
fightButton.grid(column=6, row=1, padx=(10,10))

Gdy klikam, przycisk pozostaje "wciśnięty" dopóki funkcja nie zostanie skończona. Ja chciałem, aby tylko raz się naciskało i przycisk "wrócił" do swojej normalnej pozycji.
pozostałe rzeczy, jeśli to za mało:

var_fightLog = tk.StringVar()
var_fightLog.set("")
logsLabel=tk.Label(characterFrame)
logsLabel.config(textvariable=var_fightLog, borderwidth=0)
logsLabel.grid(column=5, row=5, padx=(10, 10), pady=(10,10))
1

Nie wiem co to var_fightLog (jaki to styl, pomieszane underscore z Camel Case, takiego nie ma w Pythonie, a w ogóle gdzieś?, https://www.python.org/dev/peps/pep-0008/) i co robi metoda set. Ale widać, jak tylko zachodzi jeden z warunków, to następuje wydruk komunikatu, pętla zostaje przerwana i funkcja kończy działanie.

1

set nadpisuje każdorazowo zawartość zmiennej. Nadpisuje czyli zastępuje. Ostatni jest set z komunikatem o wygranej, dlatego tylko on się wyświetla.

0
lion137 napisał(a):

Nie wiem co to var_fightLog (jaki to styl, pomieszane underscore z Camel Case, takiego nie ma w Pythonie, a w ogóle gdzieś?, https://www.python.org/dev/peps/pep-0008/) i co robi metoda set. Ale widać, jak tylko zachodzi jeden z warunków, to następuje wydruk komunikatu, pętla zostaje przerwana i funkcja kończy działanie.

Jest to z tkintera, stosuje się go aktualizacji labelów.
Mam takiego oto widgeta:

logsLabel=tk.Label(characterFrame)
logsLabel.config(textvariable=var_fightLog, borderwidth=0)
logsLabel.grid(column=5, row=5, padx=(10, 10), pady=(10,10))

i chciałem, żeby aktualizował się na bieżąco.

Haskell napisał(a):

set nadpisuje każdorazowo zawartość zmiennej. Nadpisuje czyli zastępuje. Ostatni jest set z komunikatem o wygranej, dlatego tylko on się wyświetla.

Wiesz może, jak rozwiązać mój problem? Jakaś inna metoda?

1 użytkowników online, w tym zalogowanych: 0, gości: 1