Kilka buttonow z inną wartoscia

0

Witam

Nie jestem zawodowym programistą, takie hobby raz na jakiś czas. No i teraz mnie naszło na kivy.

No a człek się uczy jak coś robi samemu.

No i mam problemik. Cos mi nawet wychodzilo jak robiłem labele, butony itd z pliku kv. Problemy zaczęły się gdy zaczołem te elementy tworzyc w pythonie.

A już całkiem się zaciąłem gdy chciałem zrobić button . Gdy robiłem tylko 1, wysyłałem nim 1 wartość i było ok. Ale gdy robiłem to w pętli, czyli robiłem kilka buttonow, to one wszystkie miały przypisana ostatnia i te sama wartość.

No i zastanawiam się czy mam błąd logiczny, a czy może czegoś nie wiem.

Dziękuję za porade

Jestem zielony z Oop, nigdy jakoś tego nie załapałem, to też prubuje w końcu zrozumieć. Pewnie cos tutaj namieszalem

0

a robie to tak :

class DomWindow(Screen):

    lokator = ""
    domID=""


    def MieszkanieEnter(self,id):
        sm.current = "mieszkanie"
        MieszkanieWindow.lokator=self.lokator
        MieszkanieWindow.mieszkanieID=id


    def on_enter(self, *args):
        MM=Fsql.Take_mieszkanie(self.domID,self.lokator)

        id,nazwa,mID,mmID,patent=MM
        G=Fsql.Check_Sett(id)
        StartY=0.69

        if G:
            for T in G:
                g=Button(pos_hint={'x':0.4,'y':StartY},text=T[1],size_hint=[0.2,0.05],)
                g.bind(on_press=lambda id:self.MieszkanieEnter(T[1]))
                self.add_widget(g)
                StartY+=0.05
0

Dziekuje za odpowiedz

Do tej pory wszystko robilem z wykorzystaniem FloatLayout , od tego zaczalem , no ale wszystkie butony byly wyswietlane jeden pod drugim , czyli wizualnie bylo ok.
w Fsql pobieralem warosci lokatora: teks , numery... z Sqllite, to dziala .
No ale jesli przypisuje np. nazwisko lub id do butona, nacisniecie dowolnego buttona powoduje wejscie do kranu ostatnoego lokatora z petli, tak jakby wszystkie buttony mialy przypisana te sama zmienna, czyli zawsze wchodze w Kowalskiego. ( nazwisko wyswietlam po wejsciu w lokatora no i zawsze ten sam)

pobawilem sie troche BoxLayout , layouty w layoutach, troche mam wiekszy balagan w kodzie Pythona, ale zawsze to cos nowego, pomysle moze cos zmienie.
ale logicznie podobnie jak wczesniej.

czy to jest poprawne:

g.bind(on_press=lambda id:self.MieszkanieEnter(T[1]))

czy to jakosn nie nadpisuje wszystkich poprzednich wartosci?

0

I sprubowalem, i nic mi nie dziala.I lambda i partial (bo takie podpowiedzi znalazlem na internecie).

A ja tylko chce za pomoca buttona wejsc do nowego screena i wyswietlic dane urzytkownika.
No nie spodziewalem sie problemow na takim poziomie, jizus, ale mam zaleglosci w tym moim hobby.

A moze jest jakis sposow zeby po prostu z listy uzytkownikow wejsc w uzytkownika na nowym screenie ?
moze ja za duzo kombinuje?

Dobra, cos mam bo "That's common problem" , nawet cos mi dziala, mam inny problem :) , ale to moje niogarniecie OOP, tak na razie podejrzewam.

nie to jednak brak self.clear_widgets() byl problemem, sam z soba gadam , no ale jakos idzie, musze chyba czesciej tego prubowac :)

0
class DomWindow(Screen):

    lokator = ""
    domID = ""

    def MieszkanieEnter(self, id):
        sm.current = "mieszkanie"
        MieszkanieWindow.lokator = self.lokator
        MieszkanieWindow.mieszkanieID = id

    def on_enter(self, *args):
        MM = Fsql.Take_mieszkanie(self.domID, self.lokator)

        id, nazwa, mID, mmID, patent = MM
        G = Fsql.Check_Sett(id)
        StartY = 0.69

        if G:
            for T in G:
                g = Button(pos_hint={'x': 0.4, 'y': StartY}, text=T[1], size_hint=[0.2, 0.05],)
                g.bind(on_press=lambda id=T[1]: self.MieszkanieEnter(id))
                self.add_widget(g)
                StartY += 0.05

Używając lambdy w bind, w momencie wywołania funkcji self.MieszkanieEnter(T[1]) lambdy przechwytują referencję do zmiennej T, a nie jej wartość w momencie utworzenia lambdy. Może to prowadzić do błędów, ponieważ wszystkie lambdy będą odwoływać się do ostatniej wartości przypisanej do T.

Aby rozwiązać ten problem, można przekazać T[1] jako domyślny argument do lambdy, co spowoduje związanie aktualnej wartości T[1] z lambdą. Tak podpowiada ChatGPT

0

Znalazlem odpowiedz :
https://stackoverflow.com/questions/60716992/kivy-all-dynamically-created-buttons-in-for-loop-return-the-same-argument?rq=2

czyli:

button_list = []
        if G:
            for T in G:
                button_list.append(Button(text=T[1] , on_release=lambda x, x=T[0]: self.OsadaEnter(x)))
                T2Bbox.add_widget(button_list[-1])

no i dziala :) jakos,

a co do tycj AI, to niestety programistom nie zazdroszcze, rok temu jak dawalem jakies proste zadania dla ChatGPT to za kazdym razem podawal troche inne cos, a zawisal po jakims czasie.
A ostatnio zapytalem tego z Windowsa, i zawsze dawal taka sama odpowiedz. Co mi troche pozwolilo zrozumiec OOP (no bo wiecie wszystkie tutoriale o zwierzetach albo samochodach ).

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.