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

Problem z Aktualizacja Textu Python/Tkinter

Object Storage Arubacloud
0 głosów
146 wizyt
pytanie zadane 24 marca 2022 w Python przez Kubas23 Użytkownik (630 p.)
edycja 25 marca 2022 przez Kubas23
from tkinter import *
import random
import time
Punkty = 0 

class Piłka:
    def __init__(self, płótno, rakietka, kolor):
        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):
        Punkty = 0
        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:
            Punkty = Punkty+1
            Punkty.config(tk, text=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()
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')
Punkty = Label(text=Punkty)
Punkty.pack()

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')

Chce Aby Label "Punkty" Ustawił tekst na zmienną "Punkty" po zetknięciu Piłki z Rakietką i zmienił wartość "Punkty" o 1.  Niestety wyskakuje błąd: "AttributeError: 'int' object has no attribute 'config' " Pomocy!

komentarz 24 marca 2022 przez VBService Ekspert (253,340 p.)
edycja 25 marca 2022 przez VBService

BTW, zamiast

end = PhotoImage(file='D:\\KUBA\\Python\\Pong (Python Gra)\\end.png')

 

zacznij korzystać ze "ścieżek względnych" (relative path)

komentarz 25 marca 2022 przez Kubas23 Użytkownik (630 p.)
edycja 25 marca 2022 przez Kubas23

Dzięki a masz pomysł co zrobić aby w tym kodzie aktualizował się label "PunktyLabel" ze zmienna Punkty?

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 =+ 1 + self.Punkty
            PunktyLabel.config(text=self.Punkty + 0)
            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')

Dokładniej chodzi o te część kodu w Piłka.rysuj :

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

 

1 odpowiedź

0 głosów
odpowiedź 24 marca 2022 przez adrian17 Ekspert (344,860 p.)

Masz jedną zmienną "Punkty" którą czasem używasz jako liczbę, a czasem jako label.

Punkty = Label()
Punkty = 0
# "Punkty" to teraz liczba
Punkty.config(tk, text=Punkty) # wiec to nie ma sensu

Więc zrób dwie osobne zmienne o różnych nazwach.

komentarz 24 marca 2022 przez Kubas23 Użytkownik (630 p.)

Dziękuje! Ale juz to odkryłem :) mam teraz inny problem otóż gdy rakietka odbije Piłkę PunktyLabel się nie aktualizuje czy mógłbyś mi pomóc?

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 =+ 1 + self.Punkty
            PunktyLabel.config(text=self.Punkty + 0)
            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')

 

Podobne pytania

+1 głos
1 odpowiedź 438 wizyt
0 głosów
1 odpowiedź 310 wizyt
0 głosów
1 odpowiedź 279 wizyt

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,959 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!

...