• 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

Cloud VPS
0 głosów
337 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 (256,600 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 Mentor (354,120 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ź 654 wizyt
0 głosów
1 odpowiedź 465 wizyt
0 głosów
1 odpowiedź 342 wizyt

93,456 zapytań

142,451 odpowiedzi

322,721 komentarzy

62,837 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

Kursy INF.02 i INF.03
...