Új hozzászólás Aktív témák

  • Lacces

    őstag

    Sziasztok!

    Ismét jelentkezem.

    Most egy GUI-s feladatot csináltam meg a könyv alapján. Egy kis vonatot rajzol ki, színezve a vagonok, ablakok, arcok.

    Első kérdésem, ami talán egyszerűbb:
    Tudtok benne kód rövidítést? Esetleg "szebb" kódot? Már kaptam jobb megoldásokat itt a fórumon.

    Második kérdésem:
    Van egy adott light() és egy light34(). Az előbbi az ablak színét feketéről sárgára változtatja. Az utóbbi, a 3. és 4. vagon ablakit változtatja meg.
    Ez ügyben a kérdésem: Hogyan lehet azt elérni, hogy, adott indexű ablakokat világítson csak meg?

    Próbálkoztam vele, de nem jött össze:

    light()-ot így módosítani, hogy kap egy index nevű paramétert, ha az f == index, akkor azt az f-et fogja csak módosítani.
    def light(self, index):
    "felkapcsolja a vagon belső világítását"
    for f in self.ablakIndex:
    if f==index:
    self.canvas_.itemconfigure(f, fill="yellow")

    def light34(self):
    "ablak színének megváltoztatása a 3.és 4. vagonban"
    self.v3.light(1)
    self.v4.light(2)

    És egy másik kérdés is érdekelne, hogyan lehetne, egyszerre több ablak indexét is átadni? Én tömbre gondoltam, vagy numerikus listára. És akkor az elágazás a for ciklusban így nézne ki (light metódusban)
    if f in numerikuslista
    Bár ezt sem tartom szép megoldásnak...

    Teljes, működő kód:
    # coding: iso-8859-2

    from Tkinter import *

    def circle(can,x,y,r, colour="white"):
    "a <can> vászon egy <r> sugarú kör rajza <x,y> pontban"
    can.create_oval(x-r, y-r, x+r, y+r, fill=colour) # kör rajzolása elipszisből

    class Application(Tk):
    def __init__(self):
    #Szülőosztály konstruktora:
    Tk.__init__(self)
    self.can=Canvas(self, width=475, height=130, bg="white")
    self.can.pack(side=TOP, padx=5, pady=5)
    Button(self, text="Train", command=self.rajzolas).pack(side=LEFT)
    Button(self, text="Hello", command=self.kineznek).pack(side=LEFT)
    Button(self, text="Világítás", command=self.light34).pack(side=LEFT)

    def rajzolas(self):
    "4 vasúti kocsi létrehozása vásznon"
    # a vasúti kocsikat a vagon osztályban vannak definiálva
    self.v1=vagon(self.can, 10, 30)
    self.v2=vagon(self.can, 130,30, "dark green")
    self.v3=vagon(self.can, 250,30, "maroon")
    self.v4=vagon(self.can, 370, 30, "purple")

    def kineznek(self):
    "személyek megjelenése bizonyos ablakokban"
    self.v1.perso(3) # 1.vagon, 3.ablak
    self.v3.perso(1) # 3.vagon, 1.ablak
    self.v3.perso(2) # 3.vagon, 2.ablak
    self.v4.perso(2) # 4.vagon, 1.ablak

    def light34(self):
    "ablak színének megváltoztatása a 3.és 4. vagonban"
    self.v3.light()
    self.v4.light()


    class vagon:
    # a paramétereket a rajzolás függvényben kapja
    # a kosntruktorhoz hozzáadtam a colour paramétert
    def __init__(self, canvas_, x, y, colour="navy"):
    "egy kis vagon rajza a <canvas> vásznon <x,y> pontban"
    # paraméterek tárolása példány-változókban
    self.canvas_, self.x, self.y=canvas_, x, y
    # alap téglalap rajzolása
    canvas_.create_rectangle(x,y, x+95, y+60, fill=colour)
    # 3 ablak 25x40 pixel, 5 pixel távolságra
    self.ablakIndex=[] # ablak hivatkozásainak tárolása egy lista
    for ablak in range(x+5, x+90, 30):
    #az ablak index-hez listához (hozzáfűzi) hozzáadja a következő canvas-okat.
    self.ablakIndex.append(canvas_.create_rectangle(ablak, y+5, ablak+25, y+40, fill="black"))
    # két 12 pixel sugarú kerék
    circle(canvas_, x+18, y+73, 12, "gray")
    circle(canvas_, x+77, y+73, 12, "gray")

    def perso(self, wind):
    "egy személy mejelenése a <wind> ablakban"
    # minden egyes ablak közepe koordinátájának a kiszámítása:
    xm=self.x+wind*30-12
    ym=self.y+25
    circle(self.canvas_, xm, ym, 10, "pink") #arc
    circle(self.canvas_, xm-5, ym-3, 2) #balszem
    circle(self.canvas_, xm+5, ym-3, 2) #jobszem
    circle(self.canvas_, xm, ym+5, 3) #száj

    def light(self):
    "felkapcsolja a vagon belső világítását"
    for f in self.ablakIndex:
    self.canvas_.itemconfigure(f, fill="yellow")

    Application().mainloop()

Új hozzászólás Aktív témák