• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Python/Tkinter Problem z Aktualizacją Danych

Object Storage Arubacloud
+1 głos
430 wizyt
pytanie zadane 25 marca 2022 w Python przez Kubas23 Użytkownik (630 p.)
from tkinter import  *
import random
import time
class Piłka:

    def __init__(self, płótno, rakietka, kolor,):
        self.Punkty = Punkty
        self.płótno = płótno
        self.Rakietka = rakietka
        self.id = płótno.create_oval(10, 10, 25, 25, fill=kolor)
        self.płótno.move(self.id, 245, 100)
        początek = [-6, -5, -4, 4, 5, 6,]
        random.shuffle(początek)
        self.x = początek[0]
        self.y = -1
        self.wysokość_płótna = self.płótno.winfo_height()
        self.szerokość_płótna = self.płótno.winfo_width()
        self.upadek_na_ziemię = False 
    def trafienie_w_piłkę(self, pozycja):
            pozycja_rakietki = self.płótno.coords(self.Rakietka.id)
            if pozycja[2] >= pozycja_rakietki[0] and pozycja[0] <= pozycja_rakietki[2]:
                if pozycja[3] >= pozycja_rakietki[1] and pozycja[3] <= pozycja_rakietki[3]:
                    return True
                return False
    def rysuj(self):
        self.płótno.move(self.id, self.x, self.y)
        pozycja = self.płótno.coords(self.id)  
        if pozycja [1] <= 0:
            self.y = 1
        if pozycja [3] >= self.wysokość_płótna:
            self.upadek_na_ziemię = True
        if self.trafienie_w_piłkę(pozycja) == True:
            PunktyLabel = Label( text=self.Punkty)
            self.Punkty = self.Punkty + 1
            print(self.Punkty)
            if self.Punkty < 2:
                PunktyLabel.pack()
            self.y = random.randint(-8,-4)
        if pozycja[0] <= 0:
            self.x = 3
        if pozycja[2] >= self.szerokość_płótna:
            self.x = -3
        
    

class Rakietka:
    
    def __init__(self, płótno, kolor, ):
        self.płótno = płótno
        self.id = płótno.create_rectangle(0, 0, 100, 7, fill=kolor)
        self.płótno.move(self.id, 200, 375,)
        self.x = 0
        self.szerokość_płótna = self.płótno.winfo_width()
        self.płótno.bind_all('<KeyPress-Left>' , self.przesuń_w_lewo, )
        self.płótno.bind_all('<KeyPress-Right>', self.przesuń_w_prawo,  )
    def rysuj(self,):
        self.płótno.move(self.id, self.x, 0)
        pozycja = self.płótno.coords(self.id)
        if pozycja [0] <= 1:
            self.x = 0
        if pozycja[2] >= self.szerokość_płótna:
            self.x = -0 
    def przesuń_w_lewo(self, zdarzenie):
        self.x = -1.5
    def przesuń_w_prawo(self, zdarzenie):   
        self.x = 1.5
tk = Tk()
Punkty = 0
tk.title("Odibij Piłkę")
tk.resizable(0, 0)
tk.wm_attributes("-topmost", 1)
płótno = Canvas(tk, width=500, height=400, bd=0, highlightthickness=0)
płótno.pack()
tk.update()


Rakietka = Rakietka(płótno, 'aqua')
Piłka = Piłka(płótno, Rakietka, 'yellow')


while 1: 

    if Piłka.upadek_na_ziemię == True:
        from tkinter import *
        end = PhotoImage(file='D:\\KUBA\\Python\\Pong (Python Gra)\\end.png')
        płótno.create_image(150, 100, anchor=NW, image=end) 
    if Piłka.upadek_na_ziemię == False :
            Piłka.rysuj() 
            Rakietka.rysuj()     
    tk.update_idletasks()
    tk.update()
    time.sleep(0.01)
    płótno.configure(bg='black')
    

Mam problem z aktualizacją PunktyLabel, zmienna Punkty się zmienia ( sprawdziłem to komenda "print(Punkty)" )

Może mi ktoś wytłumaczyć dlaczego to nie działa ? chodzi dokładniej o ten kod:

 if self.trafienie_w_piłkę(pozycja) == True:
            PunktyLabel = Label( text=self.Punkty)
            self.Punkty = self.Punkty + 1
            print(self.Punkty)
            if self.Punkty < 2:
                PunktyLabel.pack()

 

1 odpowiedź

+3 głosów
odpowiedź 26 marca 2022 przez VBService Ekspert (253,120 p.)
edycja 26 marca 2022 przez VBService
 
