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

python3 przekazywanie list przez partial()

Object Storage Arubacloud
0 głosów
268 wizyt
pytanie zadane 26 października 2019 w Python przez plebaniahobbitanow Początkujący (470 p.)

Witam jestem nowy w programowaniu w pythonie i podczas robienia swojego projektu natknąłem się na następujący problem. Chcę przekazać funkcji set_zmienne() tablicę var zeby ona przepisałą te wratości do zmeinnych V,mi,Kg,ro,Cv,Cp,omega_min,omega_max,v,c. jednak z jakiegoś powodu przekazywana jest tylko ostatnio zmieniona komurka tablicy var. Proszę bardzo o pomoc bo już się zaczynam poddawać

# !/usr/bin/python3
from tkinter import *
from functools import partial


_width=1200
_height=800
V=mi=Kg=ro=Cv=Cp=omega_min=omega_max=v=c=1
parametry_u=0

def set_zmienne(a, *b):
    print(b)
    #V,mi,Kg,ro,Cv,Cp,omega_min,omega_max,v,c=b
    #print(V)

class Parametry_ukladu:
    def __init__(self, master):
        self.master=master
        self.scale=[]
        self.var=[]
        self.pom=0
        for x in range(10):
            self.var.append(DoubleVar())
            self.scale.append(Scale( self.master, variable = self.var[x], from_=1, to=100, orient=HORIZONTAL, command=partial(set_zmienne, self.var)))
            print(self.var[x])            
            self.scale[x].pack(side=RIGHT)
        
root = Tk()
root.geometry(str(_width)+"x"+str(_height))

parametry_u = Parametry_ukladu(root)


root.mainloop()

PS. próbowałem też sprawdzić z poziomu metody w klasie zawartość tablicy var co też mi się nie udało...

1 odpowiedź

0 głosów
odpowiedź 26 października 2019 przez adrian17 Ekspert (344,860 p.)
wybrane 26 października 2019 przez plebaniahobbitanow
 
Najlepsza

jednak z jakiegoś powodu przekazywana jest tylko ostatnio zmieniona komurka tablicy var

Strzelam że nie zrozumiałeś co robi `partial`. Ja bym to jednak zapisał prościej, z lambda; wtedy to, co robisz, będzie znacznie jaśniejsze. Twój kod jest równoważny do:

command=lambda x: set_zmienne(self.var, x)

Drugi parametr jest "ostatnio zmienioną komórką" z definicji - bo tak naprawdę to jest po prostu wartość slidera, którego zmiana wywołała tą funkcję.

Ogólnie mam wrażenie że coś przekombinowanego robisz ;)

komentarz 26 października 2019 przez plebaniahobbitanow Początkujący (470 p.)

Ooo .get() to idealne rozwiązanie dzięki wielkie!!!

# !/usr/bin/python3
from tkinter import *



_width=1200
_height=800
V=mi=Kg=ro=Cv=Cp=omega_min=omega_max=v=c=1

parametry_u=0

def set_zmienne(scale, x):
    pom=[]    
    for i in range(len(scale)):
        pom.append(scale[i].get())
    V,mi,Kg,ro,Cv,Cp,omega_min,omega_max,v,c=pom
    print(pom)

class Parametry_ukladu:
    def __init__(self, master):
        self.master=master
        self.scale=[]
        self.var=[]
        self.pom=0
        for x in range(10):        
            self.var.append(DoubleVar())
            self.scale.append(Scale( self.master,  from_=1, to=100, orient=HORIZONTAL, command=lambda x: set_zmienne(self.scale, x)))         
            self.scale[x].pack(side=RIGHT)

root = Tk()
root.geometry(str(_width)+"x"+str(_height))

parametry_u = Parametry_ukladu(root)
root.mainloop()

 

komentarz 26 października 2019 przez adrian17 Ekspert (344,860 p.)
To... wciąż nie robi tego co chcesz, patrz punkt 2. wyżej.

(BTW, nie pisz pętl po range(len), to nie C :( )
komentarz 26 października 2019 przez plebaniahobbitanow Początkujący (470 p.)
Nie do końca rozumiem. Znaczy moim celem było zapisanie wartości z sliderów do odpowiednich zmiennych globalnych i tak się raczej stało. A co do range(len) to... faktycznie jestem programistą (dokładniej uczę się) c++ i jest to moje pierwsze starcie z pythonem wiec jak masz lepszą propozycję jak taką pętlę rozpisać to chętnie się czegoś dowiem.
komentarz 26 października 2019 przez adrian17 Ekspert (344,860 p.)

Znaczy moim celem było zapisanie wartości z sliderów do odpowiednich zmiennych globalnych i tak się raczej stało

A ja próbuję powiedzieć że takie podejście (i ogólnie zmienne globalne :P ) są złym i brzydkim podejściem zarówno w C++ie, jak i w Pythonie.

jak masz lepszą propozycję jak taką pętlę rozpisać

Prościej :P
 

for i in range(len(data)):
    # robisz cos z data[i]
for entry in data:
    # robisz cos z entry

 

komentarz 26 października 2019 przez plebaniahobbitanow Początkujący (470 p.)
znaczy co do pierwszego to zdecydowałem się na zmienne globalne bo nie chciało mi się w parametrze każdej funkcji biorącej w argumentach te dane pisać obiekt.atrybut a pętla faktycznie wygląda prościej :p

Podobne pytania

+1 głos
0 odpowiedzi 199 wizyt
pytanie zadane 21 czerwca 2023 w Python przez kacper1445 Gaduła (4,880 p.)
0 głosów
1 odpowiedź 289 wizyt
pytanie zadane 24 lutego 2023 w Python przez zygota Nowicjusz (140 p.)
0 głosów
0 odpowiedzi 88 wizyt

92,568 zapytań

141,422 odpowiedzi

319,638 komentarzy

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

...