Ale nie da się pytać o problem z kivy podając minimal bez kivy.
Tylko że Twój problem mógł mieć związek z kivy
, ale mógł też być całkiem od niego niezależny (co się okazało), bez minimal repo nikt nie mógł tego wiedzieć, chyba że by zgadywał.
Jeśli chcesz pomóc z kivy to miej kivy. I przecież to jest minimal. Mniej się nie da. Czy wy tego nie rozumiecie. Bo ja nie rozumiem tego pytania o minimal jeśli dodałem kod w wersji minimal.
Da się, i nawet Ci pokażę. I nie, to co Ty nie dostarczyłeś to nie było "minimal", dałeś nam kod w którym jest defekt (wołanie funkcji zawsze trzeciej), ale w kodzie który dostarczyłeś są też rzeczy niewymagane do jego reprodukcji (kivy, i inny niepotrzebny kod). Więc z definicji nie jest "minimal".
Lista kroków, "Jak zrobić minimal reproducible repo wg. TomRiddle":
- Bierzesz swój kod z pierwszego posta
- Wywalasz
import
y do kivy
z niego (oczywiście aplikacja przestaje działać, ale to nic)
- Wywalasz
lay=FloatLayout()
- Wywalasz
txt=TextInput(text='Radek',size_hint=(1,None))
- Wywalasz
runTouchApp(lay)
- Teraz, żeby zreprodukować zachowanie o którym mówisz (czyli że każdy przycisk woła zawsze trzecią funkcję) musimy dopisać "spoof"
Button
a - udawany przycisk
class Button:
def __init__(self):
self.on_release = None
def bind(self, on_release):
self.on_release = on_release
- Zamienię też
lay
na list
, żeby łatwo się dało wołać przyciski.
- Wywołam
on_release()
programatycznie
Wychodzi nam taki kod, trochę podobny do Twojego z początkowego postu, prawda?:
class Button:
def __init__(self, text, pos):
self.on_release = None
def bind(self, on_release: callable) -> None:
self.on_release = on_release
def f_nr1(a):
print('1')
def f_nr2(a):
print('2')
def f_nr3(a):
print('3')
lLst = [
['1', f_nr1, (100, 300)],
['2', f_nr2, (300, 100)],
['3', f_nr3, (400, 400)]
]
lay = []
for idx, elm in enumerate(lLst):
btn = Button(text=elm[0], pos=elm[2])
btn.bind(on_release=lambda *_: elm[1](True))
lay.append(btn)
lay[0].on_release()
lay[1].on_release()
lay[2].on_release()
I jak go włączysz, to widzimy w konsoli zachowanie o którym mówisz, czyli wołanie funkcji dla przycisku 0, 1 oraz dwa, daje nam zawsze trójki
C:\Users\Riddle\PycharmProjects\test> python .\file.py
3
3
3
I taki kod każdy może sobie wkleić w swojego pythona i uruchomić, bez żadnej dodatkowej biblioteki. Widać tutaj jasno żę problem nie leży w kivy
, i nigdy nie była potrzebna do rozwiązania tego problemu.
PS: Nie jest jeszcze "minimal", bo nadal tu są niepotrzebne rzeczy (jak enumarate()
, elm[0]
, pos=elm[2]
), mówiąc "niepotrzebne" mam na myśli niewymagane do reprodukcji buga, ale nie wadzą aż tak, bo można je bezproblemowo uruchomić na komputerze każdego kto ma pythona.