Najlepsza

Musisz "zainicjować" label w "oknie" (linia 74), a później tylko robić "update" wartości w label-u (linia 35)

from tkinter import *
import random
import time

class Piłka:
 
    def __init__(self, płótno, rakietka, kolor,):
        self.Punkty = 0
        self.płótno = płótno
        self.Rakietka = rakietka
        self.id = płótno.create_oval(10, 10, 25, 25, fill=kolor)
        self.płótno.move(self.id, 245, 100)
        początek = [-6, -5, -4, 4, 5, 6,]
        random.shuffle(początek)
        self.x = początek[0]
        self.y = -1
        self.wysokość_płótna = self.płótno.winfo_height()
        self.szerokość_płótna = self.płótno.winfo_width()
        self.upadek_na_ziemię = False        
    def trafienie_w_piłkę(self, pozycja):
            pozycja_rakietki = self.płótno.coords(self.Rakietka.id)
            if pozycja[2] >= pozycja_rakietki[0] and pozycja[0] <= pozycja_rakietki[2]:
                if pozycja[3] >= pozycja_rakietki[1] and pozycja[3] <= pozycja_rakietki[3]:
                    return True
                return False
    def rysuj(self):
        self.płótno.move(self.id, self.x, self.y)
        pozycja = self.płótno.coords(self.id)  
        if pozycja [1] <= 0:
            self.y = 1
        if pozycja [3] >= self.wysokość_płótna:
            self.upadek_na_ziemię = True
        if self.trafienie_w_piłkę(pozycja) == True:            
            self.Punkty = self.Punkty + 1            
            PunktyLabel.config(text=self.Punkty)
            #print(self.Punkty)
            self.y = random.randint(-8,-4)
        if pozycja[0] <= 0:
            self.x = 3
        if pozycja[2] >= self.szerokość_płótna:
            self.x = -3
         
     
 
class Rakietka:
     
    def __init__(self, płótno, kolor, ):
        self.płótno = płótno
        self.id = płótno.create_rectangle(0, 0, 100, 7, fill=kolor)
        self.płótno.move(self.id, 200, 375,)
        self.x = 0
        self.szerokość_płótna = self.płótno.winfo_width()
        self.płótno.bind_all('<KeyPress-Left>' , self.przesuń_w_lewo, )
        self.płótno.bind_all('<KeyPress-Right>', self.przesuń_w_prawo,  )
    def rysuj(self,):
        self.płótno.move(self.id, self.x, 0)
        pozycja = self.płótno.coords(self.id)
        if pozycja [0] <= 1:
            self.x = 0
        if pozycja[2] >= self.szerokość_płótna:
            self.x = -0
    def przesuń_w_lewo(self, zdarzenie):
        self.x = -1.5
    def przesuń_w_prawo(self, zdarzenie):   
        self.x = 1.5
        
tk = Tk()
tk.title("Odibij Piłkę")
tk.resizable(0, 0)
tk.wm_attributes("-topmost", 1)
płótno = Canvas(tk, width=500, height=400, bd=0, highlightthickness=0)
płótno.pack()

PunktyLabel = Label(fg="black", text="0")
PunktyLabel.pack()

tk.update() 
 
Rakietka = Rakietka(płótno, 'aqua')
Piłka = Piłka(płótno, Rakietka, 'yellow')
 
while 1: 
 
    if Piłka.upadek_na_ziemię == True:
        from tkinter import *
        end = PhotoImage(file='D:\\KUBA\\Python\\Pong (Python Gra)\\end.png')
        płótno.create_image(150, 100, anchor=NW, image=end)
 
    if Piłka.upadek_na_ziemię == False :
        Piłka.rysuj() 
        Rakietka.rysuj() 
    
    tk.update_idletasks()
    tk.update()
    time.sleep(0.01)
    płótno.configure(bg='black')

 

1
komentarz 26 marca 2022 przez Kubas23 Użytkownik (630 p.)
Dziękuję bardzo :) !

Podobne pytania

0 głosów
1 odpowiedź 307 wizyt
0 głosów
1 odpowiedź 523 wizyt
pytanie zadane 1 stycznia 2021 w Python przez Hacker4300.exe Użytkownik (650 p.)
0 głosów
1 odpowiedź 287 wizyt
pytanie zadane 24 lutego 2023 w Python przez zygota Nowicjusz (140 p.)

92,555 zapytań

141,404 odpowiedzi

319,560 komentarzy

61,941 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...